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

PatternConverter无法与log4j2.17中的异步appender一起工作。十、

邵麒
2023-03-14

我们使用PatternConverter来制作自定义转换模式以将sesionId包含在日志中,它在SMTP/控制台和文件附加程序中工作,没有任何问题,但是如果我们用Async包装附加程序(这里使用SMTP),它会在模式的位置变空

例如:转换模式:%p:(%s)%c{1}:%m%n时间:%d{yyyy-MM-dd HH: mm: ss}

s---

同步SMTP附加程序正在邮寄以下日志(完美工作):

信息:(c5cwdac4-fw8e-12ec-cabf056af41fc)MyLoggerClass:Hello World。时间:2022-06-24 00:25:34

异步SMTP appender正在邮寄以下日志:

信息:()MyLoggerClass:Hello World。时间:2022-06-24 00:26:34

c5cwdac4-fw8e-12ec-cabf056af41fc--

配置:

<?xml version="1.0" ?>
<Configuration name="DefaultLogger" status="INFO">
<Appenders>
<SMTP name="SMTP" from="abc@xyz.com" to="acb@xyz.com" subject="Log4jLogger Test Message" smtpHost="mail" bufferSize="1"><PatternLayout pattern="%p: (%s) %c{1}: %m%n Time: %d{yyyy-MM-dd HH:mm:ss}"/>
<ThresholdFilter onMatch="ACCEPT" onMismatch="DENY" level="ERROR"/>
</SMTP>
<Async name="Async" includeLocation="true">
<AppenderRef ref="SMTP"/>
</Async></Appenders>
<Loggers>
<Logger name="com" level="INFO"/>
<Root level="INFO">
<AppenderRef ref="Async"/></Root>
</Loggers>
</Configuration>

注意:includeLocation设置为True,但没有帮助!

共有1个答案

颜均
2023-03-14

您的自定义模式转换器可能是罪魁祸首。虽然您不共享其源代码,但它可能使用ThreadLocal来存储会话id。

Log4j2延迟格式化日志消息,仅当它们实际上将由appender发送时。这发生在异步调用之后,在运行SMTP appender的线程上,其中ThreadLocal没有值。

解决这个问题的最简单方法是去掉自定义模式转换器,并使用标准的Log4j2机制:ThreadContext。在工作线程上,需要保存会话id的值:

ThreadContext.put("sessionId", ...);

try (CloseableThreadContext.Instance ctx = CloseableThreadContext.put("sessionId", ...)) {
    ...
}

并在您的模式中使用%X{ses sionId}(参见内置模式)。

 类似资料:
  • 问题内容: 我想知道为什么没有确定的合作方式。我只想解析字符串: 但是我真的很困惑应该导入什么。根据此链接,我尝试导入。但是我得到这个编译错误: 然后我尝试导入和。因此,没有编译错误,但是我得到了此运行时异常(在mapper定义行中): 请指导我,我应该导入什么才能使用。谢谢 问题答案: 使用这些依赖项 jackson-databind jackson-annotations jackson- c

  • 我对scrollview和GeometryReader有一些问题。我想要一张图片下的物品清单。每个项目都应该有以下宽度和高度: 我为我的用例尝试了两种方法。这是我的第一个代码结构: 我正在使用几何体读取器来获取VStack的宽度,因为它有一个填充,我不想获得滚动视图的全宽。 但对于GeometryReader,UI上只显示ForEach循环中的最后一项。而GeometryReader只有很小的高度

  • 我在使用pymongo进行mongodb聚合时遇到了< code >聚合结果超过最大文档大小(16MB)错误。 起初,我使用< code>limit()选项克服了这个问题。然而,在某个时候,我得到了 好的,我将使用 选项。当我在命令行上使用它时,此选项有效,但是当我尝试在我的 python 代码中使用时,此选项有效 我得到< code>TypeError: aggregate()正好接受2个参数(

  • 问题内容: 在我编写的flask应用程序中,我使用了一个外部库,该库可以使用环境变量进行配置。注意:我自己编写了这个外部库。因此,如有必要,我可以进行更改。从命令行运行时,运行带有以下内容的烧瓶服务器: 一切都如预期。但将它部署到Apache后,用它不工作了。事实上,打印出到(所以它在Apache日志中显示出来显示,该wsgi过程似乎是在一个非常不同的环境(一个,好像是这样了。其实,它指向我的发展

  • 以下结构(在中)不允许我在模块中导入类: 顶层的为空。以下是剩余的文件: a b: 在Windows上,如果我尝试运行(从文件夹中)而不做任何其他操作,我会得到以下错误: 如果我在顶层添加一个: 包含 并运行(从内),我得到同样的错误。 如果我将更改为 然后运行(从文件夹中)或(从)中,我得到了 python文档让我觉得我应该能够做到这一点! 有人能解释一下我为什么会犯这些错误吗?我看到过几篇类似