logstash日志事件在使用属性文件配置时包含堆栈跟踪信息,但在java代码中配置时则不包含。

时间:2014-08-11 21:33:09

标签: logging elasticsearch log4j logstash

我使用Log4j和logstash相对较新。我使用带有套接字appender的Log4j将日志事件推送到logstash-1.4.2然后再转到Elasticsearch-1.1.1进行存储。

我尝试通过外部属性文件(log4j.properties)和java代码生成日志记录属性。这两种方法似乎都有一个例外:使用代码中指定的属性创建的日志事件不会生成使用外部属性文件生成的堆栈跟踪信息。

我查看了logstash文档以及Apache Log4J文档,看看是否有任何理由可能会发生这种情况但却一无所获。 看起来使用外部属性文件是首选的方法,但我想了解这里发生了什么。

当我使用属性文件并使用PropertyConfigurator时,我获得了所有的堆栈跟踪信息:

log4j.properties

log4j.rootLogger=DEBUG, server 

###SocketAppender###
log4j.appender.server=org.apache.log4j.net.SocketAppender
log4j.appender.server.Port=9500
log4j.appender.server.RemoteHost=localhost
log4j.appender.server.ReconnectionDelay=10000

LoggingTestClass.java

Logger logger = Logger.getLogger(LoggingTestClass.class.getName());
PropertyConfigurator.configure("log4j.properties"); 

logger.debug("debug message");
logger.error("error message");

- 这将生成下面的日志事件,并在事件中包含以下所有类/文件/行/方法信息。

"message": "debug message",
"@version": "1",
"@timestamp": "2014-08-08T16:08:10.423Z",
"type": "testLogs",
"host": "127.0.0.1:59979",
"path": "log4J.LoggingTestClass",
"priority": "DEBUG",
"logger_name": "log4J.LoggingTestClass",
"thread": "main",
"class": "log4J.LoggingTestClass",
"file": "LoggingTestClass.java:20",
"method": "init"

但是,当我创建一个SocketAppender对象并在java类中指定属性时,我仍然会获取日志记录事件,但是它们缺少堆栈跟踪信息:

LoggingTestClass.java

Logger rootLogger = Logger.getRootLogger();

SocketAppender sa = new SocketAppender("localhost", 9500);
sa.setPort(9500);
sa.setRemoteHost("localhost");
sa.setReconnectionDelay(10000);
sa.activateOptions();

logger.addAppender(sa);

logger.debug("debug message");
logger.error("error message");

这会在记录的事件中生成相同的信息,但缺少生成的日志事件的类/文件/行/方法信息:

"message": "debug message",
"@version": "1",
"@timestamp": "2014-08-08T14:27:27.522Z",
"type": "testLogs",
"host": "127.0.0.1:62135",
"path": "log4J.LoggingTestClass",
"priority": "DEBUG",
"logger_name": "log4J.LoggingTestClass",
"thread": "main",
"class": "?",
"file": "?:?",
"method": "?"

我的logstash配置:

ESLogConfig.txt

input {
   log4j {
      mode => "server"
      port => 9500
      type => Log4j
   }
}
output {
   stdout { }
   elasticsearch {
      cluster => "aaronCluster"
   }
}

在设置SocketAppender对象时,是否有一些我忽略的事情?

对此的任何帮助将不胜感激。感谢。

1 个答案:

答案 0 :(得分:1)

您是否尝试过socketAppender.setLocationInformation(true) - accordindg https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/net/SocketAppender.html#setLocationInfo%28boolean%29这是您想要的。我不确定为什么使用PropertyConfigurator进行配置会设置此项,但默认情况下,文档会说false