log4j2 为 FileAppender 指定 tomcat 主目录的相对路径
Posted
技术标签:
【中文标题】log4j2 为 FileAppender 指定 tomcat 主目录的相对路径【英文标题】:log4j2 specify relative path to tomcat home dir for FileAppender 【发布时间】:2013-08-01 10:27:30 【问题描述】:我正在尝试为本地运行的 tomcat 服务器配置 log4j2。我无法将日志传送到与 tomcat 安装相关的位置。
如果我指定一个绝对路径,它就可以工作。如果我使用相对路径,它会输出到System.getProperty("user.dir")
的位置。
但是当我尝试使用$catalina.home
或$catalina.base
时,它不起作用。如果我在启动时输出这两个系统属性,它们会被定义并指向正确的位置。
还有,
Tomcat 7.0.26 servlet 2.5 log4j2.0 beta 8 我们使用的是 slf4j,后面有 log4j2。 我通过环境变量-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
将所有记录器设置为异步。
我的感觉是Tomcat在处理log4j2.xml时可能没有完全初始化?任何想法将不胜感激!
这是我的log4j2.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="debug" name="LoggingConfig">
<appenders>
<FastFile name="ALog" fileName="$catalina.home/logs/test.log" immediateFlush="true" append="true">
<PatternLayout>
<pattern>%d %p %c1. [%t] %m%n</pattern>
</PatternLayout>
</FastFile>
</appenders>
<loggers>
<logger name="a.namespace.dir" level="info" additivity="false">
<appender-ref ref="ALog"/>
</logger>
<root level="info">
<appender-ref ref="ALog"/>
</root>
</loggers>
</configuration>
来自 catalina.out
2013-07-31 11:22:00,313 DEBUG Calling createAppender on class org.apache.logging.log4j.core.appender.FastFileAppender for element FastFile with params(fileName="$catalina.home/logs/test.log", append="true", name="ALog", immediateFlush="true", suppressExceptions="null", PatternLayout(%d %p %c1. [%t] %m%n), null, advertise="null", advertiseURI="null", Configuration(LoggingConfig))
2013-07-31 11:22:00,315 DEBUG Starting FastFileManager $catalina.home/logs/test.log
2013-07-31 11:22:00,316 DEBUG Calling createAppenders on class org.apache.logging.log4j.core.config.plugins.AppendersPlugin for element appenders with params(appenders=ALog)
2013-07-31 11:22:00,317 DEBUG Generated plugins in 0.000016000 seconds
2013-07-31 11:22:00,318 DEBUG Calling createAppenderRef on class org.apache.logging.log4j.core.config.AppenderRef for element appender-ref with params(ref="ALog", level="null", null)
2013-07-31 11:22:00,320 DEBUG Calling createLogger on class org.apache.logging.log4j.core.config.LoggerConfig for element logger with params(additivity="false", level="info", name="a.namespace.dir", includeLocation="null", appender-ref=org.apache.logging.log4j.core.config.AppenderRef@6e8ef177, properties=, Configuration(LoggingConfig), null)
2013-07-31 11:22:00,321 DEBUG Calling createAppenderRef on class org.apache.logging.log4j.core.config.AppenderRef for element appender-ref with params(ref="ALog", level="null", null)
2013-07-31 11:22:00,322 DEBUG Calling createLogger on class org.apache.logging.log4j.core.config.LoggerConfig$RootLogger for element root with params(additivity="null", level="info", includeLocation="null", appender-ref=org.apache.logging.log4j.core.config.AppenderRef@6a8ef455, properties=, Configuration(LoggingConfig), null)
2013-07-31 11:22:00,323 DEBUG Calling createLoggers on class org.apache.logging.log4j.core.config.plugins.LoggersPlugin for element loggers with params(loggers=a.namespace.dir, root)
【问题讨论】:
【参考方案1】:我解决了自己的问题。对于系统属性,您需要在变量前加上 sys:
。
<FastFile name="ALog" fileName="$sys:catalina.home/logs/test.log" immediateFlush="true" append="true">
<PatternLayout>
<pattern>%d %p %c1. [%t] %m%n</pattern>
</PatternLayout>
</FastFile>
重新阅读这部分文档后发现: http://logging.apache.org/log4j/2.x/manual/configuration.html#PropertySubstitution
【讨论】:
+1 用于记录,即使您找到了自己的答案。至少帮助了我。catalina.base
似乎更适合 unix 系统,因为它指向 /var/lib
而不是 /usr/bin
。
Glassfish 相同,而不是 $com.sun.aas.instanceRoot 需要是 $sys:com.sun.aas.instanceRoot
'sys:' 对我来说是关键。谢谢!
哦,节省我的一个月。非常感谢【参考方案2】:
在尝试使用 Tomcat 解决我自己的 log4j2 文件日志记录问题数小时后,我发现了另一个可能的原因。希望这可以为其他人节省一些时间!
我的 Tomcat 目录位于 /Library/Tomcat
。最后,我尝试重新安装 Tomcat,这次将工作目录放在/usr/local
中,并带有指向/Library/Tomcat
的符号链接。这与 Moemars 建议包含 sys
前缀一起解决了我的日志记录问题。
【讨论】:
以上是关于log4j2 为 FileAppender 指定 tomcat 主目录的相对路径的主要内容,如果未能解决你的问题,请参考以下文章