gpt4 book ai didi

java - Log4j 日志在错误的文件中滚动(在当天之前,跳过周末)

转载 作者:行者123 更新时间:2023-11-28 23:30:09 29 4
gpt4 key购买 nike

我正在使用 log4j-1.2.16.jar 或我的项目这是我的 log4j.properties

# The default root appender - used to log service calls to console
log4j.rootLogger=INFO, LOGGER1, LOGGER2
#LOGGER1 is set to be a ConsoleAppender which outputs to System.out.
log4j.appender.LOGGER1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.LOGGER1.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGGER1.DatePattern='.'yyyy-MM-dd
log4j.appender.LOGGER1.layout.ConversionPattern=[%d] %p [%X{USER_EMAIL}] %t %c - %m%n
log4j.appender.LOGGER1.File=D:/DevLogs/logger1.log
log4j.appender.LOGGER1.Threshold = ERROR

# An extra category to a log API Calls to a file
log4j.appender.LOGGER2=org.apache.log4j.DailyRollingFileAppender
log4j.appender.LOGGER2.DatePattern='.'yyyy-MM-dd
log4j.appender.LOGGER2.File=D:/DevLogs/logger2.log
log4j.appender.LOGGER2.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGGER2.layout.ConversionPattern= [%d] %p [%X{USER_EMAIL}] %t %c - %m%n
log4j.appender.LOGGER2.Threshold = INFO

以前,我有两个 tomcat 服务器用于两个不同的应用程序,其中包含两个 log4j.properties 和正确创建的日志。现在我只有一个 tomcat 服务器,我们将这两个应用程序 war 合并为一个 war 。但是有几个服务依赖于这个应用程序,我们需要为一个版本提供向后兼容性。所以我们在 tomcat 上只有一个 war 文件,但是通过更改 server.xml 中的配置,我们使用它来创建两个不同的上下文。这是我的 server.xml

的片段
<Connector port="8180" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8445" server="Not Available"  maxThreads="1500"/>
<Connector port="8280" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8445" server="Not Available" maxThreads="1500"/>

<Context docBase="application.war" path="/firstApplication" reloadable="true" />
<Context docBase="application.war" path="/secondApplication" reloadable="true" />

应用程序运行良好。但是我的日志滚动到错误的文件中。例如,今天是 7 月 2 日,所以直到下午,日志都可以正常工作,但之后 7 月 2 日的日志在一天之前开始打印,即 7 月 1 日的文件。另一个复杂的是这个过程跳过周末。意味着周六和周日,日志很好,但周一的日志在周五的日志文件中移动。我完全空白,出了什么问题。相同的配置文件适用于两个不同的服务器,但在两个逻辑上下文中存在问题。如果有人有任何建议,请告诉我。

最佳答案

这听起来好像您在容器中有两个具有相同日志配置的应用程序(上下文)——它们将相互踩踏——几乎可以肯定。

这可以解释为什么您的日志滚动行为如此不稳定。

对此没有简单/容易的解决方法。您可以研究外部滚动机制,例如 logrotate(如果您在 unix 系统上托管)作为一个选项。

不过,您也许可以结合使用 logback+slf4j 来解决这个问题。 Slf4j 为插件重新路由库提供了一个插件来颠覆基于 log4j 的日志记录。我已经使用它在应用程序中用 logback+slf4j 替换 log4j,并设法确保依赖库(针对 log4j 编写)仍然正常运行。

此外,您可以利用 logback 的 context selector以确定什么/何时轮换日志文件。

如果不提供单独的应用程序部署,您的 log4j 配置将在两个应用程序之间发生冲突并导致您所看到的行为。

编辑 根据 OP 的问题/评论,以下内容应提供一种方法来完成基于上下文的选择。

关于您的情况,它是在两个上下文中部署的一个应用程序,请尝试从 server.xml 执行以下操作。它将为部署的上下文提供进入 JNDI 树的环境条目。

<Context docBase="application.war" path="/firstApplication" reloadable="true">
<Environment name="logback/context-name" value="firstApplication" type="java.lang.String" />
</Context>
<Context docBase="application.war" path="/secondApplication" reloadable="true">
<Environment name="logback/context-name" value="secondApplication" type="java.lang.String" />
</Context>

此时,您应该能够根据上下文选择器遵循文档。

关于java - Log4j 日志在错误的文件中滚动(在当天之前,跳过周末),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31514300/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com