当前位置: 首页 > 知识库问答 >
问题:

Log4j2 JSONLayout时间戳模式

魏松
2023-03-14

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

{
  "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时,看起来太冗长了,没有看到添加时间戳字段的更简单的方法。

@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));
    }

}

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();
}
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的impl,它似乎与性能非常好的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时不要错过的重要内容。

共有1个答案

赵佐
2023-03-14

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

JsonLayout配置可能如下所示:

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

$$是查找,date:后面的字符是java SimpleDateFormat可以接受的格式。

 类似资料:
  • 我知道这是一个非常常见的问题,但我觉得我找到的答案并没有真正解决问题。我将概述我的具体用例,并对来自其他SO答案和网络的信息进行总结。 对于我正在编写的服务,数据库条目被创建并存储在移动设备和我们的网站上,需要以两种方式同步。我们目前的目标是Android和iOS,它们都使用sqlite作为关系数据库。服务器端是使用Django和MySQL在Python中实现的,但将来可能会有其他解决方案取代它。

  • 我有一个Flink程序,它接受两个流,即数据/传感器读数流和警报规则流。我正在广播规则流,并将其连接到数据流以生成动态警报。ProcessingTime的一切都很好,但EventTime却不行。我已经分配了时间戳 > 当两个流(即带有时间戳的流)同时出现时,如何使用“EventTime”生成警报 我是否也必须为我的规则流分配时间戳和水印? 因为我的规则流只有在有任何添加/修改时才会有记录。是否有任

  • 任何一个都可以,要求数据是一个字符串化的JSON对象。我的查询将返回用户在给定时间范围内的所有数据。哪种模式更有意义,或者有更好的方法来解决这个问题?

  • 本文向大家介绍sqlite时间戳转时间语句(时间转时间戳),包括了sqlite时间戳转时间语句(时间转时间戳)的使用技巧和注意事项,需要的朋友参考一下 下面是具体的实现代码:

  • 我想指定特定格式的日志记录时间戳%d{YYYY-MM-dd HH: mm: ss. SSS},但是我操作模式,时间戳显示为2015-10-19 00:47:15,423。 指定%d{ISO8601}或%d{ABSOLUTE}正在生效。我想知道当指定自定义模式时,如何选择时间戳格式。 如果我想将逗号分隔符改为句号,有没有办法做到这一点?

  • 程序的一个通常需求是计算从Unix起始时间开始到某个时刻的秒数,毫秒数,微秒数等。 我们来看看Go里面是怎么做的。 package main import "fmt" import "time" func main() { // 使用Unix和UnixNano来分别获取从Unix起始时间 // 到现在所经过的秒数和微秒数 now := time.Now() secs