gpt4 book ai didi

java - 集群环境下的Log4j

转载 作者:行者123 更新时间:2023-12-02 07:23:18 26 4
gpt4 key购买 nike

我正在将 log4j 用于在集群环境中运行的 Web 应用程序。在少数情况下,某些进程(不是特定的)的日志记录会丢失。我无法确定原因。当在单个服务器实例上运行时,它工作正常。我正在使用每日滚动文件附加器。要添加/修改任何其他属性吗?异步 Appender 有帮助吗?有什么解决办法吗?

编辑:以下是我计划使用的 log4j XML 和 AsyncAppender

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="true">
<appender name="appLog" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="/logs/app.log" />
<param name="DatePattern" value="'.'yyyy-MM-dd" />
<param name="Threshold" value="DEBUG" />
<param name="Append" value="true" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p (%F:%L) - %m%n" />
</layout>
</appender>

<appender name="async" class="org.apache.log4j.AsyncAppender">
<param name="BufferSize" value="256" />
<param name="LocationInfo" value="true"/>
<appender-ref ref="appLog" />
</appender>

<root>
<priority value="debug" />
<appender-ref ref="async" />
</root>
</log4j:configuration>

最佳答案

如果您没有附加 Log4J 配置以及有关集群拓扑的一些信息,则无法确定,但是:如果您配置 Log4J 的方式与配置方式之间不匹配,那么您所描述的情况很可能会发生您的应用程序配置为在集群中运行。

例如,如果两个集群成员在同一台物理机上运行,​​并且您的应用程序在两个实例中使用完全相同的 Log4J 配置文件,那么实际上,您有两个不同的 JVM 登录到一次相同的文件。这不会起到很好的作用。

一般来说,您应该避免两个不同的类加载器写入同一物理文件的情况。

更新(在附加log4j.xml之后):假设您的集群服务器在同一台物理计算机上运行,​​您附加的配置最终将得到多个log4j配置登录到相同的物理文件(log4j“生活”在类加载器的上下文中,并且您有多个服务器 - 因此在同一物理机器上有多个类加载器)。这是行不通的,因为两个 log4j“实例”没有办法同步写入该文件。

AsyncAppender 不会帮助你。 AsyncAppender 所做的只是缓冲日志记录请求,以便您的程序在实际写入日志行之前获得控制权。它没有解决同步写入同一文件的问题。

有两种方法可以解决:

  1. 让每个 JVM 登录到不同的日志文件中。实际上,尝试一下并见证它的效果。
  2. 改用SocketAppender。您的所有日志记录(来自所有服务器实例)最终将通过网络连接发送,服务器程序(由 log4j 提供)将收集它们并将它们写入文件中。使用说明可以参见here .

关于java - 集群环境下的Log4j,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13901970/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com