为了提高可读性,我想更改日志系统的级别名称。我目前的方法是使用logging.addLevelName()
。此外,我希望记录器写入stderr
和syslog。我可以使用以下代码实现这两个目标:
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
但不幸的是,syslog-handler现在将所有消息写入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'
的字符串?
答案 0 :(得分:2)
它可能有资格成为一个错误。 SysLogHandler
使用self.priority_map.get(levelName, "warning")
来确定要发送给syslog
的优先级,并且addLevelName
似乎没有(或可能无法)更新地图。作为解决方法,您可以手动更新它:
SysLogHandler.priority_names.update({
'(CC)': logging.LOG_CRIT,
'(EE)': logging.LOG_ERR,
# etc
})