java - 如何在tomcat中设置log4j2文件夹?

标签 java spring spring-boot log4j2 tomcat8

我正在 tomcat8 中运行 spring-boot war 应用程序,并使用 log4j2 进行日志记录。 问题:

  • 在错误的目录中发现日志
  • 日志无法正常旋转

log4j2.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
       <Appenders>
        <RollingRandomAccessFile name="APP" fileName="logs/my-application.log"
                                 filePattern="logs/archive/my-application-%d{yyyy-MM-dd}.log">
            <PatternLayout pattern="%d %p %c{1.}: %m%n" charset="UTF-8" />
            <Policies>
                <TimeBasedTriggeringPolicy modulate="true"/>
            </Policies>
        </RollingRandomAccessFile>
    </Appenders>

    <Loggers>
       <Root level="DEBUG">
            <AppenderRef ref="APP" />
        </Root>
    </Loggers>
</Configuration>

pom.xml:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-log4j2</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-web</artifactId>
    </dependency>

结果:日志位于 /var/log/tomcat8/my-application.log 中。存档位于 /var/log/tomcat8/my-application.log.gz

这确实很奇怪。选取正确的记录器文件名。但现在是文件夹。

问题:为什么我的 /logs 文件夹没有被考虑在内?为什么压缩的存档名称不包含时间戳?

旁注:在我的想法中将应用程序作为 jar 运行效果非常好。它会自动在类路径根目录下创建一个 /logs 文件夹。所有文件都在午夜正确移动到 /archive,并带有时间戳!

但是为什么这不能像在 tomcat 中那样工作?

最佳答案

找到原因:

如果 fileName 开头没有 /,则相对于 catalina.base=/var/lib/tomcat8 该文件夹内有一个符号链接(symbolic link) /logs。因此 fileName="logs/myapp" 将遵循该符号链接(symbolic link)。它指向 /var/log/tomcat8

因此,所有文件都会写入该文件夹。 此外,一些 tomcat 默认的 logrotate 似乎会获取该文件夹内的所有文件并自动压缩它。所以log4j没有机会应用logrotate。

解决方案:只需为文件名设置附加子路径即可。我用过:

fileName="logs/logs/my-application.log"
filePattern="logs/logs/my-app..."

这会将日志文件移动到:

/var/log/tomcat8/logs
/var/log/tomcat8/logs/archive

关于java - 如何在tomcat中设置log4j2文件夹?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44881009/

相关文章:

java - 如何在android对话框中获取用户的评分值?

java - 从android中的另一个应用程序启动一个应用程序的Activity

java - Spring在父类和子类之间的使用。 Spring 注入(inject)后设定值的问题

java - Spring javax.validation 注释未在 BindingResult 中捕获

java - JPA更新父子

java - 为什么 Spring 在处理端点异常时将 RuntimeException 包装在 NestedServletException 中?

java - Flyway Maven 插件从外部配置文件执行 GOLS

java - Spring Boot application.yml 全局设置数据源属性,被忽略

java - 我需要帮助。我正在编写一个有 GUI 的程序

java - Spring 启动 : Mocking SOAP Web Service