为什么catalina.home_IS_UNDEFINED目录是由Logback在同一个项目目录中生成的?

时间:2014-06-12 12:31:38

标签: java tomcat playframework-2.0 logback

我为我的应用程序编写了logback配置文件,但是当我在进行maven clean install(mvn clean install)时,它在项目目录中生成了一个带有日志文件的catalina.home_IS_UNDEFINED目录。 为什么生成这个目录?

我不希望它出现在我的项目目录中。

解决此问题的任何帮助?

这是配置文件。

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>

    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%date{HH:mm:ss.SSS} %-5p [%t] %c{1} - %m%n</pattern>
        </encoder>
    </appender>

    <appender name="MY_APP_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${catalina.home}/logs/myApplication.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${catalina.home}/logs/myApplication.%d{yyyy-MM-dd}.log</FileNamePattern>
        </rollingPolicy>
        <encoder>
            <pattern>%-5p  %date{HH:mm:ss.SSS} [%t] %c{1} - %m%n</pattern>
        </encoder>
        <append>true</append>
    </appender>

    <logger name="org.springframework" level="WARN"/>


    <root>
        <priority value="INFO"/>
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="MY_APP_LOG"/>
    </root>

</configuration>

5 个答案:

答案 0 :(得分:9)

背景

此属性加载失败,因为它仅由tomcat填充。它没有被 maven编译任务填充。

解决方案1 ​​

在logback.xml中设置这样的属性

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <if condition='isDefined("catalina.home")'>
        <then>
            <property name="log.folder" value="${catalina.home}/logs"/>
        </then>
        <else>
            <property name="log.folder" value="./target/logs"/>
        </else>
    </if>

    <appender name="companyMyAppServiceAppender" class="ch.qos.logback.core.FileAppender">
        <file>${log.folder}/company.myApp.log</file>
        ...
    </appender>

    ...

</configuration>

这将在编译时在目标文件夹中创建日志文件,该文件将被清除。

解决方案2

“重写”值:

<property name="log.folder" value="./target/logs"/>
<if condition='isDefined("catalina.home")'>
    <then>
        <property name="log.folder" value="${catalina.home}/logs"/>
    </then>
</if>

NB!

不要忘记导入maven janino依赖

<!-- The org.codehaus.janino:commons-compiler:2.7.8 dependency -->
<!-- will be automatically pulled in by Maven's transitivity rules -->
<dependency>
    <groupId>org.codehaus.janino</groupId>
    <artifactId>janino</artifactId>
    <version>2.7.8</version>
</dependency>

答案 1 :(得分:3)

我遇到了类似的问题并确定它是由我的单元测试缺乏正确的Tomcat环境引起的。

我的最小解决方案是将以下src/test/resources/logback.xml添加到我的Maven项目目录中:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <property name="catalina.home" value="target" />
</configuration>

单元测试生成的日志最终出现在target目录中,而不是项目的顶级目录。

答案 2 :(得分:1)

我建议不要依赖janino依赖项(在这种情况下为1 MB,什么也不做),有一种使用logback的默认值实现的更简单解决方案,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <property name="base.folder" value="${catalina.home:-./target}"/>

    <appender name="MY_APP_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${base.folder}/logs/myApplication.log</file>
        ...
    </appender>

    ...

</configuration>

在变量名和默认值之间寻找:-字符。 如果${catalina.home}变量为空,将使用默认值(在这种情况下为./target)。

答案 3 :(得分:0)

<file>${catalina.home}/logs/myApplication.log</file>

在服务器(tomcat)启动期间。 Logback API尝试将logback.xml中的$ {catalina.home}变量替换为环境变量,通常是-Dcatalina.home java环境,该环境通常等于内部由tomcat“ catalina.sh”设置的CATALINA_HOME。
如果环境变量(即“ catalina.home”)的设置是否正确,则需要检查tomcat的“ catalina.sh”或“ catalina.bat”。
“ catalina.home_IS_UNDEFINED”表示Logback无法将其替换为任何系统或环境变量。

答案 4 :(得分:-3)

尝试改变:

<logger name="org.springframework" level="WARN"/>

为:

<logger name="org.springframework" level="OFF"/>