【问题标题】:logstash log events contain stacktrace information when configured with properties file, but not when configured in java code.使用属性文件配置时,logstash 日志事件包含堆栈跟踪信息,但在 java 代码中配置时不包含。
【发布时间】:2014-08-11 21:33:08
【问题描述】:

我对使用 Log4j 和 logstash 比较陌生。我正在使用带有套接字附加程序的 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 对象时,我是否可能忽略了一些事情?

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

【问题讨论】:

    标签: logging elasticsearch log4j logstash


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回复。我尝试将 PatternLayout 添加到 socketappender 但在日志中看到相同的结果。字符串模式 = "%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n"; sa.setLayout(new PatternLayout(pattern)); logger.addAppender(sa);
    • 另外,看起来 SocketAppenders 实际上并没有使用布局,因为它们序列化了所有数据。 link。我使用的配置文件也只包含我在帖子中包含的内容,因此没有指定布局。我错过了什么吗?提前致谢。
    • 抱歉原始答案不正确。将其编辑为我认为正确的答案。
    • @OwlBear 如果您想将PatternLayoutSocketAppender 一起使用,您可能需要考虑升级到Log4j v2,它允许:logging.apache.org/log4j/2.x/manual/…(使用layout=PatternLayout,因为默认布局是SerializedLayout)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多