是否有办法将log4j日志记录事件写入也由其他应用程序写入的日志文件。其他应用程序可能是非Java应用程序。有什么缺点?锁定问题?格式化?

有帮助吗?

解决方案

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

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

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

其他提示

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

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

  1. 使用数据库进行日志记录而不是纯文本文件 - 由于性能问题,它可能会令人望而却步,另一方面,分析日志,创建报告非常容易。数据库负责处理所有并发问题。
  2. 另一种方法涉及使用JBoss服务器,它可用于从其他来源读取日志记录信息。 JBoss可以在最小配置下运行,并且由于它非常轻巧(启动时间为2秒)。有关详细信息,请访问 http://docs.jboss.org/process -guide / en / html / logging.html (登录到单独的服务器)。 Log4J处理所有锁定/并发问题。
  3. 如果您不打算使用JBoss,可以使用第二种方法作为自己的日志记录解决方案的基础。

我认为默认的log4j appender不做任何文件锁定或同步。如果没有这样的锁定,您可能会丢失日志消息或接收它们。

我不确定在Java中执行文件锁定是多么容易,但为了使这项工作直接起作用,我认为您需要子类化相应的Appender并覆盖日志记录方法,使用锁定的同步代码包装它解锁文件。这可能会影响性能,具体取决于您的系统负载。

Log4perl有一个同步的Appender,Log :: Log4perl :: Appender :: Synchronized,它包装了一个Appender并完成了这个,并且似乎在它的Log :: Log4perl :: Appender :: File中提供了一个防止交错的标志线。您可以查看它们的作用,看它是否可以在Java中复制。

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

您主要关心的是锁定,很可能是其他应用程序。确保所有应用程序都没有文件的独占锁定,你应该没问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top