2012-05-22 95 views
15

是否有任何格式標準來編寫和解析JSON日誌文件?寫入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"}, 

所以,你必須有一些豪公約構建的方式,解析器可以處理你的日誌文件他們。最簡單的事情是「每行一個日誌消息對象,字符串值中的換行符被轉義」。是否有任何現有的標準和工具?

+0

可以啓動與該文件'['並完成它與'{}]'。但是,正如一些答案指出的那樣,json不是一種「流式」格式。 – Penz

+0

**另請參閱:** https://github.com/michaeltandy/log4j-json – dreftymac

回答

14

您不打算爲每個FILE編寫單個JSON對象,您將爲每個LINE編寫一個JSON對象。每行可以被分別解析。您不必擔心尾隨逗號,並將括號內的所有對象都括起來,等等。有關此外觀的更詳細說明,請參見http://blog.nodejs.org/2012/03/28/service-logging-in-json-with-bunyan/

另外檢查Fluentd​​爲一個整潔的工具集使用。

+0

但是每行都寫入JSON對象,沒有逗號,也沒有括號括起來,**不是JSON **。您已經創建了其他東西,這是JSON解釋器無法理解的。一些不應該被稱爲JSON的東西。 – simbolo

+6

正如我所說的,JSON將在每行的基礎上進行解釋。我並不是建議你將整個日誌文件作爲一個巨大的JSON blob來使用,因爲它們必須爲此創建一堆對象,這會讓大多數JSON解釋器屈服。相反,每行解析出來,然後你可以在文件的每一行都有完全有效的JSON。那麼如果整個文件不是有效的JSON作爲一個整體大對象呢?無論如何,你不會那麼想。 – HerbCSO

0

寶石log_formatter是ruby的選擇,因爲格式化程序組現在支持ruby和log4r的json格式化程序。

簡單明瞭的紅寶石。

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