Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Log4j记录到共享日志文件_Java_Log4j - Fatal编程技术网

Java Log4j记录到共享日志文件

Java Log4j记录到共享日志文件,java,log4j,Java,Log4j,是否有一种方法可以将log4j日志记录事件写入其他应用程序也正在写入的日志文件。其他应用程序可以是非java应用程序。缺点是什么?锁定问题?格式化?您的最佳选择可能是让每个应用程序单独记录,然后安排一个计划作业,根据时间将文件“拉链”在一起。如果您确实需要对完整日志进行最新访问,可以每小时运行一次。Log4j非常灵活,您可以以与文件中已有记录兼容的格式创建日志条目。只需查看appender,了解如何格式化特定的数据字段 您主要关心的是锁定,很可能是其他应用程序的锁定。确保所有应用程序都没有对文件

是否有一种方法可以将log4j日志记录事件写入其他应用程序也正在写入的日志文件。其他应用程序可以是非java应用程序。缺点是什么?锁定问题?格式化?

您的最佳选择可能是让每个应用程序单独记录,然后安排一个计划作业,根据时间将文件“拉链”在一起。如果您确实需要对完整日志进行最新访问,可以每小时运行一次。

Log4j非常灵活,您可以以与文件中已有记录兼容的格式创建日志条目。只需查看appender,了解如何格式化特定的数据字段


您主要关心的是锁定,很可能是其他应用程序的锁定。确保所有应用程序都没有对文件进行独占锁定,您应该会没事。

Log4j有一个SocketAppender,它将向服务发送事件,您可以自己实现或使用与Log4j捆绑的简单实现

它还支持syslogd和Windows事件日志,这可能有助于将日志输出与非Java应用程序的事件统一起来


如果性能是一个问题,那么您需要一个服务来编写日志文件,而不是尝试在不同的日志应用程序之间协调一致的锁定策略。

我有以下两种方法的经验:

  • 使用数据库记录日志,而不是纯文本文件-这可能是禁止的,因为性能问题,另一方面,它很容易分析日志,创建报告。数据库负责处理所有并发问题
  • 另一种方法涉及使用JBoss服务器,它可以用于从其他来源读取日志信息。JBoss可以在最小的配置下运行,因此它非常轻量级(启动时间为2秒)。可以在此处找到详细信息(登录到单独的服务器)。Log4J负责所有锁定/并发问题

  • 如果您不打算使用JBoss,您可以使用第二种方法作为自己日志解决方案的基础。

    我认为默认的log4j appender不会执行任何文件锁定或同步。如果没有这样的锁定,您很可能会丢失日志消息或收到损坏的消息

    我不确定在Java中进行文件锁定有多容易,但为了直接实现这一点,我认为您需要对适当的Appender进行子类化,并覆盖日志记录方法,用同步代码将其包装起来,以锁定和解锁文件。这可能会影响性能,具体取决于系统负载

    Log4perl有一个正在同步的Appender,Log::Log4perl::Appender::Synchronized,它包装了一个Appender并实现了这一点,并且似乎在它的Log::Log4perl::Appender::文件中提供了一个标志来防止行的交错。您可以看看它们做了什么,看看它是否可以在Java中复制