我的应用程序生成 JSON 格式的日志。日志看起来像这样:
{"LogLevel":"error","Datetime":"2013-06-21T11:20:17Z","Module":"DB","Method":"ExecuteSelect","Request":"WS_VALIDATE","Error":"Procedure or function 'WS_VALIDATE' expects parameter '@LOGIN_ID', which was not supplied."}
目前,我正在将上述日志行按原样推送到 mongoDB 中。但 mongoDB 将日期时间存储为字符串(这是预期的)。现在我想对这些日志运行一些数据处理作业,我更愿意将日期时间存储为 mongoDB 的 native ISODate 数据类型。
我可以想到 3 种方法来做到这一点:
i) 解析每个 JSON 日志行并将字符串转换为应用程序代码中的 ISODate 类型,然后将其插入。缺点:在将其推送到 mongoDB 之前,我必须解析每一行,这会有点昂贵
ii) 每次插入后运行查询,使用
将最后插入文档的字符串日期时间转换为 ISODateelement.Datetime = ISODate(element.Datetime);
缺点:同样昂贵,因为我将在每次插入时运行一个额外的查询 iii) 在生成点修改我的日志,这样我就不必在应用程序代码级别进行任何解析,或者在每次插入后运行更新查询
另外,我只是好奇,有没有办法可以配置 mongoDB 将日期时间字符串自动转换为其 native isodate 格式?
TIA
编辑: 我正在使用 pymongo 插入 json 日志
我的文件看起来像这样:
{“LogLevel”:“错误”,“日期时间”:“2013-06-21T11:20:17Z”,“模块”:“DB”,“方法”:“ExecuteSelect”,“请求”:“WS_VALIDATE ","Error":"过程或函数'WS_VALIDATE'需要参数'@LOGIN_ID',但未提供该参数。"}
像上面提到的那样,有数百行。 这就是我将它们插入 mongodb 的方式:
for line in logfile:
collection.insert(json.loads(line))
以下内容将解决我的问题:
for line in logfile:
data = json.loads(line)
data["Datetime"] = datetime.strptime(data["Datetime"], "%Y-%M-%DTHH:mmZ")
collection.insert(data)
我想做的是摆脱上面必须做的日期时间的额外操作。希望这能澄清问题。
最佳答案
看起来你已经有了答案...我会坚持:
for line in logfile:
data = json.loads(line)
data["Datetime"] = datetime.strptime(data["Datetime"], "%Y-%M-%DTHH:mmZ")
collection.insert(data)
我遇到了类似的问题,但我事先不知道应该在哪里用日期时间对象替换它。所以我将 json 信息更改为如下内容:
{"LogLevel":"error","Datetime":{"__timestamp__": "2013-06-21T11:20:17Z"},"Module":"DB","Method":"ExecuteSelect","Request":"WS_VALIDATE","Error":"Procedure or function 'WS_VALIDATE' expects parameter '@LOGIN_ID', which was not supplied."}
并解析 json:
json.loads(data, object_hook=logHook)
“logHook”定义为:
def logHook(d):
if '__timestamp__' in d:
return datetime.strptime(d['__timestamp__'], "%Y-%M-%DTHH:mmZ")
return d
这个logHook函数还可以扩展以用elif,elif,...替换许多其他“变量”
希望这有帮助!
关于mongodb - 将 ISODate 字符串转换为 mongoDB 原生 ISODate 数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17236479/