首页 > 解决方案 > 在 log4j2 中为自定义 Header 扩展 PatternLayout

问题描述

我也需要覆盖 Log4j2 的 PatternLayout 中的“getHeader()”函数。标头不仅仅是一个静态字符串,所以我不能只在配置中使用“标头”属性。我必须在运行时调用一个函数来获取状态信息并将它们添加到标题中。

我已经尝试了一些扩展 PatternLayout 的示例,但没有成功。甚至官方 log4j 文档中的示例也不起作用。在 Logback 上,扩展“getHeader()”函数要容易得多,而且运行良好。

我也在 Patternlayout 中使用查找和 header 属性进行了尝试,这通常可以正常工作,但它永远不会刷新滚动文件的值。

标签: log4j2

解决方案


我现在可以通过查找来解决它:log4j2.yml:

PatternLayout:
      Pattern: "%date{yyyy-MM-dd HH:mm:ss.SSS}{UTC}; %msg; %level; %logger; %class; %method; %thread; [%file:%line]%n"
      Header: $${headerlookup:header}

查找插件:

@Plugin(name = "headerlookup", category = StrLookup.CATEGORY )
public class IONLog4j2HeaderLookup extends AbstractLookup {

/**
 * Lookup the value for the key using the data in the LogEvent.
 * @param event The current LogEvent.
 * @param key  the key to be looked up, may be null
 * @return The value associated with the key.
 */
@Override
public String lookup(final LogEvent event, final String key) {
    return new IONLogLayout().getFileHeader();
}

}

不要忘记 "$$" 在运行时读取值。


推荐阅读