我认为发布 json 消息的最佳方法是使用 org.apache.logging.log4j 。
第一步:添加maven依赖
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.11.1</version>
</dependency>
以及构建 json 的任何依赖项,例如
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
第 2 步:编写自定义布局来创建 json
@Plugin(name = "CustomJsonLayout", category = Node.CATEGORY, elementType = Layout.ELEMENT_TYPE)
public class CustomJsonLayout extends AbstractStringLayout {
private static final Gson gson = new Gson();
public CustomJsonLayout(Configuration config, Charset aCharset, Serializer headerSerializer, Serializer footerSerializer) {
super(config, aCharset, headerSerializer, footerSerializer);
}
@PluginFactory
public static CustomJsonLayout createLayout(@PluginConfiguration final Configuration config,
@PluginAttribute(value = "charset", defaultString = "US-ASCII") final Charset charset) {
return new CustomJsonLayout(config, charset, null, null);
}
@Override
public String toSerializable(LogEvent event) {
JsonObject jsonObject = new JsonObject();
// as example
jsonObject.addProperty("application_name", "MyApp");
jsonObject.addProperty("timestamp", "" + System.currentTimeMillis());
// some log Information
jsonObject.addProperty("level", event.getLevel().name());
jsonObject.addProperty("thread", event.getThreadName());
jsonObject.addProperty("thread_id", event.getThreadId());
jsonObject.addProperty("logger_name", event.getLoggerName());
// extra information
final StackTraceElement source = event.getSource();
JsonObject sourceObject = new JsonObject();
sourceObject.addProperty("class", source.getClassName());
sourceObject.addProperty("method", source.getMethodName());
sourceObject.addProperty("file", source.getFileName());
sourceObject.addProperty("line", source.getLineNumber());
jsonObject.add("source", sourceObject);
// your log message
jsonObject.addProperty("message", event.getMessage().getFormattedMessage());
// Exceptions
if (event.getThrownProxy() != null) {
final ThrowableProxy thrownProxy = event.getThrownProxy();
final Throwable throwable = thrownProxy.getThrowable();
final String exceptionsClass = throwable.getClass().getCanonicalName();
if (exceptionsClass != null) {
jsonObject.addProperty("exception", exceptionsClass);
}
final String exceptionsMessage = throwable.getMessage();
if (exceptionsMessage != null) {
jsonObject.addProperty("cause", exceptionsMessage);
}
final String stackTrace = thrownProxy.getExtendedStackTraceAsString("");
if (stackTrace != null) {
jsonObject.addProperty("stacktrace", stackTrace);
}
}
return gson.toJson(jsonObject).concat("\r\n");
}
}
步骤 3:配置 log4j2.xml,其中 yourUrl - 如果使用 Spring Boot,则为 application.properties 中的目标 url (yourUrl=http://... http://....)
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Properties>
<Property name="urlProp">${bundle:application:yourUrl}</Property>
</Properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
<Http name="Http" url="${urlProp}">
<Property name="X-Java-Runtime" value="$${java:runtime}" />
<CustomJsonLayout/>
</Http>
<File name="LogToFile" fileName="logs/app.log">
<PatternLayout>
<Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
<DefaultRolloverStrategy max="10"/>
</File>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Http"/>
<AppenderRef ref="Console"/>
<AppenderRef ref="LogToFile"/>
</Root>
</Loggers>
</Configuration>
第 4 步:最后,您可以在任何课程中使用记录器
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
private static final Logger logger = LogManager.getLogger(App.class);
logger.info("Application started");