【发布时间】:2016-05-17 11:08:11
【问题描述】:
使用 python 日志,我创建了一个 json 格式的日志文件。每一行都是一个有效的 json,整个日志只是多行 json。它基本上是从一些传感器记录数据。我的代码还控制这些传感器的一些设置。 我按照以下示例创建记录器:
import logging
import logging.handlers
from pythonjsonlogger import jsonlogger
formatter = jsonlogger.JsonFormatter('%(asctime)s %(name)s %(message)s')
log = logging.getLogger('MSG')
log.setLevel(logging.INFO)
fh = logging.handlers.RotatingFileHandler(
filename='C:\\TEMP\\LOG\\test.log', maxBytes=2097152, backupCount=5)
fh.setFormatter(formatter)
log.addHandler(fh)
res = logging.getLogger('RES')
res.setLevel(logging.INFO)
res.addHandler(fh)
stg = logging.getLogger('SET')
stg.setLevel(logging.INFO)
stg.addHandler(fh)
我的代码和上述记录器创建的日志文件或多或少是这样的:
{"asctime": "2016-05-13 11:25:32,154", "name": "SET", "message": "", "VAR": "Vdd", "VAL": "1"}
{"asctime": "2016-05-13 11:25:32,155", "name": "MSG", "message": "writting new setting successful"}
{"asctime": "2016-05-13 11:25:32,155", "name": "RES", "message": "", "VAR": "TEMP", "VAL": "23"}
{"asctime": "2016-05-13 11:25:32,157", "name": "RES", "message": "", "VAR": "LUX", "VAL": "150"}
{"asctime": "2016-05-13 11:25:32,159", "name": "SET", "message": "", "VAR": "Vdd", "VAL": "2"}
{"asctime": "2016-05-13 11:25:32,164", "name": "MSG", "message": "writting new setting successful"}
{"asctime": "2016-05-13 11:25:32,166", "name": "RES", "message": "", "VAR": "TEMP", "VAL": "25"}
{"asctime": "2016-05-13 11:25:32,171", "name": "RES", "message": "", "VAR": "LUX", "VAL": "170", "extra": "OV detected"}
{"asctime": "2016-05-13 11:25:32,177", "name": "SET", "message": "", "VAR": "Vdd", "VAL": "3"}
{"asctime": "2016-05-13 11:25:32,178", "name": "MSG", "message": "writting new setting successful"}
{"asctime": "2016-05-13 11:25:32,178", "name": "RES", "message": "", "VAR": "TEMP", "VAL": "28"}
{"asctime": "2016-05-13 11:25:32,178", "name": "RES", "message": "", "VAR": "LUX", "VAL": "190"}
现在我的第一个问题。我可以确定日志文件中的行将按照它们在 Python 代码中执行的顺序写入吗? (当我简单地对控制台进行“打印”时,这并不总是正确的)。如果没有怎么保证?我试图扫描时间戳的连续性,但我注意到即使多达四行也可以具有相同的时间戳。
如您所见,我正在设置一个参数 logger('SET') Vdd = 1 .. 3 并读取一系列测量结果 logger('RES') Temp,Lux。所以我的第二个问题是,如果我想创建一个 csv 文件或只是创建一个堆叠图 (Temp, Lux) vs Vdd,解析这个日志文件的最佳方法是什么? (请注意,每个日志行中可以有可变数量的 keywards,可以有 oder 日志消息,因此必须过滤日志行并且日志文件可能很大) 我希望过程尽可能通用和灵活,因为我设置的参数可以嵌套:
SET A
SET B
READ C
READ D
SET B
READ C
READ D
SET A
SET B
READ C
READ D
SET B
READ C
READ D
我在下面使用了简单的代码,但是有没有更有效的方法呢?
import json
data = []
with open('file') as f:
for line in f:
#lots of strange line filtering and keyword selection here
#in order to build Temp vs Vdd table, etc...
【问题讨论】: