Ale*_*lex 7 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")
Run Code Online (Sandbox Code Playgroud)
输出看起来很棒:
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")
Run Code Online (Sandbox Code Playgroud)
输出应该是这样的
2017-12-19 15:06:43,022 - 记录器 - 消息 - 短信
谢谢
Tho*_*ger 15
从记录文档(重点添加):
定义您自己的水平是可能的,但不一定是必要的,因为现有水平是根据实践经验选择的.但是,如果您确信需要自定义级别,那么在执行此操作时应特别小心,如果您正在开发库,则定义自定义级别可能是一个非常糟糕的主意.这是因为如果多个库作者都定义了他们自己的自定义级别,那么使用开发人员很难控制和/或解释这些多个库的日志记录输出,因为给定的数值可能意味着不同的东西对于不同的图书馆
默认日志记录级别的概述:

但是,如果您仍然想要,您可以创建自己的日志级别:
在logging-module,_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'
Run Code Online (Sandbox Code Playgroud)
如果您不想创建自己的记录器类但仍想记录其他日志级别,则可以Logger.log(level, msg)在传统记录器上使用-method:
logging.log(MESSAGE, 'This is a message')
Run Code Online (Sandbox Code Playgroud)
def message(self, msg, *args, **kwargs):
if self.isEnabledFor(MESSAGE):
self._log(MESSAGE, msg, args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
使message()功能可用于logging:
logging.message = message
# or setattr(logging, 'message', message)
Run Code Online (Sandbox Code Playgroud)
使message()在记录器可用-功能:
logging.Logger.message = message
# or setattr(logging.Logger, 'message', message)
Run Code Online (Sandbox Code Playgroud)
你可以让自己的Logger类作message(msg)-方法,被用来相若方式的其他人(例如info(msg),warning(msg)等)
在以下示例中,使用message(msg)-method 创建新的记录器以记录MESSAGE:
class MyLogger(logging.Logger):
def message(self, msg, *args, **kwargs):
if self.isEnabledFor(MESSAGE):
self._log(MESSAGE, msg, args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
我不确定使用它的最佳方法是什么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)
Run Code Online (Sandbox Code Playgroud)
或者只是创建一个记录器的实例并将其添加到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
Run Code Online (Sandbox Code Playgroud)
# 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')
Run Code Online (Sandbox Code Playgroud)
这假设它MESSAGE被预定义为表示日志级别的整数数值.(例如前面提到的25)