gpt4 book ai didi

arrays - 如何编写一个由 Log4j2 JSONLayout 自动转换为 JSON 的 Java 类?

转载 作者:行者123 更新时间:2023-12-04 08:59:13 29 4
gpt4 key购买 nike

Log4j2 的 JsonLayout将 LogEvent 内容转换为 JSON,如下所示:
java :

  logger.info("This is an info message");
输出:
{
"timeMillis" : 1598613343782,
"thread" : "main",
"level" : "INFO",
"loggerName" : "com.example.Test",
"message" : "This is an info message",
"endOfBatch" : false,
"loggerFqcn" : "org.apache.logging.log4j.spi.AbstractLogger",
"contextMap" : { },
"threadId" : 1,
"threadPriority" : 5
}
但是当一个对象(bean)被传递给 Logger ,它将消息作为字符串吐出。
假设我的 bean 是这样的:
public class MyLogBean {
private String message;
private String userId;
private String ip;
public MyLogBean(String message, String userId, String ip) {
this.message = message;
this.userId = userId;
this.ip = ip;
}
public MyLogBean() {}
public String getMessage() {return message;}
public void setMessage(String message) {this.message = message;}
public String getUserId() {return userId;}
public void setUserId(String userId) {this.userId = userId;}
public String getIp() {return ip;}
public void setIp(String ip) {this.ip = ip;}
}

然后,如果尝试使用以下内容编写 MyLogBean:
java :
    logger.info(new MyLogBean("UserLogged","john.appleseed@example.com","192.168.1.56"));
输出:
{
"timeMillis" : 1598613343782,
"thread" : "main",
"level" : "INFO",
"loggerName" : "com.example.Test",
"message" : "com.example.MyLogBean@328cf0e1",
"endOfBatch" : false,
"loggerFqcn" : "org.apache.logging.log4j.spi.AbstractLogger",
"contextMap" : { },
"threadId" : 1,
"threadPriority" : 5
}
它打印 "com.example.MyLogBean@328cf0e1"作为消息。
如何让它像这样在 JSON 中写入消息:
{
"timeMillis" : 1598613343782,
"thread" : "main",
"level" : "INFO",
"loggerName" : "com.example.Test",
"message" : {
"message":"UserLogged",
"userId":"john.appleseed@example.com",
"ip":"192.168.1.56"
},
"endOfBatch" : false,
"loggerFqcn" : "org.apache.logging.log4j.spi.AbstractLogger",
"contextMap" : { },
"threadId" : 1,
"threadPriority" : 5
}
我需要 MyLogBean类由 JsonLayout 自动转换为 JSON。不幸的是,默认情况下,JsonLayout 使用 toString方法并将所有对象内容作为字符串。
我尝试通过实现 MyLogBean 将其转换为 JSON Log4J 类 Message接口(interface),但它仍然使用字符串方法( getFormattedMessage)。即使我使用字符串到 JSON 转换器,消息再次变成字符串,输出变成这样:
{
"message" : "{\"message\":\"UserLogin\",\"userId\":\"john\",\"ip\":\"10.2.3.4\"}"
}

最佳答案

文档说你应该这样做:

<JsonLayout objectMessageAsJsonObject="true"/>
如果您需要所有日志事件的 userId 和 ip,您可以将它们添加到 ThreadContextMap。然后它们会自动出现在 contextMap 部分中,您可以简单地记录您的消息。
另一个选项是在 MyLogBean() 中包含一个 toString() 方法,该方法将相关字段作为 JSON 字符串返回。
如果您无法修改 bean 类,您可以创建自己的 IntrospectingMessage,它接受 bean 作为参数并在调用 getFormattedMessage 时返回所有属性的 JSON 字符串。

关于arrays - 如何编写一个由 Log4j2 JSONLayout 自动转换为 JSON 的 Java 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63634337/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com