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

设置特定Log4j2记录器的属性

欧阳嘉年
2023-03-14

根据Log4j 2手册:

LoggerConfig(包括根LoggerConfig)可以配置属性,这些属性将添加到从ThreadContextMap复制的属性中。这些属性可以从应用程序、筛选器、布局等中引用,就像它们是线程上下文映射的一部分一样。

但是,我找不到怎么做。我尝试了以下方法:

<Configuration>
  <Appenders>
    <Console name="stdout">
      <PatternLayout charset="UTF-8">
        <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{concern}] [%-5p] %c: %m%n</Pattern>
      </PatternLayout>
    </Console>
  </Appenders>
  <Loggers>
    <Root level="INFO">
      <AppenderRef ref="stdout"/>
    </Root>
    <Logger name="com.example.log4j2.Foo">
      <Properties>
        <Property name="concern">foo</Property>
      </Properties>
    </Logger>
    <Logger name="com.example.log4j2.Bar">
      <Properties>
        <Property name="concern">bar</Property>
      </Properties>
    </Logger>
  </Loggers>
</Configuration>

使用此配置,ThreadContextMap将不会有任何“关注”键,并且状态记录器将输出:

尝试将属性属性属性分配给类别org类型的列表时出错。阿帕奇。登录中。log4j。果心查找。与类org不兼容的插值器。阿帕奇。登录中。log4j。果心配置。所有物

ERROR logger Logger没有匹配元素Properties的参数

如何将属性附加到依赖于记录器的日志事件?

共有1个答案

郤坚诚
2023-03-14

我通过搜索log4j git repo找到了解决方案: the

请参阅log4j loggerprops。来自测试资源的xml文件:

<Configuration status="OFF" strict="false" name="DSI">
  <Properties>
    <Property name="test2">test2default</Property>
    <Property name="attribKey" value="attribValue" />
    <Property name="duplicateKey" value="attribValue">nodeValue</Property>
    <Property name="test5">${sys:test:-${sys:test2}}</Property>
  </Properties>
  <Appenders>
    <List name="List">
      <PatternLayout pattern="[%-5level] %c{1.} user=%X{user} phrasex=%X{phrasex} test=%X{test} test2=$${sys:test2} test3=$${sys:test3:-Unknown} test4=$${sys:test3:-${sys:test}} test5=${test5} attribKey=$${attribKey} duplicateKey=$${duplicateKey}%msg%n" />
    </List>
  </Appenders>

  <Loggers>
    <Logger name="org.apache.logging.log4j.core" level="debug" additivity="false">
      <Property name="user">$${sys:user.name}</Property>
      <Property name="phrasex">${sys:user.phrasex:-****}</Property>
      <Property name="test">${sys:test}</Property>
      <AppenderRef ref="List"/>
    </Logger>
    <Root level="debug">
      <Property name="user">${sys:user.name}</Property>
      <Property name="phrasex">${sys:user.phrasex:-****}</Property>
      <Property name="test">${sys:test}</Property>
      <AppenderRef ref="List" />
    </Root>
  </Loggers>
</Configuration>

 类似资料:
  • 上面是log4j2的一个片段。xml配置文件,我想将其转换为属性。 问题是当我在同一个文件(属性)中定义多个记录器时,只有根记录器工作,这意味着改变其他记录器的级别不会做任何事情。 在同一个属性配置文件中定义多个记录器的正确方法是什么? 编辑: 这是我尝试过的属性配置,但不起作用。

  • 由此我从NetBeans得到以下错误消息: 所有异常消息都写入控制台,包括用户日志的消息。所以我知道两个伐木工都在工作。记录器附加器写入文件OK。userLog记录器不会创建任何文件,它使用几乎相同的附加器。 看来我还没有正确地命名一些东西来允许log4j2找到记录器。我试过各种命名的组合来弄对它,但我搞不清问题出在哪里。 我必须在每个类的记录器初始化中包含类名吗? 编辑:我需要包含包名。我花了一

  • 我尝试配置Log4j2几个小时,但无法解决这个问题。 编辑: 来自的日志:

  • 我正在尝试在当前在自由配置文件服务器中运行的REST Web方法中设置异步日志记录(出于性能原因)。 为了做到这一点,我设置了以下属性: 我的问题是,无论我在哪里这样做,有时它会工作并且日志记录非常快,有时则不会。 我在构造函数中尝试了(a)包含所有REST web方法的类(b)在filter doFilter方法中,该方法在REST方法本身的filter init方法(d)中的REST方法(c)