gpt4 book ai didi

java - Log4j2 JSONLayout 时间戳模式

转载 作者:搜寻专家 更新时间:2023-10-31 08:25:21 27 4
gpt4 key购买 nike

显然,JSONLayout在 log4j2 中没有时间戳模式支持。通常它只有 JSON 格式选项,但没有 pattern 选项。

{
"configuration": {
"name": "logggg",
"packages" : "logger.savemyjob",
"appenders": {
"RollingFile": {
"name": "rollingStone",
"fileName": "async_rolled.log",
"filePattern": "async_rolled-%d{MM-dd-yy-HH-mm-ss}-%i.log.gz",
"immediateFlush" : false,
"JSONLayout": {
"complete": true,
"compact": false,
"eventEol": true
},
"SizeBasedTriggeringPolicy": {
"size": "10 MB"
},
"DefaultRolloverStrategy": {
"max": "10"
}
}
},
"loggers": {
"root": {
"level": "debug",
"appender-ref": {
"ref": "rollingStone"
}
}
}
}
}

日志示例,

{
"timeMillis" : 1482231551081,
"thread" : "main",
"level" : "debug",
"endOfBatch" : false,
"threadId" : 1,
"threadPriority" : 5,
"message" : "log4j might suck"
}

当我查看他们的 API 时,它看起来过于冗长而且没有找到更简单的添加时间戳字段的方法。

JsonLayout 插件似乎是我需要覆盖的插件,因为它的 final 甚至不能扩展,否则我必须复制整个依赖类。

@Plugin(name = "JsonLayout", category = Node.CATEGORY, elementType = Layout.ELEMENT_TYPE, printObject = true)
public final class JsonLayout extends AbstractJacksonLayout {

protected JsonLayout(final Configuration config, final boolean locationInfo, final boolean properties,
final boolean encodeThreadContextAsList,
final boolean complete, final boolean compact, final boolean eventEol, final String headerPattern,
final String footerPattern, final Charset charset) {
super(config, new JacksonFactory.JSON(encodeThreadContextAsList).newWriter(locationInfo, properties, compact),
charset, compact, complete, eventEol,
PatternLayout.createSerializer(config, null, headerPattern, DEFAULT_HEADER, null, false, false),
PatternLayout.createSerializer(config, null, footerPattern, DEFAULT_FOOTER, null, false, false));
}

}

架构看起来比我预期的要复杂 :(,我正在从 Logger 进行跟踪。

我还考虑过更改 LogEvent 本身,

public interface LogEvent extends Serializable {

@Deprecated
Map<String, String> getContextMap();

ReadOnlyStringMap getContextData();

ThreadContext.ContextStack getContextStack();

String getLoggerFqcn();

Level getLevel();

String getLoggerName();

Marker getMarker();

Message getMessage();

long getTimeMillis();

StackTraceElement getSource();

String getThreadName();

long getThreadId();

int getThreadPriority();

Throwable getThrown();

ThrowableProxy getThrownProxy();

boolean isEndOfBatch();

boolean isIncludeLocation();

void setEndOfBatch(boolean endOfBatch);

void setIncludeLocation(boolean locationRequired);

long getNanoTime();

String getTimestamp();
}

还有MutableLogEvent

public class MutableLogEvent implements LogEvent, ReusableMessage {

public void initFrom(final LogEvent event) {

SimpleDateFormat standardDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
this.timestamp = standardDateFormat.format(new Date(event.getTimeMillis()));
}
}

我猜它可能会起作用,尽管它打破了几个核心 log4j-core 测试。我基本上想知道以最少的更改添加额外的 json 字段的技巧。

我很少看到像 JSONEventLayoutV1 这样的其他暗示,这似乎与性能非常好的 log4j json api 完全不同。

这是我失败的覆盖尝试,LogEventhttps://github.com/prayagupd/sell-peace/blob/custom_timestamp/supply-peace/src/main/java/org/apache/logging/log4j/core/DnLogEvent.java

问题越来越长,我基本上想知道重写 log4j2 api 时不要错过的重要事情。

最佳答案

如果这只是添加一个包含时间戳的新字段的问题,除了默认提供的 timeMillis,您为什么不尝试在新的自定义字段上使用 Lookups。

JsonLayout 配置可能如下所示:

<JsonLayout>
<KeyValuePair key="timestamp" value="$${date:yyyy-MM-dd'T'HH:mm:ss.SSSZ}" />
</JsonLayout>

$$是Lookupdate:后面的字符是java SimpleDateFormat可以接受的format

关于java - Log4j2 JSONLayout 时间戳模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41241100/

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