python - 多个处理器记录到同一个旋转文件

标签 python django logging uwsgi

我的 nginx+uwsgi+django 站点出现问题。 我知道 django+uwsgi 没什么特别的,应该是日志模块本身的东西。

在我的站点中,我使用 RotatingFileHandler 来记录特殊条目,但是,当 uwsgi 与多个工作处理器一起运行时,今天我发现, 多个日志文件同时更改。例如,这里是文件片段:

[root@speed logs]# ls -lth
total 18M
-rw-rw-rw- 1 root root  2.1M Sep 14 19:44 backend.log.7
-rw-rw-rw- 1 root root  1.3M Sep 14 19:43 backend.log.6
-rw-rw-rw- 1 root root  738K Sep 14 19:43 backend.log.3
-rw-rw-rw- 1 root root  554K Sep 14 19:43 backend.log.1
-rw-rw-rw- 1 root root 1013K Sep 14 19:42 backend.log.4
-rw-rw-rw- 1 root root  837K Sep 14 19:41 backend.log.5
-rw-rw-rw- 1 root root  650K Sep 14 19:40 backend.log.2
-rw-rw-rw- 1 root root  656K Sep 14 19:40 backend.log
-rw-r--r-- 1 root root   10M Sep 13 10:11 backend.log.8
-rw-r--r-- 1 root root     0 Aug 21 15:53 general.log
[root@speed-app logs]#

实际上,我将旋转文件设置为每个文件 10M,最多 10 个文件。

我在谷歌上搜索了很多,之前很多人都点击过这个,看来日志模块本身不支持这个。

我发现有人提到了 ConcurrentLogHandler( https://pypi.python.org/pypi/ConcurrentLogHandler/0.9.1 )。 以前有人用过这个人吗?看到是基于文件锁的,不知道这哥们的表现好不好。

或者谁有更好的主意将多个 uwsig 实例记录到同一个旋转文件?

谢谢。 卫斯理

最佳答案

仅供引用,这里是一个完整的解决方案示例,它使用 python StreamHandler、uWSGI“守护进程文件日志记录”和 logrotate 守护进程以轮换方式记录到文件。

正如您将看到的,uWSGI 日志记录从您的应用程序捕获 stdout/stderr,并将其重定向到 stdout/stderr(默认情况下)或定义的其他记录器/处理程序。

设置Django/uWSGI

你的 Django settings.py

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'default': {
            'format': '%(asctime)s - %(process)s - %(levelname)s - %(name)s : %(message)s',
        },
    },
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
        },
    },
    'root': {
        'handlers': ['console'],
        'level': 'DEBUG',
    },
}

代码中的某处

log = logging.getLogger(__name__)
log.info("test log!")

使用一些日志参数运行uWSGI

$ uwsgi --http :9090 --chdir=`pwd -P` --wsgi-file=wsgi.py \
    --daemonize=test.log \  # daemonize AND set log file
    --log-maxsize=10000  \  # a 10k file rotate
    --workers=4             # start 4 workers

输出

测试日志摘录

*** uWSGI is running in multiple interpreter mode ***
spawned uWSGI master process (pid: 79755)
spawned uWSGI worker 1 (pid: 79813, cores: 1)
spawned uWSGI worker 2 (pid: 79814, cores: 1)
spawned uWSGI worker 3 (pid: 79815, cores: 1)
spawned uWSGI worker 4 (pid: 79816, cores: 1)
spawned uWSGI http 1 (pid: 79817)
2015-10-12 07:55:48,458 - 79816 - INFO - testapp.views : test log!
2015-10-12 07:55:51,440 - 79813 - INFO - testapp.views : test log!
2015-10-12 07:55:51,965 - 79814 - INFO - testapp.views : test log!
2015-10-12 07:55:52,810 - 79815 - INFO - testapp.views : test log!

在同一个目录中,过了一会儿:

-rw-r-----   1 big  staff   1.0K Oct 12 09:56 test.log
-rw-r-----   1 big  staff    11K Oct 12 09:55 test.log.1444636554

对数旋转

或者,要自己处理文件旋转,省略 --log-maxsize 参数并使用 logrotate 配置文件 (/etc/logrotate.d/uwsgi-test-app):

/home/demo/test_django/*log {
    rotate 10
    size 10k
    daily
    compress
    delaycompress
}

请注意,以上值仅供引用,您可能不希望旋转大小为 10k。有关 logrotate 格式的更多信息,请参阅 an example blog post .

关于python - 多个处理器记录到同一个旋转文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32564472/

相关文章:

python - DRF - 为当前用户创建一个资源别名/我

logging - 如何将日志消息添加到将出现在 nant 构建执行中的 NUnit 测试?

java - log4j v2 格式化功能

python - 如何将单个 apache 日志条目解析为 python 对象

python - 在 Flask 中,为什么这个 hello world 应用程序可以运行?

python - 混合使用 UTF-8 和 ASCII 编码?

python - 如何在 python-rq 中的计划作业和排队作业之间创建 `` dependent_on`` 关系

android - Volley 请求不适用于 Django session

python - 定义内部带有变量的 lambda 函数时,如何防止变量更改时函数发生变化?

python - 当我尝试通过 recapcha 验证我的信息时,为什么会出现此值错误?