RHEL环境下Docker中Django无法写入/opt目录日志问题求助
解决Docker中Django日志文件未生成的问题
1. 确认LOGGING配置是否完整关联处理器
仅定义file处理器还不够,必须在日志器(loggers)中关联该处理器,否则日志不会输出到文件。检查你的完整LOGGING配置是否包含类似内容:
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'simple': { 'format': '%(levelname)s %(asctime)s %(message)s' }, }, 'handlers': { 'file': { 'class': 'logging.FileHandler', 'filename': '/opt/tejcli/release/log/temp.log', 'formatter': 'simple', }, }, 'loggers': { # 根日志器,关联file处理器 '': { 'handlers': ['file'], 'level': 'INFO', # 级别需低于或等于代码中日志调用的级别 'propagate': True, }, # 或指定Django专属日志器 'django': { 'handlers': ['file'], 'level': 'INFO', 'propagate': False, }, }, }
2. 检查容器内目录的权限
手动创建目录后,容器内Django进程的运行用户可能没有写入权限:
- 进入容器查看目录权限:
docker exec -it <容器ID/名称> bash ls -ld /opt/tejcli/release/log - 查看Django进程的运行用户:
ps aux | grep django - 权限不足时修改目录归属或权限:
chown -R <运行用户>:<用户组> /opt/tejcli/release/log # 生产环境不推荐临时放宽权限,仅用于排查:chmod -R 777 /opt/tejcli/release/log
3. 验证日志级别是否匹配
如果日志器设置的级别是WARNING,但代码中仅调用logger.info()或logger.debug(),日志不会写入文件。检查代码中的日志调用:
import logging logger = logging.getLogger(__name__) # 确保调用级别不低于LOGGING配置的级别 logger.info("测试日志内容") # 若日志器级别为INFO则会输出
4. 排查Docker挂载是否覆盖目录
如果Docker启动命令或docker-compose.yml中,将宿主机目录挂载到/opt/tejcli/release/log,可能覆盖容器内目录导致权限或路径异常。检查挂载配置:
# docker-compose.yml示例,确认是否存在冲突挂载 volumes: - ./host_log:/opt/tejcli/release/log
若有挂载,需确保宿主机./host_log目录权限正确。
5. 确认Django加载了正确的配置文件
确保应用启动时加载的是包含该LOGGING配置的defaults.py:
- 启动命令指定配置模块:
python manage.py runserver --settings=your_project.settings.defaults - 或通过容器环境变量设置:
ENV DJANGO_SETTINGS_MODULE=your_project.settings.defaults
6. 容器内直接测试日志写入
在容器内运行简单脚本,验证路径和权限是否正常:
# 容器内创建test_log.py并运行 import logging from logging.handlers import FileHandler handler = FileHandler('/opt/tejcli/release/log/test_temp.log') logger = logging.getLogger('test') logger.addHandler(handler) logger.setLevel(logging.INFO) logger.info("测试容器内日志写入")
若脚本能生成日志文件,说明问题出在Django配置或日志器关联;若失败,则是容器内路径或权限问题。
内容的提问来源于stack exchange,提问作者Franticsword546
相关产品推荐
相关产品推荐

