问题描述
我已经以域模式格式配置了我的 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>
我尝试了以下内容:
<logger category="stdout" use-parent-handlers="false">
<level name="INFO"/>
<handlers>
<handler name="CUSTOM-FILE"/>
</handlers>
</logger>
我们使用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 控制台附加程序中配置的内容。