Django:无法配置处理程序“系统日志" [英] Django: Unable to configure handler 'syslog'

查看:41
本文介绍了Django:无法配置处理程序“系统日志"的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I make docker image from django project, and it started to create error that I never had before. The error is seems like related to logging, specifically syslog. At first, I thought that missing /dev/log in docker image creates an error. So I added line to docker file to create /dev/ folder and log file. However, The error did not disappear.

这是错误日志.

 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,但似乎这不是问题.

I created folder and path /dev/log, but seems like that is not the problem.

推荐答案

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

The first problem is that there is no /dev/log in your filesystem (/dev is usually mounted as a tmpfs, not as a drive-backed FS).

下一个问题是 SysLogHandler (logging.handlers.SysLogHandler) 要求 address 是一个 UNIX 域套接字,不是别的.因此,您需要创建一个 UNIX 套接字 /dev/log 并在 Django SysLogHandler 中传递地址.

And the next issue is that that the SysLogHandler (logging.handlers.SysLogHandler) requires the address to be a UNIX domain socket, not anything else. So, you need to create a UNIX socket /dev/log and pass on the address in Django SysLogHandler.

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

You can create a UNIX domain sokcet via nc (netcat), if your version supports the -U option:

nc -lU /dev/log

或者您可以直接在 Python 中创建套接字 create 并提及地址族为 AF_UNIX:

Or you can create the socket create directly in Python mentioning the address family as AF_UNIX:

import sokcet

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

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

And any of the above can go as a command in Dockerfile/docker-compose.yml while creating your container.

这篇关于Django:无法配置处理程序“系统日志"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆