JSON日志文件的写入格式?

33

写入和解析JSON日志文件是否有任何格式标准?

我看到的问题是,你无法拥有一个"纯粹"的 JSON 日志文件,因为你需要匹配的括号和末尾逗号是被禁止的。所以,尽管以下内容可能由应用程序编写,但无法被标准的JSON解析器解析:

[{date:'2012-01-01 02:00:01', severity:"ERROR", msg:"Foo failed"},
{date:'2012-01-01 02:04:02', severity:"INFO", msg:"Bar was successful"},
{date:'2012-01-01 02:10:12', severity:"DEBUG", msg:"Baz was notified"},

因此,您必须制定一些规则来构造日志文件,以便解析器可以处理这些日志。最简单的方法是“每行一个日志消息对象,字符串值中的换行符已转义”。是否存在任何现有的标准和工具?


1
你可以用 [ 开始文件,然后用 {}] 结束它。但是,正如一些答案所指出的那样,JSON 不是一个“可流式传输”的格式。 - Penz
参见:https://github.com/michaeltandy/log4j-json - dreftymac
2个回答

29

1
但是,每行编写JSON对象,没有逗号和括号包围,不再是JSON。你创造了另一种东西,没有任何JSON解释器能够理解。这不应该被称为JSON。 - simbolo
13
正如我所说的,JSON应该基于每行进行解析。我并不建议你将整个日志文件作为一个巨大的JSON块读入,因为这会变得过于庞大,也会使大多数JSON解析器望而却步,因为它们必须为此创建大量对象。相反,应该逐行解析,这样文件的每一行都可以得到有效的JSON。如果整个文件不是一个有效的JSON大对象,那又怎样呢?反正你也不希望这样。 - HerbCSO
4
各种日志应用程序称该日志格式为 JSON-lines。例如,Logstash:https://www.elastic.co/guide/en/logstash/current/plugins-codecs-json_lines.html - Mnebuerquo

0

log_formatter 宝石是 Ruby 的首选格式化程序组,现在支持 Ruby 和 log4r 的 JSON 格式化程序。

对于 Ruby 来说非常容易入门。

gem 'log_formatter'

require 'log_formatter'
require 'log_formatter/ruby_json_formatter'

logger.debug({data: "test data", author: 'chad'})

结果

{
  "source": "examples",
  "data": "test data",
  "author": "chad",
  "log_level": "DEBUG",
  "log_type": null,
  "log_app": "app",
  "log_timestamp": "2016-08-25T15:34:25+08:00"
}

对于log4r:

require 'log4r'
require 'log_formatter'
require 'log_formatter/log4r_json_formatter'

logger = Log4r::Logger.new('Log4RTest')
outputter = Log4r::StdoutOutputter.new(
  "console",
  :formatter => Log4r::JSONFormatter::Base.new
)
logger.add(outputter)

logger.debug( {data: "test data", author: 'chad'} )

高级用法:README

完整示例代码:examples


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接