【问题标题】:Format for writing a JSON log file?编写 JSON 日志文件的格式?
【发布时间】:2012-05-22 10:10:26
【问题描述】:

有没有编写和解析JSON日志文件的格式标准?

我看到的问题是您不能拥有“纯”JSON 日志文件,因为您需要匹配的括号并且禁止使用尾随逗号。因此,虽然以下内容可能由应用程序编写,但无法通过标准 JSON parsers: 进行解析

[{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"},

因此,您必须对如何以解析器可以处理它们的方式构造日志文件有一些约定。最简单的事情是“每行一个日志消息对象,字符串值中的换行符被转义”。有没有现成的标准和工具?

【问题讨论】:

  • 您可以使用[ 开始文件并使用{}] 完成它。但是,正如一些答案所指出的,json 不是一种“可流式”格式。

标签: json logging syntax standards


【解决方案1】:

您不会为每个 FILE 编写一个 JSON 对象,而是要为每个 LINE 编写一个 JSON 对象。然后可以单独解析每一行。您无需担心尾随逗号并将整个对象集括在括号等中。请参阅http://blog.nodejs.org/2012/03/28/service-logging-in-json-with-bunyan/ 以获取有关其外观的更详细说明。

还可以查看 Fluentd http://fluentd.org/ 以获取可使用的简洁工具集。

编辑:这种格式现在称为 JSONLines 或 jsonl,正如下面 @Mnebuerquo 所指出的 - 请参阅 http://jsonlines.org/

【讨论】:

  • 但是每行写入 JSON 对象,没有逗号,也没有括号,IS NOT JSON 了。您创建了其他东西,没有 JSON 解释器能够理解的东西。不应该称为 JSON 的东西。
  • 正如我所说,JSON 将在每行的基础上进行解释。我并不是建议您将整个日志文件作为一个巨大的 JSON blob 吞食,这会变得很大并使大多数 JSON 解释器屈服,因为他们必须为此创建一堆对象。相反,改为每行解析它,然后您可以在文件的每一行上拥有完全有效的 JSON。那么,如果整个文件作为一个完整的大对象不是有效的 JSON 怎么办?无论如何,你不会想要那个。
  • 这种日志格式被各种日志应用程序称为 JSON 行。例如:elastic.co/guide/en/logstash/current/…
【解决方案2】:

gem 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多