Gunicorn在使用自定义日志配置时未在启动时进行日志记录



我正在创建一个在Gunicorn上运行的Flask应用程序,需要日志采用JSON格式和特定格式。因此,我创建了一个自定义的";日志配置";文件

当收到请求时,Gunicorn正在JSON中正确地进行日志记录,但我丢失了默认的";启动日志记录";Gunicorn以前常做的事。

我正在启动这样的应用程序:

gunicorn -w 2 --log-config resources/gunicorn_logging.config 'wsgi:app'

以下是";gunicorn_logging.config";内容:

[loggers]
keys=root, gunicorn.error, gunicorn.access
[handlers]
keys=console
[formatters]
keys=json
[logger_root]
level=INFO
handlers=console
[logger_gunicorn.error]
level=ERROR
handlers=console
propagate=1
qualname=gunicorn.error
[logger_gunicorn.access]
level=INFO
handlers=console
propagate=1
qualname=gunicorn.access
[handler_console]
class=StreamHandler
formatter=json
args=(sys.stdout, )
[formatter_json]
class=src.logging_helpers.json_formatter.GunicornLogFormatter
format='%(log_level)s %(msg)s %(timestamp)s'

这是格式化程序代码:

class GunicornLogFormatter(JsonFormatter):
def add_fields(self, log_record, record, message_dict):
super(GunicornLogFormatter, self).add_fields(log_record, record, message_dict)
now = datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S.%fZ')
log_record['timestamp'] = now
if 'r' in record.args:
log_record['request'] = record.args.get('r')
log_record['msg'] = None
if 's' in record.args:
log_record['status_code'] = record.args.get('s')
if 'level' in log_record:
log_record['log_level'] = log_record['level'].upper()
else:
log_record['log_level'] = record.levelname

当一个请求到达应用程序时,我会得到这样的结果,这很好:

{"log_level": "INFO", "msg": null, "timestamp": "2022-10-10T22:32:40.663159Z", "request": "GET /_/health HTTP/1.1", "status_code": "200"}

这就是我失去的,我想找回的,但采用json格式:

[2022-10-10 23:42:47 +0100] [95107] [INFO] Starting gunicorn 20.1.0
[2022-10-10 23:42:47 +0100] [95107] [INFO] Listening at: http://127.0.0.1:8000 (95107)
[2022-10-10 23:42:47 +0100] [95107] [INFO] Using worker: sync
[2022-10-10 23:42:47 +0100] [95108] [INFO] Booting worker with pid: 95108
[2022-10-10 23:42:47 +0100] [95109] [INFO] Booting worker with pid: 95109

我已经尝试在格式化程序"中添加打印;add_ field";函数,看看它是否在启动时被调用,但它不是,所以看起来我不会以某种方式丢失那里的消息。

非常感谢您的帮助。

我解决了这个问题,这只是一个让gunicorn.error的记录器处于INFO日志级别的问题:

[logger_gunicorn.error]
level=INFO
handlers=console
propagate=1
qualname=gunicorn.error

不知道启动日志最终会出现在gunicorn.error中,但我们现在。。。

话虽如此,我现在有一个新问题,那就是日志记录并没有像默认情况下那样动态替换版本、运行端口等的值,而没有自定义配置。

我在这里详细介绍,以防你遇到同样的问题:

Gunicorn日志记录停止替换值

最新更新