如何在 Tomcat 8 中为 Web 应用程序配置 log4j2?
How to configure log4j2 for a web application in Tomcat 8?
我正在 Tomcat 8.0.24 上将 Web 服务部署为 Web 应用程序 (war)。应用程序罐已经过测试并且可以正常工作。现在出于配置和测试 log4j 的目的,我引发了运行时错误(未连接数据库)。
我正在尝试将 log4j2 设置为仅用于应用程序日志记录(不适用于 tomcat)并且我正在使用 Netbeans 8.0.2 构建 war.
我在类路径中包含了以下 jar:
log4j-api-2.8.jar
log4j-core-2.8.jar
log4j-web-2.8.jar
log4j-jcl-2.8.jar
commons-logging.jar
和 log4j2.xml 在 WEB-INF 中,只有根记录器配置为捕获来自网络应用程序的所有内容:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration strict="true" status="TRACE">
<Properties>
<Property name="filename">C:\logs\Myapp.log</Property>
</Properties>
<Appenders>
<Appender type="Console" name="Console" target="SYSTEM_OUT">
<Layout type="PatternLayout">
<Pattern>%d{HH:mm:ss.SSS} - %-5level %logger - %msg%n</Pattern>
</Layout>
</Appender>
<Appender type="File" name="FileAppender" fileName="${filename}" append="true" immediateFlush="true">
<Layout type="PatternLayout">
<Pattern>%d %p %logger -%C- %m%n</Pattern>
</Layout>
</Appender>
</Appenders>
<Loggers>
<Root level="ERROR">
<AppenderRef ref="Console"/>
<AppenderRef ref="FileAppender" level="WARN"/>
</Root>
</Loggers>
</Configuration>
为了以防万一,我还配置了 catalina.properties 以覆盖默认的 jarsToSkip:
tomcat.util.scan.StandardJarScanFilter.jarsToScan=log4j-core*.jar,log4j-taglib*.jar,log4j-api*.jar,log4j-web*.jar,log4j-jcl*.jar`
我相信 log4j 被正确初始化为 catalina*.log 状态,由于 status="TRACE":
2017-02-08 14:06:52,355 http-nio-8080-exec-8 DEBUG Log4jServletContextListener ensuring that Log4j starts up properly.
2017-02-08 14:06:52,357 http-nio-8080-exec-8 DEBUG Log4jServletFilter initialized.
还因为创建了日志文件。
但是,来自应用程序(Web 服务 jar)的所有运行时错误消息都以 catalina*.log 结尾,而不是我配置的文件附加程序。此外,catalina*.log 中的那些错误消息不遵循 Appenders 定义中定义的任何模式,因此基本上看起来 log4j2 被忽略了。
我做错了什么?
在 log4j 的文档中,我发现 Components 下有一个 log4j 1.2 API 并且它声明它 "allows applications coded to use Log4j 1.2 API to use Log4j 2 instead."
嗯,我发现应用程序的 jar 是使用以前版本的 log4j 开发的。所以我包括了 log4j-1.2-api-2.8.jar 并删除了 log4j-jcl-2.8.jar 和
commons-logging.jar 就成功了。现在应用程序的日志消息被发送到配置为附加程序的文件。
也许值得一提的是,添加log4j-1.2-api-2.8.jar后的第一次测试没有成功,所以我猜与我后来删除的罐子有点冲突。
我正在 Tomcat 8.0.24 上将 Web 服务部署为 Web 应用程序 (war)。应用程序罐已经过测试并且可以正常工作。现在出于配置和测试 log4j 的目的,我引发了运行时错误(未连接数据库)。
我正在尝试将 log4j2 设置为仅用于应用程序日志记录(不适用于 tomcat)并且我正在使用 Netbeans 8.0.2 构建 war.
我在类路径中包含了以下 jar:
log4j-api-2.8.jar
log4j-core-2.8.jar
log4j-web-2.8.jar
log4j-jcl-2.8.jar
commons-logging.jar
和 log4j2.xml 在 WEB-INF 中,只有根记录器配置为捕获来自网络应用程序的所有内容:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration strict="true" status="TRACE">
<Properties>
<Property name="filename">C:\logs\Myapp.log</Property>
</Properties>
<Appenders>
<Appender type="Console" name="Console" target="SYSTEM_OUT">
<Layout type="PatternLayout">
<Pattern>%d{HH:mm:ss.SSS} - %-5level %logger - %msg%n</Pattern>
</Layout>
</Appender>
<Appender type="File" name="FileAppender" fileName="${filename}" append="true" immediateFlush="true">
<Layout type="PatternLayout">
<Pattern>%d %p %logger -%C- %m%n</Pattern>
</Layout>
</Appender>
</Appenders>
<Loggers>
<Root level="ERROR">
<AppenderRef ref="Console"/>
<AppenderRef ref="FileAppender" level="WARN"/>
</Root>
</Loggers>
</Configuration>
为了以防万一,我还配置了 catalina.properties 以覆盖默认的 jarsToSkip:
tomcat.util.scan.StandardJarScanFilter.jarsToScan=log4j-core*.jar,log4j-taglib*.jar,log4j-api*.jar,log4j-web*.jar,log4j-jcl*.jar`
我相信 log4j 被正确初始化为 catalina*.log 状态,由于 status="TRACE":
2017-02-08 14:06:52,355 http-nio-8080-exec-8 DEBUG Log4jServletContextListener ensuring that Log4j starts up properly.
2017-02-08 14:06:52,357 http-nio-8080-exec-8 DEBUG Log4jServletFilter initialized.
还因为创建了日志文件。
但是,来自应用程序(Web 服务 jar)的所有运行时错误消息都以 catalina*.log 结尾,而不是我配置的文件附加程序。此外,catalina*.log 中的那些错误消息不遵循 Appenders 定义中定义的任何模式,因此基本上看起来 log4j2 被忽略了。
我做错了什么?
在 log4j 的文档中,我发现 Components 下有一个 log4j 1.2 API 并且它声明它 "allows applications coded to use Log4j 1.2 API to use Log4j 2 instead."
嗯,我发现应用程序的 jar 是使用以前版本的 log4j 开发的。所以我包括了 log4j-1.2-api-2.8.jar 并删除了 log4j-jcl-2.8.jar 和 commons-logging.jar 就成功了。现在应用程序的日志消息被发送到配置为附加程序的文件。
也许值得一提的是,添加log4j-1.2-api-2.8.jar后的第一次测试没有成功,所以我猜与我后来删除的罐子有点冲突。