有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我使用的是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服务器,我们在一场战争中合并了这两个应用程序战争。但是有几个服务依赖于这个应用程序,我们需要为一个版本提供向后兼容性。所以我们在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日文件。另一个复杂的过程是跳过周末。意味着周六和周日的日志可以,但周一的日志会在周五的日志文件中移动。 我一片空白,怎么了。同一配置文件适用于两个不同的服务器,但在两个逻辑上下文中存在问题。如果有人有任何建议,请告诉我


共 (1) 个答案

  1. # 1 楼答案

    这听起来像是容器中有两个应用程序(上下文)具有相同的日志配置——它们将相互攻击——几乎可以保证

    这或许可以解释为什么你的滚动日志行为如此不稳定

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

    不过,您可能可以利用logback+slf4j的组合来实现这一点。Slf4j提供了一个plug-for-plug-re-route库来颠覆基于log4j的日志记录。我在一个应用程序中用logback+slf4j替换了log4j,并设法确保依赖库(根据log4j编写)仍能正常运行

    此外,您还可以利用logback的context selector来确定日志文件的轮换时间

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

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

    考虑到您的情况,如果它是在两个上下文下部署的一个应用程序,请尝试从服务器执行以下操作。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>
    

    此时,您应该能够基于上下文选择器遵循文档