python - django+uwsgi 使用 TimedRotatingFileHandler "overwrites rotated log file"进行日志记录

标签 python django logging nginx uwsgi

我最近从 apache+mod_wsgi 切换了我的 django 生产网络应用程序至 nginx+uwsgiemperor mode .除了 Time Rotated 日志文件,其他一切都好。
我的 Web 应用程序使用名为 的日志文件appname.log 记录所有请求,并使用 apache 它在午夜旋转没有问题。

uwsgi该文件在午夜轮换,但一些 uwsgi 进程/worker 写入此轮换文件(示例轮换文件:appname.log.2017-01-08)而不是写入 appname.log , 这导致旋转的文件被覆盖 .

一个解决方案似乎是 接触 uwsgi .ini 文件 (我不完全确定......),但如果用户仍然连接到我的应用程序,我不想重新启动/重新加载 uwsgi。

我可以使用一种可能性或配置来通知所有 uwsgi 进程日志文件已更改,而无需重新启动 Web 应用程序?
如果可能的话,我的行为会与 apache+mod_wsgi 中的行为相同.

ConcurrentLogHandler , 太旧了,我不想使用 syslog 或 logrotate :)

有人有同样的问题吗?有人有建议吗?

谢谢

这是我的设置:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': '[%(asctime)s];[%(levelname)s];[Proc:%(process)d];[Thread:%(thread)d];%(module)s-%(funcName)s:%(lineno)d;Msg:%(message)s;'
        },
        'simple': {
            'format': '[%(asctime)s] [%(levelname)s] %(message)s'
        },
    },
    'filters': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse'
        }
    },
    'handlers': {
        'file': {
            'level': 'DEBUG',
            'class': 'logging.handlers.TimedRotatingFileHandler',
            'filename': LOG_FILE,
            'when': 'midnight',
            'interval': 1,
            'backupCount': 365,
            'formatter': 'verbose'
        },
        'null': {
            'level': 'DEBUG',
            'class': 'logging.NullHandler',
        },
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'verbose'
        },
        'mail_admins': {
            'level': 'ERROR',
            'class': 'django.utils.log.AdminEmailHandler',
            'filters': ['require_debug_false']
        }
    },
    'loggers': {
        APP_NAME: {
            'handlers': ['console', 'file'],
            'propagate': True,
            'level': 'INFO',
        },
        'django': {
            'handlers': ['mail_admins', 'file'],
            'level': 'ERROR',
            'propagate': True,
        },
    }

最佳答案

我们用nginx+gunicorn也遇到过同样的问题。我们有非常相似的设置:

LOGGING = {
    "version": 1,
    "disable_existing_loggers": False,
    "formatters": {
        "verbose": {"format": "%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s"},
        "simple": {"format": "%(levelname)s %(asctime)s  %(message)s", "datefmt": "%Y-%m-%d %H:%M"},
    },
    "filters": {
          "require_debug_true": {"()": "django.utils.log.RequireDebugTrue"},
          "require_debug_false": {"()": "django.utils.log.RequireDebugFalse"},
    },
    "handlers": {
        "logfile": {
            "class": "logging.handlers.TimedRotatingFileHandler",
            "when": "D",
            "interval": 10, 
            "backupCount": 100,
            "filename": LOG_FILE,
            "formatter": "simple",
            "level": "DEBUG",
        },
    },
    "loggers": {    
        APP_NAME: {
            "handlers": ["console", "plus_logfile"],
            "propagate": True,
            "level": "DEBUG",
        },
    },
}

根据 Python Logging Cookbook - Logging to a single file from multiple processes :

尽管日志记录是线程安全的,并且支持从单个进程中的多个线程记录到单个文件,但不支持从多个进程记录到单个文件,因为没有标准方法可以跨多个序列化对单个文件的访问Python 中的进程。如果您需要从多个进程登录到单个文件,一种方法是让所有进程登录到 SocketHandler,并有一个单独的进程来实现从套接字读取并记录到文件的套接字服务器。 (如果您愿意,可以在现有进程之一中指定一个线程来执行此功能。)

所以最好的方法是有一个套接字监听器,它可以同时监听多个 uwsgi 工作线程和日志。

设置如下所示:
"loggers": {    
    APP_NAME: {
        "handlers": ["console", "plus_logfile"],
        "propagate": True,
        "level": "DEBUG",
    },
}, 

您可以找到一个示例监听器代码 here .但是,此代码写入控制台。因此,如果要写入文件,则需要编辑监听器脚本。

关于python - django+uwsgi 使用 TimedRotatingFileHandler "overwrites rotated log file"进行日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41559260/

相关文章:

python - 从 python 中的模块导入变量会复制吗?

python - 在 Django admin 中添加内联多对多对象

python - "[Errno 13] Permission denied"仅在 Ubuntu 服务器上尝试更新/更改文档时

java - logback.xml 在普通 Java 项目中被忽略

python - 使用 API 而不是数据库的 Django 模型

python - 如何轻松编写带有变量的多行文件(python 2.6)?

python - 根据Python中的一系列开始日期复制行

python - View 中的 Django 过滤器

将堆栈跟踪参数打印到日志中的 PHP 函数

ubuntu - 为什么我可以编辑但不能附加 unix 文件