2015-10-06 113 views
0

我是log4j的初學者,我似乎已經理解了基礎知識。我的問題是,我將在2臺不同的機器上部署我的程序(機器1上的客戶機和機器2上的服務器可以說),那麼我將如何進行日誌記錄?如何在客戶端服務器程序中集成log4j日誌記錄?

我已在現在以下:

log4j.properties:

# Define the root logger with appender file 
log4j.rootLogger = DEBUG, FILE 

# Define the file appender 
log4j.appender.FILE=org.apache.log4j.FileAppender 

# Set the name of the file 
log4j.appender.FILE.File=log.out 

# Set the immediate flush to true (default) 
log4j.appender.FILE.ImmediateFlush=true 

# Set the threshold to debug mode 
log4j.appender.FILE.Threshold=debug 

# Set the append to false, overwrite 
log4j.appender.FILE.Append=true 

# Define the layout for file appender 
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout 
log4j.appender.FILE.layout.conversionPattern=%m%n 

log4jTest.java:

包ch.ethz.rama.asl.logger;

import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.util.Properties; 

import org.apache.log4j.Logger; 
import org.apache.log4j.PropertyConfigurator; 


public class log4jTest { 

    static Logger log = Logger.getLogger(ch.ethz.rama.asl.client.ClientInstance.class); 

    public static void main(String args[]) throws FileNotFoundException, IOException{ 
     Properties props = new Properties(); 
     props.load(new FileInputStream("/Users/ramapriyasridharan/Documents/asl_v1/ClientServerNio/bin/log4j.properties")); 
     PropertyConfigurator.configure(props); 
     log.debug("debug"); 
     log.info("info"); 
    } 

} 

所以我應該爲客戶端和服務器有不同的記錄器對象?另外如果我想在客戶端追加相同的文件,我應該使用某種方法傳遞記錄器對象,還是應該創建一個新對象?林有點困惑這個,謝謝

+0

Logger對象log是每個java類定義的。如果客戶端和服務器都可以訪問相同的文件系統,則可以對雙方使用相同的配置,因此可以讓它們登錄到同一個文件中。如果服務器和客戶端在同一個JVM中運行,您也可以登錄到同一個控制檯。然而,正如服務器和客戶端通常指示兩臺物理上不同的機器一樣,您應該在機器上本地登錄不同的日誌文件。 – hotzst

+0

@hotzst我的客戶端和服務器都有很多類,因此對於每個類我都應該有一個單獨的記錄器?這意味着我將擁有相同數量的客戶端/服務器類和記錄器類? – LoveMeow

+1

是的,單獨的記錄器對象並不意味着不同的記錄上下文。在代碼中創建一個記錄器將創建一個輸出,該輸出包含記錄器所屬類的名稱,因此在日誌文件中可以很容易地區分哪個記錄行來自哪個類。 – hotzst

回答

1

做到這一點的最好辦法是在每個地方有東西登錄類來定義一個記錄器。你可能有一堆類,沒有日誌語句,所以沒有必要在那裏定義一個記錄器。用記錄器定義的類來初始化記錄器總是最好的。

基於你在哪裏使用它必須是定義爲一個靜態字段

public MyClass { 
    private static final Logger log = Logger.getLogger(MyClass.class); 
} 

或非靜態字段的記錄:

public MyClass { 
    private final Logger log = Logger.getLogger(getClass()); 
} 

記錄器應該永遠是沒有任何私人getter方法,所以它只能在類中使用(或在內部類中使用)。

定義每個類的記錄器實例仍然允許您登錄到同一個文件或控制檯,只要所有對象都在同一個JVM中運行。您也可以爲不同的應用程序共享相同的日誌配置,但可能會出現併發文件訪問問題。我覺得最好每個應用程序都有一個專用的日誌文件。這將導致兩個不同的日誌文件,一個用於服務器,一個用於客戶端,如果它們不在同一個JVM中運行的話。

使用定義記錄器的類定義記錄器通常(取決於日誌配置)將該類名打印出來作爲日誌事件(讀取記錄行)的一部分,因此它很容易在哪個類中記錄日誌事件被觸發。

0

你肯定不需要傳遞記錄器對象。 通常的做法是在你需要記錄的每個類中都有單獨的靜態記錄器對象。

通過這種方式,您可以獲得有關記錄確切的類記錄消息的信息。

它看起來像寫入單個文件從不同的應用程序是不可能與log4j。

這裏是可能的解決辦法,但你需要切換日誌庫: Different applications writing to same log4j log file