Django:无法配置处理程序“系统日志”

Posted

技术标签:

【中文标题】Django:无法配置处理程序“系统日志”【英文标题】:Django: Unable to configure handler 'syslog' 【发布时间】:2019-12-18 09:09:04 【问题描述】:

我从 django 项目制作 docker 映像,它开始产生我以前从未有过的错误。该错误似乎与日志记录有关,特别是 syslog。起初,我认为 docker 镜像中缺少 /dev/log 会产生错误。所以我在 docker 文件中添加了一行来创建 /dev/ 文件夹和 log 文件。但是,错误并没有消失。

这是错误日志。

 File "/usr/local/lib/python2.7/site-packages/django/utils/autoreload.py", line 228, in wrapper
fn(*args, **kwargs)
File "/usr/local/lib/python2.7/site-packages/django/core/management/commands/runserver.py", line 116, in inner_run
autoreload.raise_last_exception()
File "/usr/local/lib/python2.7/site-packages/django/utils/autoreload.py", line 251, in raise_last_exception
six.reraise(*_exception)
File "/usr/local/lib/python2.7/site-packages/django/utils/autoreload.py", line 228, in wrapper
fn(*args, **kwargs)
File "/usr/local/lib/python2.7/site-packages/django/__init__.py", line 22, in setup
configure_logging(settings.LOGGING_CONFIG, settings.LOGGING)
File "/usr/local/lib/python2.7/site-packages/django/utils/log.py", line 75, in configure_logging
logging_config_func(logging_settings)
File "/usr/local/lib/python2.7/logging/config.py", line 794, in dictConfig
dictConfigClass(config).configure()
File "/usr/local/lib/python2.7/logging/config.py", line 576, in configure
'%r: %s' % (name, e))
ValueError: Unable to configure handler 'syslog': [Errno 2] No such file or directory

这是记录相关设置。

LOGGING = 
'version': 1,
'disable_existing_loggers': False,
'handlers': 
    'mail_admins': 
        'level': 'ERROR',
        'class': 'django.utils.log.AdminEmailHandler'
    ,
    'syslog': 
        'level': 'DEBUG',
        'class': 'logging.handlers.SysLogHandler',
        'facility': 'user',
        'address': '/dev/log',
    ,
    'null': 
        'level': 'DEBUG',
        'class': 'logging.NullHandler',
    ,
    'stream': 
        'level': 'INFO',
        'class': 'logging.StreamHandler'
    ,
,
'loggers': 
    'root': 
        'handlers': ['syslog', 'mail_admins'],
        'level': 'ERROR',
    ,
    'SocialAuth': 
        'handlers': ['mail_admins'],
        'level': 'WARN',
    ,
    'django': 
        'handlers': ['syslog', 'mail_admins'],
        'level': 'ERROR',
    ,
 

我创建了文件夹和路径/dev/log,但似乎这不是问题。

【问题讨论】:

/dev/log 需要是 UNIX 域套接字。如果需要,您可以通过ncnc -lU /dev/log(或 Python 为 socket.AF_UNIX)创建一个。 @heemayl 我通过运行此命令mkdir /devtouch /dev/log 添加了/dev/log,现在错误消息已更改,显示为connection refused. 那是因为您创建了一个目录,它不是一个套接字——因此与它的连接按预期被拒绝。像我展示的那样创建一个 UNIX 套接字。 @heemayl 我运行了命令,但它显示nc: invalid option -- 'U' nc -h for help 【参考方案1】:

第一个问题是你的文件系统中没有/dev/log/dev 通常挂载为tmpfs,而不是作为驱动器支持的 FS)。

下一个问题是 SysLogHandler (logging.handlers.SysLogHandler) 要求 address 是 UNIX 域套接字,而不是其他任何东西。因此,您需要创建一个 UNIX 套接字 /dev/log 并在 Django 中传递地址 SysLogHandler


如果您的版本支持-U 选项,您可以通过nc (netcat) 创建一个UNIX 域sokcet:

nc -lU /dev/log

或者您可以直接在 Python 中创建套接字创建,将地址族称为AF_UNIX

import sokcet

sock = socket.socket(socket.AF_UNIX)
sock.bind('/dev/log')

在创建容器时,上述任何内容都可以作为Dockerfile/docker-compose.yml 中的命令。

【讨论】:

以上是关于Django:无法配置处理程序“系统日志”的主要内容,如果未能解决你的问题,请参考以下文章

专业的力量 海量日志监控平台(Spark Streaming,实时流式处理系统)

ELK 日志分析系统

ELK日志分析系统搭建配置

用Django+Oracle编写的告警监控和日志查询系统

linux的日志管理

原版Filebeat+ELK