- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
显然,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 完全不同。
这是我失败的覆盖尝试,LogEvent
,https://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>
$$是Lookup,date:
后面的字符是java SimpleDateFormat可以接受的format。
关于java - Log4j2 JSONLayout 时间戳模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41241100/
我正在尝试通过 log4j2 以 JSON 格式登录。 这是我的 log4j2.xml 文件:
如何在 Log4j2 的 JSONLAYOUT 中添加自定义参数? 还有没有办法向 JSONLAYOUT 的消息元素添加模式? 我已经尝试了这里列出的选项 -> logging.apache.org/
我正在使用 JsonLayout 和 Spring Boot 以 JSON 格式记录消息。我只希望将日志消息记录到控制台而不是日志文件。 我注意到 JSON 日志连续记录在同一行上。在生产中,这没问题
我尝试配置我的 log4j2 但我总是收到此错误: 2017-11-06 01:14:15,454 RMI TCP Connection(3)-127.0.0.1 ERROR appender Rol
显然,JSONLayout在 log4j2 中没有时间戳模式支持。通常它只有 JSON 格式选项,但没有 pattern 选项。 { "configuration": { "name":
我将用 JSONLayout 显示 log4j2与消息上的对象相同。例如我的配置是: cat log4j2.xml
嘿,我有一个使用 log4j 和 slf4j 进行日志记录的项目。 我将日志的布局配置为JsonLayout。 是否可以在保持 json 格式的同时记录 JSON 对象。 例如 : JsonO
我正在尝试使用 Log4J (2.6.2) 将日志存储在 JSON 文件中。我在 RollingFileAppender 中使用 JsonLayout,只要我不尝试附加到之前已写入的文件,它就可以正常
我正在尝试以 JSON 格式重定向日志输出,因此,我有 log4j2 的 Json 配置。我知道我应该使用 JsonLayout,但我没有找到任何方法将其放在我的配置中。这是我的 log4j2.jso
因此,我们有一个应用程序,我们将把它的所有日志发送到 Kibana 服务器(通过 Kafka 服务器)。 以下是我们设法开始工作的基础知识,可以毫无问题地发布到 Kibana:
我正在尝试使用 Log4j2 配置 JsonLayaout。我想在 JSON 中的一条消息中包含堆栈跟踪。我知道我必须使用属性“完整”。 我创建的示例类是: public class MyApp {
如何在log4j2的JsonLayout生成的json日志中添加MDC变量。我已经使用 KeyValuePair 标记将主机名等属性添加到日志中,但我没有找到任何方法将 MDC 变量添加到其中。在模式
长话短说如果我在 log4j2.xml 配置中使用带有嵌套 KeyValuePair 的 JsonLayout,则生成的日志消息为空。有什么想法吗? 说来话长 我将 Tomcat 8.5.43 与以下
Log4j2 的 JsonLayout将 LogEvent 内容转换为 JSON,如下所示: java : logger.info("This is an info message"); 输出:
我一整天都在做这个,但在尝试了这么多组合之后还是没能正常工作。归根结底,我正在寻找从 Karaf 获取 JSON 日志记录的明确步骤列表。我什至浏览了 Maven Karaf 插件源代码,试图解决这个
我是一名优秀的程序员,十分优秀!