2012-05-22 2 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 http://fluentd.org/을 사용하여 잘 작동하는 툴셋을 확인하십시오.

+0

쉼표없이 꺾쇠 괄호를 사용하지 않고 JSON 객체를 작성하는 것은 ** 더 이상 JSON이 아니며 **. JSON 인터프리터가 전혀 이해할 수없는 뭔가를 만들었습니다. 뭔가 JSON이라고해서는 안됩니다. – simbolo

+6

내가 말했듯이, JSON은 라인 단위로 해석되어야한다. 전체 로그 파일을 하나의 거대한 JSON BLOB로 찌르는 것이 아니라 큰 JSON 인터프리터를 가져 오는 것이 좋습니다. 대신, 대신 라인 당 구문 분석하고 다음 파일의 모든 줄에 완벽하게 유효한 JSON을 가질 수 있습니다. 그렇다면 전체 파일이 하나의 전체 객체로서 유효한 JSON이 아닌 경우 어떻게해야할까요? 어쨌든, 당신은 그것을 원하지 않을 것입니다. – HerbCSO

0

gem log_formatter은 루비 선택 항목이며, 포맷터 그룹은 이제 루비 및 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

관련 문제