Docker运行Python应用时logging模块无法生成本地日志文件
Docker挂载卷后日志文件未生成的排查与解决
问题背景
你用Python配置了定时轮转的日志处理器,代码如下:
import logging from logging.handlers import TimedRotatingFileHandler logger = logging.getLogger('Mainer') logger.setLevel(logging.INFO) format = "%(asctime)s - %(levelname)s - %(message)s" filename = "Reckon_APP.log" handle = TimedRotatingFileHandler(filename, when="midnight", interval=5) handler.setLevel(logging.WARN) formatter = logging.Formatter(format) handler.setFormatter(formatter) handler.suffix = "%Y-%m-%d-%H-%M-%S" logger.addHandler(handler)
然后用Docker卷映射本地桌面路径运行应用,命令是:
docker run -v /C/Users/DELL/Desktop:/Reckon_APP -p 80:80 --name my_APP My-Own-app
应用跑起来没报错,但本地桌面就是看不到日志文件。
排查要点与解决方法
1. 日志路径没指向挂载目录
你代码里写的filename = "Reckon_APP.log"是相对路径,容器默认工作目录不是/Reckon_APP,日志会写到容器内部的默认路径,不会同步到本地挂载的卷里。把文件名改成绝对路径就行:
filename = "/Reckon_APP/Reckon_APP.log"
2. 代码变量名写错了
创建处理器的时候你用的是handle = TimedRotatingFileHandler(...),但后面调用的是handler.setLevel(...),变量名不匹配等于白配置,handler根本没被加到logger里。把handle改成handler:
handler = TimedRotatingFileHandler(filename, when="midnight", interval=5)
3. 日志级别不匹配
你给logger设的是INFO级别,但handler设的是WARN级别,只有WARN及以上的日志才会被写入文件。如果你的应用只输出INFO级别的日志,自然不会生成文件。要么把handler的级别改成INFO,要么确保代码里有WARN及以上的日志输出:
handler.setLevel(logging.INFO)
4. 容器目录权限问题
挂载卷后,容器里的/Reckon_APP目录可能权限不够,导致应用创建不了文件。可以在Docker run命令里加上工作目录参数,确保应用在挂载目录下运行:
docker run -v /C/Users/DELL/Desktop:/Reckon_APP -w /Reckon_APP -p 80:80 --name my_APP My-Own-app
Windows环境下还要确认桌面路径有没有足够的读写权限,Linux/macOS可以加上用户参数避免权限问题:
docker run -v /C/Users/DELL/Desktop:/Reckon_APP -w /Reckon_APP --user $(id -u):$(id -g) -p 80:80 --name my_APP My-Own-app
修正后的完整代码
import logging from logging.handlers import TimedRotatingFileHandler logger = logging.getLogger('Mainer') logger.setLevel(logging.INFO) log_format = "%(asctime)s - %(levelname)s - %(message)s" # 指向挂载卷的绝对路径 filename = "/Reckon_APP/Reckon_APP.log" # 修正变量名 handler = TimedRotatingFileHandler(filename, when="midnight", interval=5) # 调整handler级别为INFO handler.setLevel(logging.INFO) formatter = logging.Formatter(log_format) handler.setFormatter(formatter) handler.suffix = "%Y-%m-%d-%H-%M-%S" logger.addHandler(handler) # 加两行测试日志,验证是否生成文件 logger.info("应用启动成功,测试INFO日志") logger.warn("测试WARN级别日志")
内容的提问来源于stack exchange,提问作者Rambo
相关产品推荐
相关产品推荐

