我正在创建一个在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日志记录停止替换值