Log4j.xml %replace布局中的用法,PatternLayout标记

k5ifujac  于 2023-04-11  发布在  其他
关注(0)|答案(1)|浏览(286)

我一直试图屏蔽(替换)日志中的某些字符串,尝试升级log4j并使用%replace,但无法替换文本。以下是最初在我的log4j.xml中的代码(更改前)

<layout class="org.apache.log4j.PatternLayout">  -->
                        <!-- The log message pattern -->
    <param name="ConversionPattern" value="%5p %d{ISO8601} [%t][%x] %c - %m%n" />
</layout>

变更如下:

<layout class="org.apache.log4j.PatternLayout">  -->
                            <!-- The log message pattern -->
        <param name="ConversionPattern" value="%5p %d{ISO8601} [%t][%x] %c - %replace{%m%n}{<Name1>(?:.+?)</Name1>}{<Name1>*****</Name1>}" />
    </layout>

还尝试了以下操作:

<PatternLayout>

        <Pattern>%replace{%5p %d{ISO8601} [%t][%x] %c - %m%n}{<Name1>(?:.+?)</Name1>}{<Name1>*****</Name1>}</Pattern>
 
</PatternLayout>

我的依赖关系如下:

<dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-core</artifactId>
                <version>2.20.0</version>
            </dependency>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
                <version>2.0.0-alpha5</version>
                <exclusions>
                <exclusion>
                <groupId>log4jversion1</groupId> <!-- Exclude Project-E from Project-B -->
                 <artifactId>log4j-core</artifactId>
                 </exclusion>
                </exclusions>
            </dependency>

但它不是打印日志后,我的变化...我写正确的语法%替换在正确的地方?任何帮助将不胜感激,提前感谢..

ql3eal8s

ql3eal8s1#

虽然在类路径上有Log4j 2.x Core,但也使用SLF4J到Log4j 1.x绑定(slf4j-log4j12),它将Log4j 1.x作为传递依赖项。
在这样的配置下,SLF4J将使用Log4j 1.x,而Log4j 2.x API将使用Log4j 2.x Core。
要将所有内容重定向到Log4j 2.x Core,请像这样更改依赖项:

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-bom</artifactId>
      <version>2.20.0</version>
      <scope>import</scope>
      <type>pom</type>
    </dependency>
  </dependencies>
</dependencyManagement>
<dependencies>
  <!-- If your code uses SLF4J: -->
  <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>2.0.7</version>
  </dependency>
  <!-- If your code uses Log4j 2.x API -->
  <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
  </dependency>
  <!-- Redirects SLF4J 2.x to Log4j 2.x API: -->
  <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j2-impl</artifactId>
    <scope>runtime</scope>
  </dependency>
  <!-- Reference implementation of Log4j 2.x API: -->
  <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <scope>runtime</scope>
  </dependency>
</dependencies>

您还需要将log4j.xml文件转换log4j2.xml文件,因为2.x版本使用不同的语法(参见文档)。
阵列布局定义如下所示:

<PatternLayout pattern="%5p %d{ISO8601} [%t][%x] %c - %replace{%m%n}{<Name1>(?:.+?)</Name1>}{<Name1>*****</Name1>}"/>

或者,如果您更喜欢在整个日志记录事件上运行regex:

<PatternLayout pattern="%5p %d{ISO8601} [%t][%x] %c - %m%n">
  <Replace pattern="<Name1>(?:.+?)</Name1>"
           substitution="<Name1>*****</Name1>"/>
</PatternLayout>

相关问题