【问题标题】:Why catalina.home_IS_UNDEFINED directory is generated by Logback in the same project directory?为什么catalina.home_IS_UNDEFINED目录是Logback在同一个项目目录下生成的?
【发布时间】:2014-06-12 12:31:38
【问题描述】:

我已经为我的应用程序编写了 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>

【问题讨论】:

    标签: java tomcat playframework-2.0 logback


    【解决方案1】:

    背景

    此属性加载失败,因为它仅由 tomcat 填充。它不是由 ma​​ven compile 任务填充的。

    解决方案 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>
    

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

    解决方案 2

    “重写”值:

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

    注意!

    别忘了导入 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>
    

    【讨论】:

      【解决方案2】:

      我建议不要依赖 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】:

        我遇到了类似的问题,并确定这是由于我的单元测试缺少适当的 Tomcat 环境造成的。

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

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

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

        【讨论】:

          【解决方案4】:
          <file>${catalina.home}/logs/myApplication.log</file>
          

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

          【讨论】:

            【解决方案5】:

            尝试改变:

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

            到:

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

            【讨论】:

            • 它创建 %catalina.home 目录。 ??
            • 等等,你来这里的目的是什么?你要把这些日志放在哪里?
            • 实际上,我想使用 maven 构建应用程序,当我执行 mvn clean install 时,它会生成我想部署在 tomcat 上的 war 文件。现在问题是当我构建应用程序时,它会在我上面提到的项目目录中生成不必要的目录。
            • 好的,所以检查我的编辑,以完全关闭日志记录。
            • 但它没有解决我的问题仍然生成相同的目录。
            猜你喜欢
            • 1970-01-01
            • 2014-10-21
            • 2022-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-03-19
            • 2019-06-25
            • 2018-03-23
            相关资源
            最近更新 更多