2010-05-11 14 views
15

Używam log4j do rejestrowania informacji. Użyłem pliku log4j.xml do tworzenia plików dziennika. Podałem bezwzględną ścieżkę dla każdego pliku dziennika jako wartość znacznika param.Jak nadać dynamiczną nazwę pliku w aplikatorze w log4j.xml

Np .:

<appender name="FA" class="org.apache.log4j.DailyRollingFileAppender"> 
    <param name="DatePattern" value="'_'yyyyMMdd"/> 
    <param name="File" value="D:/logFiles/GPreprocessor.log"/> 
    <layout class="com.dnb.genericpreprocessor.common.log.AppXMLLayout"/> 
</appender> 

Nie chcę pisać "GPreprocessor.log" bezpośrednio. W rzeczywistości nazwa tego pliku jest dynamiczna, na podstawie nazwy mojego projektu. Na przykład, jeśli uruchomię program ABC.java, logowanie powinno się odbyć pod numerem D:/logFiles/ABC.log, ale jeśli uruchomię XYZ.java, rejestrowanie powinno się odbyć pod numerem D:/logFiles/XYZ.log. Lokalizacja pliku zawsze pozostanie taka sama: D:/logFiles/. Jak mogę dynamicznie zmieniać nazwę pliku logu?

Odpowiedz

65

Jest znacznie łatwiej wykonać następujące czynności:

W log4j.xml zdefiniować zmienną jako $ {zmienna}:

<appender name="FILE" class="org.apache.log4j.FileAppender">  
    <param name="File" value="${logfilename}.log" /> 
    <layout class="org.apache.log4j.PatternLayout"> 
     <param name="ConversionPattern" value="%d::[%t]::%-5p::%c::%x - %m%n" /> 
    </layout>  
</appender> 

następnie upewnij się ustawić właściwość systemu podczas uruchamiania JVM takich jak :

java -Dlogfilename=my_fancy_filename example.Application 

to utworzy dynamiczną nazwę pliku dziennika: my_fancy_filename.log

Alternatywnie możesz ustawić właściwość systemową w kodzie tak długo, jak robisz to przed utworzeniem programu rejestrującego (jest to użyteczne, jeśli chcesz na przykład mieć PID w dziennikach). Takich jak:

System.setProperty("logfilename", "a_cool_logname"); 

Raz, że jest ustawiony można iść do przodu i uzyskać rejestratory jako normalne i logowania do pliku dynamicznego (być ostrożnym z tych statycznych rejestratory rejestratory, które tworzą przed wykonuje swoją główną metodą).

+1

będzie wspierać/wziąć jeśli dam wartości w.plik właściwości? tj. zamiast definiować wartość na początku JVM, czy mogę zdefiniować ją w pliku .properties? – SuRa

+0

jeśli używasz System.setProperty ("nazwa pliku logu", "a_cool_logname"); upewnij się, że ustawiłeś to zanim coś zarejestrujesz – James

4

Bardziej sensowne jest przedłużenie FileAppender z własną klasą, w której zastępujesz metodę setOptions(). Następnie w twoim log4j.properties skonfigurujesz root, aby logował się na yourpackage.yourFileAppender, który jest znacznie czyściejszy.

2

Poniżej znajduje się mój kod do używania Log4J do dynamicznego generowania nazwy pliku. Zmienia nazwę zgodnie z nazwą pliku wejściowego i bieżącą datą-godziną. (Tak bardzo pomocny w przypadku uruchamiania samego pliku wielokrotnie.)

public class LogClass { 

    private static Logger log = Logger.getLogger(LogClass.class); 
    private static boolean initializationFlag = false; 
    private static String fileName; 

    private static void intializeLogger(){ 
     log.setLevel(Level.DEBUG); 

     DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); 
     Date date = new Date(); 

     RollingFileAppender appender = new RollingFileAppender(); 
     appender.setAppend(true); 
     appender.setMaxFileSize("1MB"); 
     appender.setMaxBackupIndex(1); 
     appender.setFile(fileName + "_" + dateFormat.format(date) + ".log"); 

     PatternLayout layOut = new PatternLayout(); 
     layOut.setConversionPattern("%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n"); 
     appender.setLayout(layOut); 

     log.addAppender(appender); 
    } 

    public static Logger getLogger(){ 
     if(initializationFlag == false){ 
      intializeLogger(); 
      initializationFlag = true; 
      return LogClass.log; 
     } 
     else{ 
      return LogClass.log; 
     } 
    } 

    public static void setFileName(String fileName){ 
     LogClass.fileName = fileName; 
    } 
} 

Teraz, gdy chcesz używać rejestratora w programie, Wystarczy napisać te dwa wiersze:

LogClass.setFileName(yourFileName); 
LogClass.getLogger().debug("hello!!"); 

Szczęśliwy kodowania.

0

W klasie zawierającej metodę główną ustaw nazwę klasy dla pewnej właściwości systemowej. W poniższym przykładzie użyłem log_dir jako nazwy właściwości.

class ABC{ 
public static void main(String s[]){ 
    System.setProperty("log_dir", ABC.class.getSimpleName()); 
} 
} 

A w pliku log4j.xml używać log_dir nieruchomości w wartości atrybutu param File

<appender name="FA" class="org.apache.log4j.DailyRollingFileAppender"> 
    <param name="DatePattern" value="'_'yyyyMMdd"/> 
    <param name="File" value="D:/logFiles/${log_dir}"/> 
    <layout class="com.dnb.genericpreprocessor.common.log.AppXMLLayout"/> 
</appender> 

działa jak czar

Powiązane problemy