如何格式化日志记录级别的名称
How to format the name of the logging level
当我开始 IPython 时,我看到这样的日志:
[I 17:03:59.993 NotebookApp] Using MathJax from CDN: https://cdn.mathjax.org/mathjax/latest/MathJax.js
[W 17:04:00.292 NotebookApp] Terminals not available (error was No module named terminado)
[I 17:04:00.293 NotebookApp] Serving notebooks from local directory: /home/oleg
[I 17:04:00.293 NotebookApp] 0 active kernels
[I 17:04:00.293 NotebookApp] The IPython Notebook is running at: http://localhost:8888/
[I 17:04:00.293 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
这里消息的级别略有格式化,也就是说,你看到的是I
而不是INFO
,W
而不是WARNING
等。另外,括号是彩色的。我觉得这很酷,也想这样写我的日志。但是,IPython 使用龙卷风日志系统。
我使用 colorlog module 为消息着色。为了进行格式化,我对 StreamHandler
class 进行了子class,如下所述:
How to get the level of the logging record in a custom logging.Handler in Python?
class FormatLevelHandler(logging.StreamHandler):
def emit(self, record):
record.levelname = record.levelname[0]
logging.StreamHandler.emit(self, record)
但是当我这样做时,着色不再起作用了。
有没有一种方法可以同时进行日志记录级别名称的格式化和着色?
这是我的完整代码:
import logging
from colorlog import ColoredFormatter
formatter = ColoredFormatter(
"%(log_color)s[%(levelname)1s %(asctime)s] %(reset)s %(blue)s%(message)s",
datefmt=None,
reset=True,
log_colors={
'DEBUG': 'cyan',
'INFO': 'green',
'WARNING': 'yellow',
'ERROR': 'red',
'CRITICAL': 'red,bg_white',
},
secondary_log_colors={},
style='%'
)
logger = logging.getLogger(__name__)
class FormatLevelHandler(logging.StreamHandler):
def emit(self, record):
record.levelname = record.levelname[0]
logging.StreamHandler.emit(self, record)
ch = FormatLevelHandler()
ch.setFormatter(formatter)
logger.addHandler(ch)
logger.setLevel(logging.DEBUG)
logger.info('Hello')
logger.debug('Hi')
是的。虽然问题一开始看起来很复杂,但原因很简单:colorlog
使用您提供的字典来匹配关卡名称 after Handler.emit
.
因此,您需要将词典更改为
log_colors={
'D': 'cyan',
'I': 'green',
'W': 'yellow',
'E': 'red',
'C': 'red,bg_white',
},
不要更改 handler.emit()
中的级别。相反,使用 %(levelname)1.1s
截断格式字符串本身的级别(而不是您示例中的 %(levelname)1s
)。
或者无论您是否使用 Tornado 的其余部分,您都可以使用 Tornado 日志系统:只需在程序开始时调用 tornado.log.enable_pretty_logging()
。
当我开始 IPython 时,我看到这样的日志:
[I 17:03:59.993 NotebookApp] Using MathJax from CDN: https://cdn.mathjax.org/mathjax/latest/MathJax.js
[W 17:04:00.292 NotebookApp] Terminals not available (error was No module named terminado)
[I 17:04:00.293 NotebookApp] Serving notebooks from local directory: /home/oleg
[I 17:04:00.293 NotebookApp] 0 active kernels
[I 17:04:00.293 NotebookApp] The IPython Notebook is running at: http://localhost:8888/
[I 17:04:00.293 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
这里消息的级别略有格式化,也就是说,你看到的是I
而不是INFO
,W
而不是WARNING
等。另外,括号是彩色的。我觉得这很酷,也想这样写我的日志。但是,IPython 使用龙卷风日志系统。
我使用 colorlog module 为消息着色。为了进行格式化,我对 StreamHandler
class 进行了子class,如下所述:
How to get the level of the logging record in a custom logging.Handler in Python?
class FormatLevelHandler(logging.StreamHandler):
def emit(self, record):
record.levelname = record.levelname[0]
logging.StreamHandler.emit(self, record)
但是当我这样做时,着色不再起作用了。
有没有一种方法可以同时进行日志记录级别名称的格式化和着色? 这是我的完整代码:
import logging
from colorlog import ColoredFormatter
formatter = ColoredFormatter(
"%(log_color)s[%(levelname)1s %(asctime)s] %(reset)s %(blue)s%(message)s",
datefmt=None,
reset=True,
log_colors={
'DEBUG': 'cyan',
'INFO': 'green',
'WARNING': 'yellow',
'ERROR': 'red',
'CRITICAL': 'red,bg_white',
},
secondary_log_colors={},
style='%'
)
logger = logging.getLogger(__name__)
class FormatLevelHandler(logging.StreamHandler):
def emit(self, record):
record.levelname = record.levelname[0]
logging.StreamHandler.emit(self, record)
ch = FormatLevelHandler()
ch.setFormatter(formatter)
logger.addHandler(ch)
logger.setLevel(logging.DEBUG)
logger.info('Hello')
logger.debug('Hi')
是的。虽然问题一开始看起来很复杂,但原因很简单:colorlog
使用您提供的字典来匹配关卡名称 after Handler.emit
.
因此,您需要将词典更改为
log_colors={
'D': 'cyan',
'I': 'green',
'W': 'yellow',
'E': 'red',
'C': 'red,bg_white',
},
不要更改 handler.emit()
中的级别。相反,使用 %(levelname)1.1s
截断格式字符串本身的级别(而不是您示例中的 %(levelname)1s
)。
或者无论您是否使用 Tornado 的其余部分,您都可以使用 Tornado 日志系统:只需在程序开始时调用 tornado.log.enable_pretty_logging()
。