【问题标题】:Python json log creation and processingPython json 日志创建与处理
【发布时间】: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...

【问题讨论】:

    标签: python json logging


    【解决方案1】:

    我可以确定日志文件中的行将按照它们在 Python 代码中执行的顺序写入吗? (当我简单地向控制台“打印”时,情况并非总是如此)

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

    我在下面使用了简单的代码,但是有没有更有效的方法呢?

    你真的不能让它更有效率。它已经完成了您在幕后需要的所有缓冲。但是该代码不应该很复杂。将其编写为几个进行数据过滤/收集的生成器应该非常简单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-26
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多