2017-05-26 123 views
3

我对如何将日志条目直接放到elasticsearch(而不是logstash)有点困惑。到目前为止,我发现几个appender(log4j.appender.SocketAppender,log4j.appender.server等)允许将日志发送到远程主机,并且ConversionPattern似乎允许我们将日志转换为“弹性友好”格式,但这种方法看起来很怪异...还是我错了?这是发送日志到elastic的一种方法吗?Log4j直接登录到elasticsearch服务器

到目前为止,我有一个这样的配置:

log4j.rootLogger=DEBUG, server 
log4j.appender.server=org.apache.log4j.net.SocketAppender 
log4j.appender.server.Port=9200 
log4j.appender.server.RemoteHost=localhost 
log4j.appender.server.ReconnectionDelay=10000 
log4j.appender.server.layout.ConversionPattern={"debug_level":"%p","debug_timestamp":"%d{ISO8601}","debug_thread":"%t","debug_file":"%F", "debug_line":"%L","debug_message":"%m"}%n 

但我得到一个错误:

log4j:WARN Detected problem with connection: java.net.SocketException: Broken pipe (Write failed) 

我无法找到任何有用的例子,所以我不明白我该怎么办错误和如何解决它。谢谢。

+1

那是不可能的。你需要Logstash。如果您想使用已弃用的log4j插件(https://www.elastic.co/guide/en/logstash/current/plugins-inputs-log4j.html),那么可以,但我们建议将log4j日志写入文件并使用Filebeat接他们并将它们发送给Elasticsearch。 –

+2

看到这个问题:https://stackoverflow.com/questions/32302421/logging-from-java-app-to-elk-without-need-for-parsing-logs – diginoise

+0

@diginoise'如果你指向这个文件logstash'这意味着我会将日志写入文件,这不是我所需要的 – Daria

回答

0

我发现最符合我需求的解决方案。这是一个graylog。 由于它是基于elasticsearch构建的,因此使用方式非常熟悉,因此我可以立即切换到它。

要使用它,我加入这个依赖基本log4j2依赖沿:

<dependency> 
    <groupId>org.graylog2.log4j2</groupId> 
    <artifactId>log4j2-gelf</artifactId> 
    <version>1.3.2</version> 
</dependency> 

,并使用log4j2.json配置:

{ 
    "configuration": { 
    "status": "info", 
    "name": "LOGGER", 
    "packages": "org.graylog2.log4j2", 
    "appenders": { 
     "GELF": { 
     "name": "GELF", 
     "server": "log.myapp.com", 
     "port": "12201", 
     "hostName": "my-awsome-app", 
     "JSONLayout": { 
      "compact": "false", 
      "locationInfo": "true", 
      "complete": "true", 
      "eventEol": "true", 
      "properties": "true", 
      "propertiesAsList": "true" 
     }, 
     "ThresholdFilter": { 
      "level": "info" 
     } 
     } 
    }, 
    "loggers": { 
     "logger": [ 
     { 
      "name": "io.netty", 
      "level": "info", 
      "additivity": "false", 
      "AppenderRef": { 
      "ref": "GELF" 
      } 
     }   
     ], 
     "root": { 
     "level": "info", 
     "AppenderRef": [ 
      { 
      "ref": "GELF" 
      } 
     ] 
     } 
    } 
    } 
} 
1

如果你想使用它,我已经在这里写了这个appender Log4J2 Elastic REST Appender。它能够在将事件发送到Elastic之前根据事件的时间和/或事件数来缓冲日志事件(使用_bulk API,以便一次发送)。 它已发布到Maven Central,因此非常简单。