如何使用 Django 和 Gunicorn 记录到文件?使用 TimedRotatingFileHandler 会丢失日志
How to log to file using Django and Gunicorn? Using TimedRotatingFileHandler misses logs
我有一个使用 TimedRotatingFileHandler 记录信息的 Django 应用程序。在工作正常的开发服务器中,但是当 运行 在生产环境中使用 gunicorn 时,并不是所有的日志行都会进入文件。我还使用了一个正确记录所有内容的控制台处理程序,看起来 TimedRotatingFileHandler 使用的文件只有其中一些行,并且删除了控制台记录器中出现的很多内容。
它还表现出另一种奇怪的行为;我的日志记录 dictConfig 有午夜轮换。我期望的是 mylog.log 被写入到午夜,然后将内容旋转到 mylog.log。文件。这是在 Django 附带的开发服务器中 运行ning 时的行为。当 运行 将我的应用程序与 gunicorn 连接时会发生什么,它会连续写入 mylog.log 文件和 mylog.log.2022-02-01 文件。 mylog.log 中的内容也不会出现在其他文件中。几乎就好像全天在 mylog.log 和 mylog.log.2022-02-01 之间分发日志...
我的配置:
'handlers': {
'console': {
'level': 'INFO',
'formatter': 'verbose',
'class': 'logging.StreamHandler',
},
'file': {
'level': 'INFO',
'formatter': 'verbose',
'filename': mylog.log,
'when': 'midnight',
'encoding': 'utf-8',
'backupCount': 7,
'class': 'logging.handlers.TimedRotatingFileHandler',
},
},
'loggers': {
'': {
'handlers': ['console', 'file'],
'level': level,
},
},
问题是由于 gunicorn worker 运行 在不同的进程中并且 TimedRotatingFileHandler 不适用于多处理吗?或者配置错误?
在 Django 中的请求处理程序中,当应用程序 运行ning 在 gunicorn 上时,记录到文件的“标准”或建议方法是什么?
可能是因为Python不支持多个进程写入一个文件之间的协调,所以东西可能会被覆盖。我会为所有 Django 和您的 webapp 模块使用 SocketHandler
或 QueueHandler
,并有一个单独的进程侦听{套接字接收器或 QueueListener
)写入 TimedRotatingFileHandler
。官方文档has a cookbook which shows recipes for the multiple process scenario, including working code for socket receivers etc. which you can adapt to your specific needs. I use Supervisor保持监听进程运行.
我有一个使用 TimedRotatingFileHandler 记录信息的 Django 应用程序。在工作正常的开发服务器中,但是当 运行 在生产环境中使用 gunicorn 时,并不是所有的日志行都会进入文件。我还使用了一个正确记录所有内容的控制台处理程序,看起来 TimedRotatingFileHandler 使用的文件只有其中一些行,并且删除了控制台记录器中出现的很多内容。
它还表现出另一种奇怪的行为;我的日志记录 dictConfig 有午夜轮换。我期望的是 mylog.log 被写入到午夜,然后将内容旋转到 mylog.log。文件。这是在 Django 附带的开发服务器中 运行ning 时的行为。当 运行 将我的应用程序与 gunicorn 连接时会发生什么,它会连续写入 mylog.log 文件和 mylog.log.2022-02-01 文件。 mylog.log 中的内容也不会出现在其他文件中。几乎就好像全天在 mylog.log 和 mylog.log.2022-02-01 之间分发日志...
我的配置:
'handlers': {
'console': {
'level': 'INFO',
'formatter': 'verbose',
'class': 'logging.StreamHandler',
},
'file': {
'level': 'INFO',
'formatter': 'verbose',
'filename': mylog.log,
'when': 'midnight',
'encoding': 'utf-8',
'backupCount': 7,
'class': 'logging.handlers.TimedRotatingFileHandler',
},
},
'loggers': {
'': {
'handlers': ['console', 'file'],
'level': level,
},
},
问题是由于 gunicorn worker 运行 在不同的进程中并且 TimedRotatingFileHandler 不适用于多处理吗?或者配置错误?
在 Django 中的请求处理程序中,当应用程序 运行ning 在 gunicorn 上时,记录到文件的“标准”或建议方法是什么?
可能是因为Python不支持多个进程写入一个文件之间的协调,所以东西可能会被覆盖。我会为所有 Django 和您的 webapp 模块使用 SocketHandler
或 QueueHandler
,并有一个单独的进程侦听{套接字接收器或 QueueListener
)写入 TimedRotatingFileHandler
。官方文档has a cookbook which shows recipes for the multiple process scenario, including working code for socket receivers etc. which you can adapt to your specific needs. I use Supervisor保持监听进程运行.