2012-09-25 15 views
9

Mam projekt Java Eclipse, który używa log4j. Nie mogę ustawić pliku konfiguracyjnego log4j, do którego ma dostęp ścieżka pliku. Muszę wyeksportować i uruchomić projekt w słoiku.Jak ustawić plik właściwości log4j?

Oto jak ja stara:

public class Wita { 
    static Logger logger; 
    public static void main(String[] args) { 
    System.setProperty("log4j.configuration", new File("").getCanonicalPath()+File.separatorChar+"resources"+File.separatorChar+"log4j.xml"); 
    // System.out.println(System.getProperty("log4j.configuration")); 
    logger = Logger.getLogger(Wita.class.getName()); 
    } 
} 

system się drukuje C : \ Users \ roncsak \ eclipse_workspace \ WITA \ Resources \ log4j.xml co jest dobrym rozwiązaniem. WITA to podstawowy folder projektu. Ale prowadzenie projektu z -Dlog4j.debug argumentu następujące powraca również:

 
log4j: Trying to find [C:\Users\roncsak\eclipse_workspace\WITA\resources\log4j.xml] using context classloader [email protected] 
log4j: Trying to find [C:\Users\roncsak\eclipse_workspace\WITA\resources\log4j.xml] using [email protected] class loader. 
log4j: Trying to find [C:\Users\roncsak\eclipse_workspace\WITA\resources\log4j.xml] using ClassLoader.getSystemResource(). 
log4j: Could not find resource: [C:\Users\roncsak\eclipse_workspace\WITA\resources\log4j.xml]. 

chciałbym zmienić log4j.xml w czasie, bez budowania inny plik jar. Jak mogę to zrobić?

Odpowiedz

18

Od "Default inicjowania postępowania" w http://logging.apache.org/log4j/1.2/manual.html:

  • ustawić zmienną ciąg zasób wartości z właściwości systemu log4j.configuration . Preferowanym sposobem określenia domyślnego pliku inicjującego jest za pomocą właściwości log4j.configuration system . W przypadku, gdy właściwość log4j.configuration systemu nie jest zdefiniowana, ustaw zmienny zasób łańcuchowy na jego domyślną wartość: "log4j.properties".
  • Próba przekonwertowania zmiennej zasobów na adres URL.
  • Jeśli zmienna zasobów nie mogą być konwertowane do adresu URL, na przykład z powodu do MalformedURLException, a następnie szukać zasobu z ścieżce klasy wywołując org.apache.log4j.helpers.Loader.getResource (resource, Logger. klasa) , która zwraca adres URL. Zauważ, że ciąg "log4j.properties" stanowi zniekształcony adres URL. Zobacz Loader.getResource (java.lang.String) dla listy wyszukanych lokalizacji.

Więc trzeba poprzedzić file: do log4j.configuration wartość nieruchomości w celu, że może on być traktowany jako URL.

Zobacz https://stackoverflow.com/a/7927278/603516.

Nawet lepiej Kod:

System.setProperty("log4j.configuration", new File("resources", "log4j.xml").toURL()); 
+0

I to działa! Dziękuję Ci bardzo! – roncsak

+4

'java.io.File.toURL()' jest teraz przestarzałe. Zamiast tego użyj: 'x.toURI(). ToURL()' – kevinarpe

+0

Działa idealnie, po prostu "plik:" kosztuje mnie cały ranek, chcę cię pocałować koleś. – BenBen

5

Można ustawić VM argument: -Dlog4j.configuration='path_to_log4j.xml'

lub programowo:

String logFilePath = new File(<path_to_log4j.xml>); 
if (logFilePath == null || "".equalsIgnoreCase(logFilePath)) { 
    URL file = this.getClass().getResource(DEFAULT_CONF); 
    DOMConfigurator.configure(file); 
} else { 
    DOMConfigurator.configure(<default_config_file>); 
} 
0

Wszystkie te wyżej odpowiedź nie spełnia więc zakładać tu dla kogoś, kto potrzebuje to może w przyszłości:

  1. musisz określić gdzie aĹ jest. Albo przez opcję programu lub polecenia jest w porządku.

Programowo:

private static void setupLog4J(){ 
    try { 
     System.setProperty("log4j.configuration", new File(".", File.separatorChar+"log4j.properties").toURL().toString()); 
    } catch (MalformedURLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 
  1. utworzyć własny plik log4j.properties:

# Logging level 
# Root logger option 
log4j.rootLogger=DEBUG, stdout, file 

# Redirect log messages to console 
log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.Target=System.out 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p  %c{1}:%L - %m%n 

# Redirect log messages to a log file, support file rolling. 
log4j.appender.file=org.apache.log4j.RollingFileAppender 
log4j.appender.file.File=c:/project/resources/t-output/log4j-application.log 
log4j.appender.file.MaxFileSize=5MB 
log4j.appender.file.MaxBackupIndex=10 
log4j.appender.file.layout=org.apache.log4j.PatternLayout 
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n 

nadzieję, że to pomaga.

Powiązane problemy