Python3添加日志记录级别

时间:2017-12-19 14:12:45

标签: python logging python-3.5

我有这个代码对我来说很好。

import logging
import logging.handlers

logger = None


def create_logger():
    global logger
    logger = logging.getLogger('Logger')
    logger.setLevel(logging.DEBUG)
    handler = logging.handlers.RotatingFileHandler("C:/Users/user/Desktop/info.log", maxBytes=1000000, backupCount=20)
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    handler.setFormatter(formatter)
    logger.addHandler(handler)


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

输出看起来很棒:

  

2017-12-19 15:06:43,021 - 记录器 - 信息 - 文字信息
  2017-12-19 15:06:43,021 - 记录器 - 调试 - 文本调试
  2017-12-19 15:06:43,022 - 记录仪 - 警告 - 文字警告
  2017-12-19 15:06:43,022 - 记录器 - 错误 - 文本错误
  2017-12-19 15:06:43,022 - 记录器 - 关键 - 文字批评

好吧,我想添加一个像这样的新日志记录级别:

logger.message("Text message")  

输出应该是这样的

  

2017-12-19 15:06:43,022 - 记录器 - 消息 - 短信

由于

1 个答案:

答案 0 :(得分:14)

来自Logging documentation(强调补充):

  

定义你自己的等级是可能的,但不一定是必要的,如   现有水平是在实际的基础上选择的   经验。但是,如果您确信需要自定义级别,   这样做时应该非常小心,可能是一个   如果您正在开发库,那么定义自定义级别的想法非常糟糕。   那是因为如果多个库作者都定义了他们自己的自定义   级别,有可能从这样的多个日志输出   一起使用的库对于使用开发人员来说将是困难的   控制和/或解释,因为给定的数值可能意味着   不同图书馆的不同之处。

默认logging levels的概述:

enter image description here

但是如果您仍然想要,您可以制作自己的日志级别:

logging - 模块中,_levelToName_nameToLevel是日志名称和级别之间的映射。 addLevelName()函数不是手动添加它们,而是为您执行此操作。

此处,添加了一个名为 MESSAGE 的新日志记录级别,其日志级别为 25

import logging

# Define MESSAGE log level
MESSAGE = 25

# "Register" new loggin level
logging.addLevelName(MESSAGE, 'MESSAGE')  # addLevelName(25, 'MESSAGE')

# Verify
assert logging.getLevelName(MESSAGE) == 'MESSAGE'

如果您不想创建自己的记录器类但仍希望记录其他日志级别,则可以在传统记录器上使用Logger.log(level, msg) - 方法:

logging.log(MESSAGE, 'This is a message')

编辑:直接添加消息

 def message(self, msg, *args, **kwargs):
    if self.isEnabledFor(MESSAGE):
        self._log(MESSAGE, msg, args, **kwargs) 

message()中提供logging - 功能:

 logging.message = message
 # or setattr(logging, 'message', message)

在记录器中使message() - 函数可用:

 logging.Logger.message = message
 # or setattr(logging.Logger, 'message', message)

制作自定义Logger类

您可以创建自己的记录器类来制作message(msg) - 方法,与其他方法一样使用(例如info(msg)warning(msg)等。)

在以下示例中,使用message(msg) - 方法创建新记录器以记录 MESSAGE

class MyLogger(logging.Logger):
    def message(self, msg, *args, **kwargs):
        if self.isEnabledFor(MESSAGE):
            self._log(MESSAGE, msg, args, **kwargs)

获取记录器

我不确定使用logging.getLogger(name)的最佳方式是什么,但以下是两种方法。 参考。评论,我相信第一种方法更好:

使新记录器成为默认日志记录类,这意味着新的记录器实例将属于MyLogger类,而不是默认的logging.Logger类:

logging.setLoggerClass(MyLogger)
logger = logging.getLogger('A new logger name')
logger.message('This seems to work')
assert isInstance(logger, MyLogger)

只需创建记录器的一个实例,然后将其添加到活动loggerDict实例中的logging.Manager编辑:不推荐,见评论):

my_logger = MyLogger('Foo')
logging.Logger.manager.loggerDict['Foo'] = my_logger
logger = logging.getLogger('Foo')
logger.message('This is the same instance as my_logger')
assert logger is my_logger

使用新的日志级别

# Use the new logger class
logger.warning('Custom log levels might be a bad idea')
logger.message('Here is a message')
# Log with custom log level:
logger.log(MESSAGE, 'This is a message')

这假设MESSAGE被预定义为表示日志级别的整数数值。 (例如 25 如前所述)