【问题标题】:Log4j dailyrollingfileappender file issuesLog4j dailyrollingfileappender 文件问题
【发布时间】:2011-09-21 13:02:50
【问题描述】:

我们遇到了一个特殊的问题。 场景:我们有 3 台服务器,它们具有多个组件实例,都将事务日志写入单个日志文件。我们使用 log4j,服务器在 Java 1.3 中运行。 setAppend() 被传递 true 并且实现是 DailyRollingFileAppender

问题:在午夜,我们希望当前日志文件以新文件名翻转并开始写入新文件。这在我们的测试设置(单服务器写入日志)中运行良好。在生产中,在午夜,新文件被创建,新日志被写入但滚动文件被删除

任何帮助都将受到高度赞赏,因为它已经过去了几天,我们无法获得任何问题的线索。

【问题讨论】:

  • 你能把你的配置文件贴出来吗?
  • 感谢您的回复。我在这里找到了另一个链接 [vivekagarwal.wordpress.com/2008/02/09/…。将尝试这个并提供更新
  • 我们继续使用上述链接中提供的解决方案并且它有效。

标签: java log4j


【解决方案1】:

您不应该从多个进程登录到同一个文件。 Log4j 是线程安全的,但它不是进程安全的,如果我可以这么说的话;它不能作为不同 Java 进程之间的共享库。嵌入在一个 java 应用程序中的 Log4j 不知道任何其他应用程序。

使用翻转会导致您刚刚发现的问题:所有进程都运行自己的翻转代码,盲目地覆盖以前的内容(因为它们都不期望任何内容)。

这里有一个可能的解决方案:Log4j Logging to a Shared Log File

【讨论】:

  • 基于 FileAppender 的类中的底层文件在保存每个日志部分的同时打开、附加和关闭 真的是这样吗?我不确定。至少在 UNIX 上,如果您登录到一个文件然后从命令行截断它,您会在下一次写入时看到该文件在写入消息之前用二进制零填充。这表明文件没有在每个日志事件上关闭和打开(这会很昂贵),但实际上在写入之间维护了一个文件指针。消息不会混合在一起,因为对文件系统的底层写入是原子的。
  • 你是对的。不记得我差不多 2 年前在想什么,但没有证据支持我的理论。我现在只能道歉。
【解决方案2】:

我们遇到了同样的问题。根本问题是没有办法跨多个进程协调对日志文件的访问(在这种情况下在多个服务器上运行。)这意味着会发生各种不好的事情:日志被覆盖,文件无法滚动等......

我对您的建议是让每个服务器写入一个单独的文件,然后将它们合并到一个后处理作业中。

【讨论】:

    【解决方案3】:

    假设您已将 DailyRollingFileAppender 配置为每日轮换(可以将其配置为每小时、每分钟等轮换)。假设今天是 2014 年 12 月 31 日,日志文件名为 sample.log。日志轮换将通过以下方式发生:

    • 午夜后(例如 2015 年 1 月 1 日凌晨 1 点)收到的第一条日志消息将触发日志文件轮换。
    • 日志文件轮换将首先删除任何带有前一天后缀的现有文件。 (即,它将删除任何名称为 sample-2014-12-31.log 的文件。理想情况下,不应该存在这样的文件。)。
    • 然后它将用前一天的后缀重命名当前文件。即将 sample.log 重命名为 sample-2014-12-31.log。
    • 它将创建没有后缀的新日志文件。即新的 sample.log
    • 它将开始写入新文件 sample.log。

    如果日志管理器的两个实例指向同一个日志文件,那么每个实例将独立地对同一个文件重复上述步骤。这可能发生在以下任何情况下:

    • 如果部署在同一个容器中的两个或多个 WAR 文件指向同一个日志文件。
    • 如果两个或多个进程指向同一个日志文件。
    • 等

    这种情况会导致问题中提到的问题。

    • 在 Windows 机器上,一旦第一个进程轮换了日志文件并获得了新文件的句柄,第二个日志附加程序将无法写入日志。
    • 在 linux 机器上,第二个进程将删除第一个进程创建的存档文件,并将新文件(当前由第一个进程使用)重命名为前一天的文件。因此第一个进程将开始在前一天的文件中写入日志,第二个进程将在新文件中写入日志。午夜过后,第一个进程使用的日志文件将被删除。因此,第一个进程的日志会不断丢失。

    【讨论】:

    • 我们在 Web 应用程序中看到了非常相似的行为 - 尚未确定为什么我们可能拥有多个 LogManager。
    • @sbarlster - 当一台机器上运行的两个war文件(或两个独立进程)具有相同的日志文件名时,通常会发生这种情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-09
    • 2021-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多