4

我有以下 log4j2 配置

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="TRACE">
    <Appenders>
        <RollingRandomAccessFile name="SQLTiming" fileName="${web:rootDir}/log/SQLTiming.log"
            filePattern="${web:rootDir}/log/SQLTiming-%d{yyyy-MM-dd}.log">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{2} - %msg%n" />
            <Policies>
                <TimeBasedTriggeringPolicy />
            </Policies>
        </RollingRandomAccessFile>
        <Console name="CONSOLE">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{2} - %msg%n" />
        </Console>
    </Appenders>
    <Loggers>
        <Logger name="jdbc.sqltiming" level="info" additivity="false">
            <AppenderRef ref="SQLTiming" />
        </Logger>
        <Root level="error">
            <AppenderRef ref="CONSOLE" />
        </Root>
    </Loggers>
</Configuration>

当我尝试通过 slf4j 获取记录器时

    protected static Logger logger = LoggerFactory.getLogger(DbConn.class);

Log4j 创建附加程序失败。我查看了 log4j2 源代码,它尝试创建文件C:\Program Files\eclipse\${web:rootDir}\log\SQLTiming.log(它失败了),所以似乎 log4j 没有处理查找。

我在 Tomcat 7.0.4 中运行该应用程序,并使用http://logging.apache.org/log4j/2.x/manual/lookups.html建议的语法。我曾尝试使用 $${web:rootDir} (带有 2 个 $ 标记),这导致其中一个 $-s 被删除,但查找仍然没有成功。事实上,其他查找都没有成功(例如环境变量)。Log4j 版本是 2.0 beta9。

有没有其他人见过类似的东西?我错过了什么吗?

4

3 回答 3

2

对于容器,servlet 3.0您必须配置如下:log4jContextNameweb.xml

<context-param>
    <param-name>log4jContextName</param-name>
    <param-value>log4jContext</param-value>
</context-param>
于 2014-12-14T12:21:29.133 回答
0

您是在 Tomcat 中独立运行,还是在 Eclipse 插件中运行?如果 Log4J 找不到查找的值,它将创建一个名称中包含模式的文件(这就是您所看到的)。所以查找失败。它尝试创建的文件位于 Eclipse 安装目录下的事实告诉我,您正在运行的进程是 Eclipse,而不是 Tomcat。你用的是哪个插件?

可能是当将 Tomcat 作为 Eclipse 插件运行时,并非所有 ${web:...} 环境变量都设置正确。当您在 Tomcat 独立中使用上述设置运行时,我希望事情能够正常工作,您能验证一下吗?

我不确定 Log4J 团队可以对此做些什么,但您可以尝试在https://issues.apache.org/jira/browse/LOG4J2提出这个问题。您也可以尝试联系 Eclipse Tomcat 插件的作者。

于 2013-09-25T21:44:40.893 回答
0

解决方案实际上是按照描述的步骤进行的

http://logging.apache.org/log4j/2.x/manual/webapp.html

(我的应用程序在 servlet 2.5 容器中运行)

我只是不知何故错过了这篇文档(顺便说一句,这很好)

于 2013-09-25T21:59:10.447 回答