2014-09-03 73 views
2

我想添加一些额外的信息/属性,如“应用程序”的名字我log4j2活动(由于某种原因,这个属性是不是在log4j2菱了..) 将日志通过LAN发送到Logstash实例。添加属性的Log4j 2个活动

我已经计算出包括一个解决方案:

  1. 自定义追加程序布局(https://github.com/majikthys/log4j2-logstash-jsonevent-layout):布局提取从Log4jLogEvent所有属性,并且可以通过log4j2配置来提供额外的属性,并产生一个JSON串。
  2. Logstash配置:
 

    input { 
     tcp { 
      codec => json_lines { charset => "UTF-8" } 
      port => 4560 
      type => "log4j2-json" 
      mode => "server"  
     } 
    } 
    ... 

上述工作的解决方案,但需要布局要建和加入/保持为在每一个应用程序中的广口瓶中。

所以问题是 - 有没有更好的解决方案,我错过了? 理想将是一个解决方案,不需要添加任何新的罐子/类和第三方软件的使用。像RewriteAppender但不使用“MapMessage”。

回答

0

我最终使用log4j 2 TcpSocketServer来接收远程日志,然后将它们本地转发到通过tcp套接字的logstash(您也可以使用文件...)。

http://logging.apache.org/log4j/2.x/log4j-core/apidocs/org/apache/logging/log4j/core/net/server/TcpSocketServer.html

我不认为这个解决方案是理想,但它不需要定制的附加器。

+0

正如我所说 - 我需要添加一些信息,如应用程序名称来知道哪个应用程序已发送日志。所以,用TcpSocketServer,Grok或其他方法修改另一端的日志已经太晚了。 – mihahh 2014-09-08 11:01:09

+0

我创建了一个自定义布局插件,类似于OP提到的 - https://github.com/savantly-net/log4j2 -Extended-jsonlayout – Jeremy 2017-08-22 09:03:16

1

对于您的用例,您可以使用通过GELF的logstash与https://github.com/mp911de/logstash-gelf。应用程序名称与客户端的关系比与中央logstash服务器更相关。配置看起来像这样:

<Configuration> 
    <Appenders> 
     <Gelf name="gelf" host="udp:localhost" port="12201" originHost="%host{fqdn}"> 
      <Field name="timestamp" pattern="%d{dd MMM yyyy HH:mm:ss,SSS}" /> 
      <Field name="level" pattern="%level" /> 
      <Field name="simpleClassName" pattern="%C{1}" /> 

      <Field name="applicationName" literal="MyApplicationName" /> 

      <!-- This is a field using MDC --> 
      <Field name="mdcField2" mdc="mdcField2" /> 
      <DynamicMdcFields regex="mdc.*" /> 
     </Gelf> 
    </Appenders> 
    ... 
</Configuration> 
_