자바 로그 포맷

4639 단어 포맷JAVA로그
1.로그 의 중요성
우리 가 어떤 언어 로 개발 하 든 프로그램 에 이상 이 생기 면 로 그 는 매우 중요 한 데이터 이다.하지만 인쇄 된 로그 가 많 을 수록 좋다 는 뜻 은 아 닙 니 다.유용 한 로그 가 필요 합 니 다.
중요 한 프로젝트 최적화 에 참 여 했 고 그들의 일 지 는 규범화 되 지 않 았 으 며 개발,운영 도 이 일 을 마음 에 두 지 않 았 다.압력 측정 을 기다 릴 때 TPS 와 응답 시간 이 계속 올 라 가지 않 는 다.jstack 분석 을 통 해 대부분의 log 데이터 가 막 히 고 있 음 을 발견 하 였 습 니 다!
오늘 우 리 는 구체 적 인 로그 규범 에 대해 토론 하지 않 습 니 다.로그 센터 의 측면 에서 LOG 의 규범 에 대해 이야기 하 겠 습 니 다.
2.로그 수집 분석-ELK
현재 주류 인 ELK 시스템 은 에이전트 엔 드(filebeat/flume)를 통 해 구체 적 인.log 파일 을 수집 해 야 합 니 다.로그 에 큰 처리 가 없 으 면 전체 로 그 를 수집 한 후 logstash 를 통 해 message 를 elasticsearch 에 저장 할 수 있 습 니 다.
1.모든 로그 에서 로그 시간,로그 단계 등 정 보 를 추출 해 야 할 때 logstash 에서 해당 하 는 grok 문법 으로 message 정 보 를 분석 해 야 합 니 다.
2.로그 에 이상 한 정보 가 있 습 니 다.이상 한 정 보 를 추출 해 야 할 때 grok 으로 message 를 세척 하 는 것 이 어렵 습 니 다!사실 해결 방법 도 있 으 니,네가 천천히 정규 매 칭 을 써 야 한다.
좋 습 니 다.logstash 의 강력 한 grok 와 mutate 는 수 요 를 만족 시 킬 수 있 지만 당일 지 량 이 많 을 때 logstash 의 grok 와 mutate 는 대량의 자원 을 소모 합 니 다.그럼 저희 가 더 많은 방안 이 있 을까요?
다음은 자바 로그 로 예 를 들 어 보 겠 습 니 다.
답 을 얻 기 전에 es 에 저 장 된 최종 데 이 터 는 JSON 이 고 logstash 세척 데이터 의 최종 결 과 는 JSON 으로 바 뀌 었 다 는 것 을 알 아야 합 니 다.일반적인 에이전트 채집 단 은 로그 채집 만 할 뿐 kafka 가 버퍼 링 을 하 더 라 도 kafka 는 처리 하지 않 습 니 다.그래서 우 리 는 일지 의 근원 에서 이 문 제 를 해결 해 야 한다.
3.왜 logstash 를 사용 하여 자바 의 이상 정 보 를 처리 하기 가 쉽 지 않 습 니까?
로그 프레임 워 크 출력 과 관련 된 이상 정 보 는 보통 여러 줄 입 니 다.이것 은 우리 가 filebeat(flume)나 logstash 에서 여러 줄 의 문 제 를 처리 해 야 한 다 는 것 을 의미 합 니 다.로그 설정 파일 에 로그 의 message 와 stack 을 잘 구분 하지 못 했 을 때 로 그 는 섞 여 있 습 니 다.앞 당 기 는 게 어려워 요.어려워 요.
4.로그 json 화
원생 의 로그 데이터 가 처리 되 지 않 는 이상 로그 프레임 워 크 에 대해 미용 수술 을 해 야 한다.
로그 에 서 는 시간/로그 수준/스 레 드/로그 내용/현재 파일 이름/loggerName/이상 정보 등 을 인쇄 합 니 다.
로그 내용 과 이상 정보 가 여러 줄 로 나타 날 수 있 습 니 다.이것 은 처리 해 야 합 니 다.다음은 fastjson 을 사용 하여 이 두 필드 를 처리 하 겠 습 니 다.코드 를 보십시오.

public class MsgConverter extends ClassicConverter {

 @Override
 public String convert(ILoggingEvent event) {
 return JsonUtils.serialize(event.getFormattedMessage());

 }
}

public class StackTraceConverter extends ThrowableProxyConverter {
 @Override
 public String convert(ILoggingEvent event) {
 IThrowableProxy throwableProxy = event.getThrowableProxy();
 //        
 if (throwableProxy == null) {
 //      : "\"\""
 return JsonUtils.serialize("");
 }
 String ex = super.convert(event);
 return JsonUtils.serialize(ex);
 }
}
그 중에서 도 JsonUtils 는 제 이 슨 프레임 워 크 를 선택 하여 처리 할 수 있 습 니 다.
다음 logback.xml 에 설정

<configuration>
 <conversionRule conversionWord="exdiy" converterClass="xxx.logback.converter.StackTraceConverter" />
 <conversionRule conversionWord="msgdiy" converterClass="xxx.logback.converter.MsgConverter" />
</configuration>
레이아웃 수정->패턴

<layout>
 <!--<Pattern>{"date":"%date{yyyy-MM-dd HH:mm:ss.SSS}","level":"%level","tid":"%tid","className":"%logger","fileLine":"%file:%line","msg":%message, "stack_trace":%ex }%n</Pattern>-->
 <Pattern>{"date":"%date{yyyy-MM-dd HH:mm:ss.SSS}","level":"%level","className":"%logger","fileName":"%file","thread":"%thread","msg":%msgdiy, "stack_trace":%exdiy}%n</Pattern>
</Pattern>

{
 "date":"2019-01-02 16:16:33.817",
 "level":"INFO",
 "className":"org.springframework.web.servlet.DispatcherServlet","fileName":"FrameworkServlet.java","thread":"http-nio-8762-exec-1","msg":"FrameworkServlet 'dispatcherServlet': initialization completed in 38 ms", "stack_trace":"" 
}
logstash 는 json 문자열 을 json 으로 변환 하면 됩 니 다.

json {
 source => "message"
 #target => "doc"
 remove_field => ["message"]
 }
 date {
 match => ["date","yyyy-MM-dd HH:mm:ss.SSS"]
 target => "@timestamp"
 locale => "cn"
 timezone => "Asia/Shanghai"
 }
최종 효과

이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기