如何设置日志记录级别名称?

Posted

技术标签:

【中文标题】如何设置日志记录级别名称?【英文标题】:How to set logging level names? 【发布时间】:2018-03-05 15:30:38 【问题描述】:

为了提高可读性,我想更改日志系统的级别名称。我目前的方法是使用logging.addLevelName()。我还希望记录器写入stderr 和系统日志。我可以使用以下代码实现这两者:

import logging
import logging.handlers

logging.basicConfig(level=logging.DEBUG)
logging.addLevelName(logging.CRITICAL, "(CC)")
logging.addLevelName(logging.ERROR, "(EE)")
logging.addLevelName(logging.WARNING, "(WW)")
logging.addLevelName(logging.INFO, "(II)")
logging.addLevelName(logging.DEBUG, "(DD)")
logging.addLevelName(logging.NOTSET, "(--)")

logger = logging.getLogger('mylogger')
logger.addHandler(logging.handlers.SysLogHandler(address="/dev/log"))
handler = logging.StreamHandler()
handler.setFormatter(logging.Formatter(
    '[%(asctime)s %(levelname)s] %(message)s', datefmt="%y%m%d-%H%M%S"))
logger.addHandler(handler)
logger.propagate = False

logger.debug("debug")
logger.info("info")
logger.warning("warning")
logger.error("error")
logger.critical("critical")

终端上的输出现在如下所示:

[180303-224014 (DD)] debug
[180303-224014 (II)] info
[180303-224014 (WW)] warning
[180303-224014 (EE)] error
[180303-224014 (CC)] critical

但不幸的是,系统日志处理程序现在将所有消息写入WARNING 级别:

Mar  3 22:40:14 user.warning debug 
Mar  3 22:40:14 user.warning info 
Mar  3 22:40:14 user.warning warning 
Mar  3 22:40:14 user.warning error 
Mar  3 22:40:14 user.warning critical

这是 Pythons logging 模块中的错误吗?有没有更好的方法来设置用于'%(levelname)s' 的字符串?

【问题讨论】:

【参考方案1】:

这可能是一个错误。 SysLogHandler 使用self.priority_map.get(levelName, "warning") 来确定发送给syslog 的优先级,而addLevelName 似乎没有(或可能无法)更新地图。作为一种解决方法,您可以手动更新它:

SysLogHandler.priority_names.update(
  '(CC)': logging.LOG_CRIT,
  '(EE)': logging.LOG_ERR,
  # etc
)

【讨论】:

如果您修复它,请随时提供有效的自我回答,我会删除它。

以上是关于如何设置日志记录级别名称?的主要内容,如果未能解决你的问题,请参考以下文章

如何设置 HikariCP 的日志记录级别?

Spring Boot:如何使用 application.properties 设置日志记录级别?

如何在 Tomcat 中将级别日志记录设置为 DEBUG?

如何使用 uber-go/zap 根据日志级别记录到标准输出或标准错误?

设置日志记录级别

如何配置 WildFly 8.2.0 日志记录以仅在调试级别显示应用程序