python - 将格式化的日志字符串转换回 LogRecord

标签 python

如果我有格式化程序字符串,将日志字符串转换回导致首先生成该字符串的 LogRecord 的最佳方法是什么。

我知道我可以使用正则表达式来实现此目的,但我想知道是否有更好的方法来实现此目的。

格式化程序:

%(asctime)s--%(name)s--%(levelname)s--%(funcName)s:%(lineno)s---%(message)s

示例:

2014-07-28 16:46:39,221--sys.log--DEBUG--hello:61---hello world

正则表达式:

^(?P<asctime>.*?)--(?P<name>.*?)--(?P<levelname>.*?)--(?P<funcName>.*?):(?P<lineno>.*?)---(?P<message>.*?)$

正则表达式示例:

import re
pattern = re.compile('^(?P<asctime>.*?)--(?P<name>.*?)--(?P<levelname>.*?)--(?P<funcName>.*?):(?P<lineno>.*?)---(?P<message>.*?)$')
print pattern.match('2014-07-28 16:46:39,221--sys.log--DEBUG--hello:61---hello world').groupdict()

输出:

{'name': 'sys.log', 'funcName': 'hello', 'lineno': '61', 'asctime': '2014-07-2816:46:39,221', 'message': 'hello world', 'levelname': 'DEBUG'}

引用文献:

  1. https://docs.python.org/2/library/logging.html
  2. https://docs.python.org/2/howto/logging.html

最佳答案

对于此示例,只需在双破折号处拆分:

sample = '2014-07-28 16:46:39,221--sys.log--DEBUG--hello:61---hello world'
fields = ('asctime', 'name', 'levelname', 'funcName', 'message')
values = { k: v for k, v in zip(fields, sample.split('--', len(fields) - 1)) }
# and do some mending
values['funcName'], values['lineno'] = values['funcName'].split(':')
values['message'] = values['message'][1:]
>>> values
{'asctime': '2014-07-28 16:46:39,221',
 'funcName': 'hello',
 'levelname': 'DEBUG',
 'lineno': '61',
 'message': 'hello world',
 'name': 'sys.log'}

关于python - 将格式化的日志字符串转换回 LogRecord,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25012575/

相关文章:

python - 将 conda 包安装到 google colab

python - 有效地在列表中执行 "cancelling out"操作

python - 不使用lambda的python中的抽象函数

python - 如何在 Keras 中声明多输入 LSTM 模型?

python - pyvenv 无法工作,因为 Ensurepip 不可用

python - 当我尝试使用easy_install时,它显示无法解压数据; zlib 不可用

python - 使用 beautifulSoup 从 HTML 片段中的类获取 href 的所有值

Python在postgresql表中查找带有单引号的字符串

python - 最常见单词或短语的 FreqDist

Python 多处理 : sharing data between processes