【发布时间】:2016-12-28 23:38:27
【问题描述】:
我正在使用 ELK 堆栈以及 log4j 2 via sl4j 和 json 模式布局 来记录消息。我的所有日志都记录为json 消息。此外,在我的一个日志中,我正在尝试记录从第三方服务收到的json 响应。但是此响应 json 正文未附加到 json 结构中。但它宁愿附加为包含转义字符的字符串。
最终日志是如何被注销的。
{
"timeMillis": 1471862316416,
"thread": "FioranoMQ Pubsub Session Thread",
"level": "INFO",
"loggerName": "com.mlp.eventing.bridge.fiorano.TopicMessageListener",
"message": "{\"Msgtype\":\"SentToRabbitMqTest\",\"MessageData\":\"10\",\"opration\":\"devide\"}",
"endOfBatch": false,
"loggerFqcn": "org.apache.logging.slf4j.Log4jLogger",
"threadId": 28,
"threadPriority": 5
}
在上面的消息段中附加为转义字符串,而不是整个json 结构。我的预期输出应该是
{
"timeMillis": 1471862316416,
"thread": "FioranoMQ Pubsub Session Thread",
"level": "INFO",
"loggerName": "com.mlp.eventing.bridge.fiorano.TopicMessageListener",
"message": {
"Msgtype": "SentToRabbitMqTest",
"MessageData": "10",
"opration": "devide"
},
"endOfBatch": false,
"loggerFqcn": "org.apache.logging.slf4j.Log4jLogger",
"threadId": 28,
"threadPriority": 5
}
我希望使用 shipper.conf 中的 json 的 grok 过滤器提取消息段中的字段
以下是我的配置:- log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="info"> <!-- log4j internals tracing -->
<properties>
<property name="pattern">%d{yyyy-MM-dd HH:mm:ss.SSS} | %-5.5p | %-20.20C:%-5.5L | %msg%n</property>
<property name="filePath">/opt/mlp/logs</property>
<property name="fileName">logs</property>
</properties>
<Appenders>
<RollingFile name="RollingFile" fileName="${filePath}/${fileName}.log"
filePattern="${filePath}/${fileName}-%d{yyyy-MM-dd}-%i.log" append="true">
<JSONLayout complete="false" compact="true" eventEol="true" />
<PatternLayout>
<pattern>${pattern}</pattern>
</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="1000 KB"/>
</Policies>l
</RollingFile>
<Console name="STDOUT" target="SYSTEM_OUT">
<PatternLayout>
<pattern>${pattern}</pattern>
</PatternLayout>
</Console>
</Appenders>
<Loggers>
<Root level="debug">
<AppenderRef ref="RollingFile"/>
<AppenderRef ref="STDOUT"/>
</Root>
</Loggers>
</Configuration>
示例代码sn-p
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
class A {
private static final Logger LOG = LoggerFactory.getLogger(Main.class);
public void testMethod() {
JSONObject responseJson = callService();// json simple object
LOG.info(responseJson);
}
}
maven 依赖
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.6.2</version>
</dependency>
<!-- end adding sl4j 2 for the message bridge -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.6.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.6.2</version>
</dependency>
<!--
to enable json support for log4j enable following libraries
-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.7.5</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.7.5</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.7.5</version>
</dependency>
【问题讨论】:
-
您的问题最终解决了吗?
-
这似乎是一个愚蠢的问题,但第三方响应不是字符串而不是对象吗?因为如果是这样,那么日志记录一切都很完美,您只需要解析响应。
-
我也有类似的问题。 Log4J Json 布局对字符串进行转义,因此打印到文件的输出不是有效的 json。图案布局打印不转义。
标签: java json logging log4j2 elastic-stack