java 无法获取${ Catalina .base},系统属性在log4j2.xml中不起作用?

egdjgwm8  于 2022-12-17  发布在  Java
关注(0)|答案(1)|浏览(176)

以前我们有一个log4j 1.x兼容的xml格式,它配置了这个滚动文件附加器-

<appender name="ALL" class="org.apache.log4j.RollingFileAppender">
        <param name="File" value="${catalina.base}/logs/trw.log" />
        <param name="Append" value="true" />
        <param name="MaxFileSize" value="4096KB" />
        <param name="MaxBackupIndex" value="10" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d %p [%t] %C{1}:%L - %m%n" />
        </layout>
    </appender>

现在我已经将它更改为新的log4j2.xml格式,根据我的研究, Catalina .base将变成这样-

<RollingFile name="ALL" fileName="${sys:catalina.base}/logs/trw.log"
                     filePattern="${sys:catalina.base}/logs/trw_%i.log"
                     append ="true">
            <PatternLayout pattern="%d %p [%t] %c{1}:%L - %m%n"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="4096KB" />
            </Policies>
            <DefaultRolloverStrategy max="10"/>
        </RollingFile>

但是当我运行一个使用这个日志配置的测试文件时,xml文件被找到并加载,一切都很顺利,但是它没有找到系统变量cataline.base,而是创建了一个文件夹${sys: Catalina .base},并将日志放在它下面。我的问题是-这是预期的行为吗?log4j2.xml config是否尝试搜索系统属性,如果没有找到,就创建一个同名的文件夹?这个配置位于一个运行在TomCat 7、spring 3.1和servlet 2.5上的Web应用程序中。日志按预期生成,但似乎只有文件夹名称有问题。

8yparm6h

8yparm6h1#

通过this答案找到了问题的核心。
在log4j2中使用${sys:catalina.base}运行测试时也有同样的问题。
第一个问题是你的应用在Tomcat中运行,而你的测试在Tomcat之外运行。Tomcat本身在启动时从CATALINA_BASE设置变量catalina.base,所以测试的log4j2示例不知道catalina.base这样的变量。
我在我的案例中解决的第二个问题是,我把export CATALINA_BASE="/path/to/catalina/location"放入.bashrc而不是.profile

解决方案

1.将绝对路径设置为(例如,如果您的 Catalina 位于某个用户目录中)"/home/${env:USER}/path/to/cataina/location"

1.将export CATALINA_BASE="/path/to/catalina/location"放入.profile中,然后就可以像${env:CATALINA_BASE}那样设置log4j2属性。

相关问题