2012-05-22 17 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"}, 

ですから、パーサが処理できるような方法でログファイルを構成するホにいくつかの規則を持っている必要がありますそれら。一番簡単なのは、「行ごとに1つのログメッセージオブジェクト、文字列値の改行文字がエスケープされる」ことです。既存の標準とツールはありますか?

+0

あなたは '['を使用してファイルを起動することができますそれを完成させる'{}]'で置き換えます。しかし、答えのいくつかが指摘しているように、jsonは "ストリーム可能な"形式ではありません。 – Penz

+0

** ** https://github.com/michaeltandy/log4j-json – dreftymac

答えて

14

FILEごとに1つの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は1行ごとに解釈されることになっています。私は、ログファイル全体を1つの巨大なJSON BLOBとして扱うことを提案しているわけではありません。大量のJSONインタプリタを用意する必要があります。代わりに、代わりに行ごとに解析すると、ファイルのすべての行で完全に有効なJSONを持つことができます。では、ファイル全体が大きなオブジェクトの1つとして有効なJSONでない場合はどうでしょうか?とにかく、あなたはそれを望んでいないでしょう。 – HerbCSO

0

gem log_formatterは、ルビの選択肢です。これは、フォーマッタグループがrubyとlog4rのjsonフォーマッタをサポートするようになりました。

ルビーについて簡単に述べられています。

gem 'log_formatter' 

require 'log_formatter' 
require 'log_formatter/ruby_json_formatter' 

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

結果log4rため

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

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

関連する問題