Ami*_*oda 10 java logging json log4j2 elastic-stack
我正在使用ELK堆栈和log4j 2通过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
}
Run Code Online (Sandbox Code Playgroud)
在上面的消息段中作为转义字符串而不是整个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
}
Run Code Online (Sandbox Code Playgroud)
我期待使用神交过滤器提取的消息段的字段json中shipper.conf
以下是我的配置: - 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>
Run Code Online (Sandbox Code Playgroud)
示例代码段
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);
}
}
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
Kir*_*ill 14
为了能够记录未转义的 JSON,您应该使用 Log4j2 记录器而不是 Slf4j。此功能从 Log4j 2.11 开始可用。
Log4j logger 能够记录ObjectMessage,它将被转换为嵌套的 JSON。
ObjectMessage构造函数接受 Map,因此 JSONObject 必须转换为 map(例如在 Jackson 的帮助下ObjectMapper)。
在布局配置中添加objectMessageAsJsonObject="true":
<JSONLayout complete="false" compact="true" eventEol="true" objectMessageAsJsonObject="true" />
Run Code Online (Sandbox Code Playgroud)
完整的工作示例:
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.message.ObjectMessage;
import org.json.JSONObject;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class test {
public static void main(String[] args) throws IOException {
HashMap<Object, Object> map = new HashMap<>();
map.put("foo", "bar");
JSONObject jsonObject = new JSONObject(map);
Map<String, Object> newMap = new ObjectMapper().readValue(jsonObject.toString(), new TypeReference<Map<String, Object>>() {});
Logger log4jLogger = LogManager.getLogger("mainLogger");
log4jLogger.info(new ObjectMessage(newMap));
}
}
Run Code Online (Sandbox Code Playgroud)
这将产生:
{"thread":"main","level":"INFO","loggerName":"mainLogger","message":{"foo":"bar"},"endOfBatch":false,"loggerFqcn":"org.apache.logging.log4j.spi.AbstractLogger","instant":{"epochSecond":1548434758,"nanoOfSecond":572000000},"threadId":1,"threadPriority":5}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4564 次 |
| 最近记录: |