我有这个代码对我来说很好。
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 - 记录器 - 消息 - 短信
由于
答案 0 :(得分:14)
来自Logging documentation(强调补充):
定义你自己的等级是可能的,但不一定是必要的,如 现有水平是在实际的基础上选择的 经验。但是,如果您确信需要自定义级别, 这样做时应该非常小心,可能是一个 如果您正在开发库,那么定义自定义级别的想法非常糟糕。 那是因为如果多个库作者都定义了他们自己的自定义 级别,有可能从这样的多个日志输出 一起使用的库对于使用开发人员来说将是困难的 控制和/或解释,因为给定的数值可能意味着 不同图书馆的不同之处。
默认logging levels的概述:
但是如果您仍然想要,您可以制作自己的日志级别:
在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)
您可以创建自己的记录器类来制作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 如前所述)