2014-04-04 2 views
23

LogStash를 처음 사용했습니다. Log4J의 Java 애플리케이션에서 작성된 일부 로그가 있습니다. 나는 그 로그를 ElasticSearch로 가져 오는 중입니다. 내 삶을 위해, 나는 그것이 일관되게 작동하도록 할 수 없습니다. 현재 다음과 같은 logstash 구성을 사용하고 있습니다.LogStart와 함께 Log4J 사용

input { 
    file { 
    type => "log4j" 
    path => "/home/ubuntu/logs/application.log" 
    } 
} 
filter { 
    grok { 
    type => "log4j" 
    add_tag => [ "ApplicationName" ] 
    match => [ "message", "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level}" ] 
    } 
} 
output { 
    elasticsearch { 
    protocol => "http" 
    codec => "plain" 
    host => "[myIpAddress]" 
    port => "[myPort]" 
    } 
} 

이 구성은 잘못된 것 같습니다. 이유가 확실하지 않습니다. 예를 들어 두 가지 메시지가 있습니다. 하나는 작동하고 다른 하나는 구문 분석 실패를 던집니다. 그러나 나는 왜 그런지 잘 모르겠습니다.

Tags     Message 
------     ------- 
["_grokparsefailure"] 2014-04-04 20:14:11,613 TRACE c.g.w.MyJavaClass [pool-2- 
         thread-6] message was null from https://domain.com/id-1/env- 
         MethodName 

["ApplicationName"] 2014-04-04 20:14:11,960 TRACE c.g.w.MyJavaClass [pool-2- 
         thread-4] message was null from https://domain.com/id-1/stable- 
         MethodName 

[ "가능 ApplicationName"] timestamplevel의 내 사용자 정의 필드가 가진 하나 여기에 메시지와 각각의 결과입니다. 그러나 [ "_grokparsefailure"] 항목에는 사용자 정의 필드가 없습니다. 이상한 부분은 로그가 위의 메시지 열에 표시된 것과 거의 동일하다는 것입니다. 이것은 나에게 정말로 혼란 스럽지만 문제가 무엇인지, 그 문제를 넘어서는 법을 이해하는 방법을 모르겠습니다.

  • 타임 스탬프
  • 로그 메시지
  • 컴퓨터 이름
  • 스레드
    • 로그 레벨 : 아무도 내가 logstash에 수입의 log4j 로그를 사용하고 지속적으로 다음 필드를 얻을 수있는 방법을 알고 있나요

      제공 할 수있는 도움에 감사드립니다. 로그 수준, 타임 스탬프 및 로그 메시지만으로도 큰 도움이 될 것입니다. 진심으로 감사드립니다!

    +3

    내가 볼 수없는 방법 grok 수 패턴 항상 일치합니다. 당신은 % {LOGLEVEL : level} 이전에 두 개의 공백이 있습니다. 공백을 가변적으로 처리해야한다면 공백 대신에 \ s +를 사용하여 하나 이상의 공백을 찾습니다. 그리고 grok 디버거의 +1은 – Alcanzar

    답변

    22

    log4j 소켓 리스너와 log4j 소켓 appender를 사용하는 것이 좋습니다.

    Logstash의 conf :

    input { 
        log4j { 
        mode => server 
        host => "0.0.0.0" 
        port => [logstash_port] 
        type => "log4j" 
        } 
    } 
    output { 
        elasticsearch { 
        protocol => "http" 
        host => "[myIpAddress]" 
        port => "[myPort]" 
        } 
    } 
    

    log4j.properties :

    는 추가 정보를 자신의 log4j 입력에 대한 logstash의 문서에있다
    log4j.rootLogger=[myAppender] 
    log4j.appender.[myAppender]=org.apache.log4j.net.SocketAppender 
    log4j.appender.[myAppender].port=[log4j_port] 
    log4j.appender.[myAppender].remoteHost=[logstash_host] 
    

    : http://logstash.net/docs/1.4.2/inputs/log4j

    +0

    입니다. 당신과 같은 것을 권하고 싶지만, 지금은 메시지의 양이 아주 많을 때 문제가 발생하기 시작합니다 .log4j가 TCP 연결에서 이벤트를 읽는다는 사실을 기억하십시오. – alicia

    +0

    log4j_port in log4j.properties file logstash_port이어야합니다. – imesh

    +0

    '[logstash_host]'는 localhost 여야합니까? ip를 지정해야합니까, 아니면 호스트 이름으로 충분합니까? – AbtPst