0

我正在使用pygelf日志处理程序将 Flask 应用程序与Graylog集成。

根据文档,Graylog 支持八个 syslog 严重级别,基于RFC 3164,即:

(...)
        Numerical         Severity
          Code

           0       Emergency: system is unusable
           1       Alert: action must be taken immediately
           2       Critical: critical conditions
           3       Error: error conditions
           4       Warning: warning conditions
           5       Notice: normal but significant condition
           6       Informational: informational messages
           7       Debug: debug-level messages
(...)

虽然 Graylog 支持级别 5,即notice,但 Python 的日志记录包似乎既没有定义notice()日志记录方法(如info()or debug())也没有定义相应的日志记录级别:

CRITICAL = 50
FATAL = CRITICAL
ERROR = 40
WARNING = 30
WARN = WARNING
INFO = 20
DEBUG = 10
NOTSET = 0

问题:有没有办法强制pygelf使用notice日志级别?


附加背景:

我正在使用Flask框架,默认情况下使用日志级别 6 ( info) 和 7 ( debug) 来记录它自己的内部 http 请求数据,如下所示:

101.101.101.101 - - [03/Sep/2019 14:15:55] "GET /static/images/favicon.ico HTTP/1.0" 200 -

由于这些内部日志,我自己infodebug级别的日志在人群中迷失了。我不想完全过滤掉它们,但我仍然希望有一些不那么高的独特的信息日志记录级别warning- 这就是为什么我可以使用notice-level 日志记录,不幸的是我不能使用 out-of-the -盒子。

4

1 回答 1

0

Pygelf 内部包含一个dict,它映射 Python 日志记录级别及其对应的 Graylog 日志记录级别,位于gelf.py

LEVELS = {
    logging.DEBUG: 7,
    logging.INFO: 6,
    logging.WARNING: 4,
    logging.ERROR: 3,
    logging.CRITICAL: 2
}

我的解决方案:为了登录 Graylog 的 5 级(通知),我必须:

  1. 在记录器配置中添加一个新的日志级别映射:
from pygelf import GelfTcpHandler, gelf

NOTIFY = 35
GELF_NOTIFY_LEVEL = 5

(...)

gelf.LEVELS.update({NOTIFY: GELF_NOTIFY_LEVEL})
handler = GelfTcpHandler(
    ...
)
logging.getLogger().addHandler(handler)
  1. 将记录器调用从默认方法更改为具有自定义日志级别的方法:
import logging
logger = logging.getLogger()

(...)

# logger.debug('Old logging to "debug"-level logger')
logger.log(NOTIFY, 'New logging to "notify"-level logger')
于 2019-09-04T14:25:14.790 回答