2012-11-16 72 views
0

在我的應用程序中,我讀入一個輸入文件(例如myFile1.txt)並創建一個具有相同名稱的輸出文件(例如myFile2log)。要點是輸入文件將在Java應用程序中讀取,而不是作爲命令行參數給出。因此,需要在應用程序中設置appender,例如如何爲所有類配置log4j fileappender?

public class Example { 
private static final Logger LOG = Logger.getLogger(Example.class); 

public Example() throws IOException { 
    FileAppender appender = new DailyRollingFileAppender(new PatternLayout(
      PatternLayout.DEFAULT_CONVERSION_PATTERN), "yourfilename.log", 
      "'.'yyyy-MM-dd"); 
    LOG.addAppender(appender); 
    LOG.setLevel((Level) Level.DEBUG); 
    LOG.debug("blabla"); 

    new RandomClass(); 
} 

public static void main(String[] args) throws IOException { 
    new Example(); 
} 
} 

public class RandomClass { 
private static final Logger LOG = Logger.getLogger(RandomClass.class); 

public RandomClass() { 
    LOG.debug("hello Randomclass"); 
} 
} 

這裏的問題是:如果我做了自定義文件附加器上面只對其中定義了fileappender具體的類,但不能在任何其他類。因此,「RandomClass」的輸出將不會寫入此日誌文件,但是這是必需的。我怎樣才能做到這一點?

+0

你能不能用一個log4j.properties文件的旁邊應用程序指定appender? – Quetzalcoatl

+0

是的,我在我的應用程序旁邊使用log4j.properties文件來設置其他設置。但我不知道如何動態調整「全局」文件擴展名日誌文件。 – Malvin

回答

1

如果你想動態設置附加器,你應該嘗試新的附加目的地設置爲根記錄:

Logger logger = Logger.getRootLogger(); 
FileAppender appender = new DailyRollingFileAppender(new PatternLayout(
    PatternLayout.DEFAULT_CONVERSION_PATTERN), "yourfilename.log", "'.'yyyy-MM-dd"); 
logger.addAppender(appender) 
+0

非常感謝!我最初認爲將RootLogger分配給「新」Logger對指定的Logger來說是「獨佔」的,但實際上它是「全局的」,這正是所需要的。 – Malvin

+0

@Malvin不客氣。 – dan

1

您可以在類路徑中使用log4j.properties文件,然後只需在所有類中初始化記錄器即可。

private static final Logger LOG = Logger.getLogger(Example.class); 

和Appender在構造函數中都不需要。你的屬性文件應包含

log4j.appender.R=org.apache.log4j.RollingFileAppender 
log4j.appender.R.File=yourfilename.log 
log4j.appender.R.MaxFileSize=2048KB