当前位置: 首页 > 知识库问答 >
问题:

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

汪德明
2023-03-14

我使用的是log4j2。在两个应用程序中使用xml,并且两者都可以登录相同的信息。日志应用程序A和B中提到的日志文件大小为100KB。当信息。日志信息超过100KB。日志创建1个备份文件。当应用程序B尝试登录时,日志会被写入信息中。日志1而不是信息。日志当我重新启动应用程序B时,日志将获得登录信息。日志为什么会观察到这种奇怪的日志记录方式?解决方法是什么。下面是log4j2。应用程序B的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>

共有1个答案

穆子琪
2023-03-14

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

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

这就是为什么日志旋转要么需要一些技巧(阅读更多关于logRotate命令),要么在应用程序级别执行日志旋转-在Log4j中,它将通过RollingFileAppender完成。

由于有两个应用程序正在向同一个日志文件写入数据,所以两个应用程序中的任何一个决定轮换日志,另一个都不会注意到,正如我前面所述。最好为不同的应用程序提供单独的日志文件。

 类似资料:
  • 我的grails配置log4j部分中有以下内容: 文件“onetract3.log”已成功创建,但未向该文件写入任何内容。 我可以在控制台中看到信息处理正确。 Grails版本是2.3.5 知道为什么这没有写入日志文件吗? 编辑:10.03.1014,设置相加为false。

  • 问题内容: 我正在尝试配置log4j以将消息记录到文件中。现在,确实使用我提供的名称创建了该文件,但是日志未写入该文件。我的代码: 我文件的内容: 运行此命令时,将在控制台中获得以下输出: 该文件确实在我的主目录中创建。但是它是空的。 有什么想法我做错了吗?我正在使用log4j 1.2.17版。 问题答案: 输出似乎是Java标准日志记录框架(JUL)发出的默认格式。 因此,有两种可能性(想到):

  • 问题内容: 我正在尝试使用Go写入日志文件。 我尝试了几种方法,但都失败了。这是我尝试过的: 日志文件被创建,但是没有任何打印或附加到该文件。为什么? 问题答案: 过去的工作方式一定不同,但这对我有用: 基于Go文档,不能用于,因为它会打开文件“供阅读:” 打开命名文件以供读取。如果成功,则可以使用返回文件上的方法进行读取;关联的文件描述符具有mode 。如果有错误,它将是类型。 编辑 检查后移至

  • 我已经将log4j2.properties文件与springboot应用程序一起使用。正在创建日志文件,但日志未写入该文件。 日志出现在控制台,但没有写入文件,因为我没有得到问题。 奇怪的是,父包记录器“logger Enabled:Enting main\n\n”被写入文件,而另一个父包记录器“****演示应用程序启动*****”没有被写入文件,如上面的代码所示。并且还检查了子包,即记录器,甚至

  • 我正在使用带有log4j2的Spring Boot1.5.9,当我测试日志记录功能时,创建了日志文件,但没有将日志写入其中,而控制台日志记录程序运行良好。请在pom.xml&log4j2.properties配置下面找到。 log4j2.properties文件:

  • 我在我的项目中使用log4j。我想有标准输出、调试记录器和最终报告记录器。调试记录器几乎写调试/信息级别的消息。报告将是不同的记录器,只写信息消息。我尝试了不同的方法,阅读了很多示例,我仍然无法解决这个问题。要么我丢失了我的标准输出,要么我将所有调试写入两个记录器。 我的密码在这里 } 任何提示都将不胜感激