如何在 tomcat 中设置 log4j2 文件夹?
How to set log4j2 folder in tomcat?
我是 运行 spring-boot
war
应用程序 tomcat8
并使用 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
该文件夹内有一个符号链接 /logs
。因此 fileName="logs/myapp"
将遵循该符号链接。指向 /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
我是 运行 spring-boot
war
应用程序 tomcat8
并使用 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
该文件夹内有一个符号链接 /logs
。因此 fileName="logs/myapp"
将遵循该符号链接。指向 /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