簡體   English   中英

Log4j在集群環境中

[英]Log4j in clustered environment

我正在將log4j用於在集群環境中運行的Web應用程序。 在少數情況下,某些進程(非特定)會丟失日志記錄。 我無法確定原因。 在單個服務器實例上運行時,它可以正常工作。 我正在使用每日滾動文件appender。 是否要添加/修改任何其他屬性? Async 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提供)將收集它們並將它們寫入文件。 可在此處找到如何使用它的說明。

根據Isaac給出的建議,以避免兩個不同的類加載器/ jvm寫入同一個物理日志文件的情況:

有兩種方法可以解決它:

  1. 讓每個JVM登錄到不同的日志文件。 實際上,試一試並證明它有效

  2. 請改用SocketAppender。 所有日志記錄(來自所有服務器實例)最終都將通過網絡連接發送,服務器程序(由log4j提供)將收集它們並將它們寫入文件。 可在此處找到如何使用它的說明。

對於第1點,下面的方法可以工作:

采用:

<param name="File" value="${sys:log4j.logFile}" />

代替:

 <param name="File" value="/logs/app.log" />

對於JVM1,設置JVM屬性:log4j.logFile = / logs / jvm1 /app.log

對於JVM2,設置JVM屬性:log4j.logFile = / logs / jvm2 /app.log

有關更多詳細信息和其他選項:請參閱: link1link2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM