2016-05-17 41 views
1

使用python日志记录,我创建了json格式的日志文件。每行是一个有效的json,整个日志只是许多行的json。它基本上是从一些传感器记录dta。我的代码还控制这些传感器的一些设置。 创建记录器按下面的例子:Python 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代码中执行的顺序编写吗? (当我简单地向控制台“打印”时,这并非总是如此)。如果不是如何确保?我试图扫描时间戳的连续性,但我注意到甚至高达四行可以有相同的时间戳。如您所见,我正在设置一个参数记录器('SET')Vdd = 1 .. 3并读取一系列测量结果记录器('RES')Temp,Lux。所以我的第二个问题是,如果我想创建一个csv文件或者只是创建一个堆栈图(Temp,Lux)vs Vdd,解析这个日志文件的最好方法是什么? (请注意,在每个日志行中可能有不同数量的键,可能有日志消息,因此必须对日志行进行过滤,并且日志文件可能很大) 我希望该过程具有通用性和灵活性有可能,我设定的参数可以被嵌套:

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... 

回答

0

我可以肯定的是,在日志文件中的行会,他们在Python代码执行相同的顺序写? (当我简单地向控制台“打印”时,这并非总是如此)

如果使用可能发生的多处理/多线程。在这种情况下,你需要清理进程之间的同步和刷新缓冲区,但是这个主题太大而无法在这里给出具体的解释。如果您只使用一个进程,则不需要重新排序。如果您认为某个东西被重新排序,那么这很可能是您的应用程序中的一个错误。

我在下面使用简单的代码,但有没有更有效的方法来做到这一点?

真的不能让这个效率更高。它已经完成了幕后所需的所有缓冲。但是这个代码不应该很复杂。把它写成一些做数据过滤/收集的生成器应该非常简单。