Wildfly 18 在 log4j 记录器之前添加了服务器日志记录模式

问题描述

我已经以域模式格式配置了我的 WildFly 18 服务器,并且我们使用 log4j 记录器。当我检查 server.log 文件时,log4j 中的所有日志都以 Wildfly 自己的记录器格式记录。像下面的第一行日期和日志级别来自服务器日志,下一个日期格式和日志级别和日志消息来自 log4j。

2021-03-19 00:13:06,623 INFO  2021-03-19 00:13:06,601 INFO  [com.app.connection.service] CurrentThreadID=436 On

搜索了很多...我发现了很多与独立模式相关的配置,有人说这些配置可以在 domain.xml 中完成,但没有任何效果

我在 domain.xml 中有以下配置

          <subsystem xmlns="urn:jboss:domain:logging:8.0">
                <custom-handler name="CUSTOM-FILE" class="org.jboss.logmanager.handlers.PeriodicSizeRotatingFileHandler" module="org.jboss.logmanager">
                    <formatter>
                        <named-formatter name="MY-PATTERN"/>
                    </formatter>
                    <properties>
                        <property name="maxBackupIndex" value="24"/>
                        <property name="rotateSize" value="10000000"/>
                        <property name="suffix" value=".yyyy-MM-dd-HH"/>
                        <property name="append" value="true"/>
                        <property name="fileName" value="${jboss.server.log.dir}/server.log"/>
                    </properties>
                </custom-handler>
                <logger category="com.arjuna">
                    <level name="WARN"/>
                </logger>
                <logger category="io.jaegertracing.Configuration">
                    <level name="WARN"/>
                </logger>
                <logger category="org.jboss.as.config">
                    <level name="DEBUG"/>
                </logger>
                <logger category="sun.rmi">
                    <level name="WARN"/>
                </logger>
                <root-logger>
                    <level name="INFO"/>
                    <handlers>
                        <handler name="CUSTOM-FILE"/>
                    </handlers>
                </root-logger>
                <formatter name="PATTERN">
                    <pattern-formatter pattern="%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p %s%e%n"/>
                </formatter>
                <formatter name="MY-PATTERN">
                    <pattern-formatter pattern="%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p %s%e%n"/>
                </formatter>
                <formatter name="COLOR-PATTERN">
                    <pattern-formatter pattern="%K{level}%d{HH:mm:ss,SSS} %-5p %s%e%n"/>
                </formatter>
            </subsystem>

在 log4j.xml 中,我有一个如下所示的控制台 appender,这个 log4j.xml 存在于模块目录中,路径为 wildfly18.0.1\modules\org\apache\logging\log4j\main\log4j2-props

<Console name="Console">
    <PatternLayout pattern="%d %-5p [%c] %m\n" />
</Console>

我尝试了以下内容

  1. 在日志子系统中添加标签

    <add-logging-api-dependencies value="false"/>
    <use-deployment-logging-config value="false"/>
    
  2. 添加了记录器

 <logger category="stdout" use-parent-handlers="false">
        <level name="INFO"/>
        <handlers>
             <handler name="CUSTOM-FILE"/>
         </handlers>
  </logger>
  1. 从部署中排除子系统和模块。在 meta-inf\jboss-deployment-structure.xml 中添加以下内容

我们使用EAR部署文件

<deployment>
        <exclude-subsystems>
           <subsystem name="logging"/>
        </exclude-subsystems>
        <exclusions>
            <module name="org.apache.commons.logging"/>
            <module name="org.apache.log4j"/>
            <module name="org.jboss.logging"/>
            <module name="org.jboss.logging.jul-to-slf4j-stub"/>
            <module name="org.jboss.logmanager"/>
            <module name="org.jboss.logmanager.log4j"/>
            <module name="org.slf4j"/>
            <module name="org.slf4j.impl"/>
        </exclusions>
    </deployment>

那么,有人可以帮我进行域模式设置的正确配置吗?

提前致谢...

解决方法

我不确定这是一个选项,但 WildFly 22 支持 log4j2,因此您可以使用 WildFly 配置日志记录,而无需包含 log4j2.xml。

您似乎想将 stdout 重定向到一个文件。如果您希望 log4j2 配置控制格式,则需要更改 MY-FORMATTER 的格式。下面是一些用于配置服务器的 CLI 命令。

# Add the pattern for the stdout logger
/subsystem=logging/pattern-formatter=MY-PATTERN:add(pattern="%s%n")
# Create a file to direct stdout to
/subsystem=logging/periodic-size-rotating-file-handler=CUSTOM-FILE:add(named-formatter=MY-PATTERN,max-backup-index=24,rotate-size="10m",suffix=".yyyy-MM-dd-HH",append=true,file={relative-to=jboss.server.log.dir,path=server-stdout.log})
# Create the stdout logger,direct it to the file only
/subsystem=logging/logger=stdout:add(handlers=[CUSTOM-FILE],use-parent-handlers=false)

请注意,我将日志文件重命名为 server-stdout.log,以免覆盖默认的 server.log。这样做的原因是服务器本身将记录到此文件,如果您使用该模式覆盖它,那么来自服务器本身的日志将不会被格式化。

另请注意,写入 System.out 的任何内容最终也会出现在 server-stout.log 中。

,

正如许多其他评论中所写的那样,Jboss 添加了自己的模式,并将应用程序 log4j2.xml 的模式视为自己模式的“消息”。 要解决此问题,请在 Jboss Standalone.xml 的日志记录子系统中添加以下内容

   <subsystem xmlns="urn:jboss:domain:logging:8.0">
    ....
    <console-handler name="stdout-console" autoflush="true">
        <level name="ALL"/>
        <formatter>
            <pattern-formatter pattern="%s%n"/>
        </formatter>
    </console-handler>
    <logger category="stdout" use-parent-handlers="false">
        <handlers>
            <handler name="stdout-console"/>
        </handlers>
    </logger>
    ....
   </subsystem>

这将导致 Jboss 的默认日志模式被覆盖,并且您的日志将具有您在 log4j2.xml 控制台附加程序中配置的内容。