Vel*_*ker 6 python formatting logging
在Python日志记录中,有没有办法设置两个组合字段的宽度?
我希望结合文件名和行号来生成类似于以下内容的输出:
2011-10-14 13:47:51 main.py:12 DEBUG - Initializing cluster
2011-10-14 13:47:51 cluster.py:364 DEBUG - Starting cluster
2011-10-14 13:47:51 cluster.py:98 INFO - Starting simulation
2011-10-14 13:47:51 simulation.py:79 DEBUG - Computing parameters
Run Code Online (Sandbox Code Playgroud)
我将如何修改下面的格式字符串来实现此目的?
logging.Formatter('%(asctime)s %(filename)s:%(lineno)s %(levelname)5s - %(msg)s
Run Code Online (Sandbox Code Playgroud)
更新:
正如@jonrsharpe 指出的那样,没有现成的方法可以做到这一点,因此需要自定义格式。
解决方案:@alecxe 建议使用自定义Filter,这是一个完整的示例:
import logging
import logging.config
class FilenameLinenoFilter(logging.Filter):
def filter(self, record):
record.filename_lineno = '{}:{}'.format(record.filename, record.lineno)
return True
LOG_SETTINGS = {
'version': 1,
'filters': {
'filename_lineno_filter': {
'()': FilenameLinenoFilter,
},
},
'formatters': {
'standard': {
'format': '%(asctime)s %(filename_lineno)-18s %(levelname)5s - %(msg)s',
},
},
'handlers': {
'default': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'filters': ['filename_lineno_filter'],
'formatter': 'standard',
},
},
'loggers': {
'': {
'handlers': ['default'],
'level': 'DEBUG',
},
}
}
logging.config.dictConfig(LOG_SETTINGS)
logger = logging.getLogger()
logger.debug('Debug output goes here.')
logger.info('Informational goes here.')
Run Code Online (Sandbox Code Playgroud)
AFilter不是适合该作业的工具\xe2\x80\x94 过滤器用于决定发出哪些日志记录以及静默哪些日志记录,而不是拦截日志记录只是为了“猴子修补”它们。
相反,从 Python 3.2 开始,您可以使用该logging.setRecordFactory函数来注册自定义LogRecord子类或工厂函数,以向每个添加自定义属性LogRecord:
import logging\n\nclass CustomLogRecord(logging.LogRecord):\n def __init__(self, *args, **kwargs):\n super().__init__(*args, **kwargs)\n self.origin = f"{self.filename}:{self.lineno}"\nRun Code Online (Sandbox Code Playgroud)\n然后,您可以在记录器的格式字符串中设置此组合字段的宽度:
\nlogging.setLogRecordFactory(CustomLogRecord)\nlogging.basicConfig(\n style=\'{\',\n format="{asctime} {origin:20} {levelname} - {message}",\n level=logging.INFO\n)\nlogging.info("Test")\nRun Code Online (Sandbox Code Playgroud)\n2020-06-26 16:10:03,193 scratch_2.py:16 INFO - Test\nRun Code Online (Sandbox Code Playgroud)\n
您可以借助自定义过滤器创建组合字段:
import logging
class MyFilter(logging.Filter):
def filter(self, record):
record.filename_lineno = "%s:%d" % (record.filename, record.lineno)
return True
Run Code Online (Sandbox Code Playgroud)
然后,您可以%(filename_lineno)s在格式字符串中引用占位符。
| 归档时间: |
|
| 查看次数: |
2079 次 |
| 最近记录: |