2010-10-06 86 views
5

我有一個web應用程序,我想爲每個用戶使用不同的日誌,所以我可以擁有用戶在系統上執行的操作的「歷史記錄」。每個使用Log4j的用戶都有不同的日誌

這是我到目前爲止有:

import java.io.File; 
import java.io.IOException; 

import org.apache.log4j.DailyRollingFileAppender; 
import org.apache.log4j.FileAppender; 
import org.apache.log4j.SimpleLayout; 
import org.apache.log4j.Logger; 

public class LogManager { 

    public Logger getLog(String username) throws IOException{ 
     SimpleLayout layout = new SimpleLayout(); 
     FileAppender appender = new DailyRollingFileAppender(layout, "users"+File.pathSeparator+username+File.pathSeparator+username, "'.'yyyy-MM"); 

     // configure the appender here, with file location, etc 
     appender.activateOptions(); 
     Logger logger = Logger.getRootLogger(); 
     logger.addAppender(appender); 
     return logger; 
    } 

} 

的問題是,作爲一個web應用,是多線程的,所以據我所知,我不能使用RootLogger所有的時間,並更改取決於用戶的追加程序我正在登錄的人。我想我應該爲每個用戶創建不同的Logger,但是這是否正確?

+0

你有多少用戶? – dogbane 2010-10-06 08:06:40

+0

介於1.000和10.000之間 – pakore 2010-10-06 08:11:24

+0

您知道您很可能不允許在Web服務器日誌模塊中同時打開10.000個文件嗎? – 2010-10-06 08:19:24

回答

4

嘗試切換到logback(Log4j的繼任者)。它帶有一個SiftingAppender,它可以用來根據給定的運行時屬性來分隔(或篩選)日誌記錄,在你的情況下這將是「userid」。 documentation包含一個基於用戶標識分隔日誌的示例。

+0

這正是我一直在尋找的。謝謝! – pakore 2010-10-06 08:22:35

2

我會建議使用日誌上下文信息來記錄用戶的任何特定操作,並將其包含在日誌記錄中。

然後,無論何時需要某個特定用戶的日誌,拖網通過單個日誌文件。如果您需要分割所有文件,請在日誌旋轉時進行。這個後處理將比爲每個用戶同時保存一個打開文件簡單得多。

+0

這也是一個很好的方法,我喜歡後處理的想法。爲它+1。如果我能接受你的答案,我會這樣做的! – pakore 2010-10-06 08:24:29