日志写入备份文件而不是主文件

logs getting written in backup file instead of main file

我在 2 个应用程序中使用 log4j2.xml,并且都登录相同的 info.log。应用程序A和B中提到的日志文件大小为100KB。当 info.log 超过 100KB info.log.1 备份文件被创建。当应用程序 B 尝试记录时,日志将写入 info.log.1 而不是 info.log。当我重新启动应用程序 B 时,日志正在记录 info.log。为什么观察到这种奇怪的日志记录方式,解决方案是什么。下面是应用程序 B

的 log4j2.xml
 <?xml version="1.0" encoding="UTF-8"?>
  <Configuration status="INFO" monitorInterval="5">
<!-- Logging Properties -->
<Properties>
    <Property name="LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss:SSS} [%p] %c, %m%n</Property>
    <Property name="APP_LOG_ROOT">/logs</Property>
</Properties>
<Appenders>
    <!-- Console Appender -->
    <Console name="Console" target="SYSTEM_OUT" follow="true">
        <PatternLayout pattern="${LOG_PATTERN}" /> </Console>
    <!-- File Appenders on need basis -->
    <RollingFile name="infoLog" fileName="${APP_LOG_ROOT}/info.log" filePattern="${APP_LOG_ROOT}/app-info-%d{yyyy-MM-dd}%-i.log">
        <LevelRangeFilter minLevel="INFO" maxLevel="INFO" onMatch="ACCEPT" onMismatch="DENY" />
        <PatternLayout pattern="${LOG_PATTERN}" />
        <Policies>
            <SizeBasedTriggeringPolicy size="20KB" /> </Policies>
        <ThresholdFilter level="INFO" />
        <DefaultRolloverStrategy max="50" /> </RollingFile>
    <RollingFile name="errorlog" fileName="${APP_LOG_ROOT}/info.log" filePattern="${APP_LOG_ROOT}/app-info-%d{yyyy-MM-dd}%-i.log">
        <LevelRangeFilter minLevel="ERROR" maxLevel="ERROR" onMatch="ACCEPT" onMismatch="DENY" />
        <PatternLayout pattern="${LOG_PATTERN}" />
        <Policies>
            <SizeBasedTriggeringPolicy size="100KB" /> </Policies>
        <ThresholdFilter level="error" />
        <DefaultRolloverStrategy max="10" /> </RollingFile>
</Appenders>
<Loggers>
    <Root level="info">
        <AppenderRef ref="infoLog" />
        <AppenderRef ref="errorlog" level="error" /> </Root>
</Loggers>

我相信这种行为是因为您有两个应用程序,每个应用程序都有自己的 log4j 配置,并且您 运行 在 Un*xish 系统上。

在 Linux 中,如果您有一个正在写入文件的应用程序,它会在磁盘上打开该项目的文件句柄。如果您同时重命名该文件并使用旧名称创建一个新文件,则目录中的文件句柄会发生变化,但该应用程序内存中的文件句柄不会发生变化。因此应用程序不会注意到更改并继续写入磁盘上的相同项目 - 您会注意到它,因为数据仍附加到重命名的文件中。

这就是为什么日志轮换需要一些技巧(阅读更多关于 logrotate command), or you perform log rotation on application level - in Log4j it would be done via the RollingFileAppender

由于您有两个应用程序写入同一个日志文件,因此您会遇到这样的情况,即无论两个应用程序中的哪个决定轮换日志,另一个应用程序都没有注意到,正如我上面描述的那样。最好为不同的应用程序设置单独的日志文件。