2016-03-31 23 views
0

Ich verwende eine Drittanbieter-Bibliothek (Sphinx), die java.util.logging verwendet. Ich habe mehrere Ansätze versucht, um seine Protokolle zu slf4j zu routen. Die Logging-Bibliothek, die ich verwenden möchte, ist Log4j2, die wie folgt konfiguriert ist:Directing JUL Protokollierung auf SLF4J funktioniert nicht

Configuration: 
    properties: 
    property: 
    - name: logPath 
     value: logs 
    - name: logName 
     value: flux 
    - name: rootLevel 
     value: info 
    - name: useConsole 
     value: ALLOW 
    Appenders: 
    Console: 
     name: Console 
     target: SYSTEM_OUT 
     ThresholdFilter: 
     level: ${sys:rootLevel} 
     onMatch: ${sys:useConsole} 
     PatternLayout: 
     pattern: "%d{yyyy.MM.dd G HH:mm:ss,SSS z} %-5p [%t] %C{2} (%F:%L) - %m%n" 
    RollingRandomAccessFile: 
     name: File 
     fileName: "${sys:logPath}/${sys:logName}.log" 
     filePattern: "${sys:logPath}/${sys:logName}.%d{yyyy-MM-dd}.log" 
     PatternLayout: 
     pattern: "%d{yyyy.MM.dd G HH:mm:ss,SSS z} %-5p [%t] %C{2} (%F:%L) - %m%n" 
     Policies: 
     TimeBasedTriggeringPolicy: 
      interval: 1 
    Loggers: 
    Root: 
     level: ${sys:rootLevel} 
     AppenderRef: 
     - ref: File 
     - ref: Console 

ich ohne Erfolg angewendet alle Lösungen, die ich auf diesem und anderen Foren finden konnten. Unter anderem:

habe ich diese Maven Abhängigkeit meine POM:

<dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>jul-to-slf4j</artifactId> 
     <version>1.7.20</version> 
    </dependency> 

ich auch mit Aufruf dieser in einem statischen Block versucht:

SLF4JBridgeHandler.removeHandlersForRootLogger(); 
SLF4JBridgeHandler.install(); 

und versuchte, die System-Eigenschaft:

System.setProperty("java.util.logging.manager", "org.apache.logging.log4j.jul.LogManager"); 

In meinem letzten Versuch habe ich das VM-Argument übergeben:

-Djava.util.logging.manager = org.apache.logging.log4j.jul.LogManager

und bekam die Ausnahme unter:

Could not load Logmanager "org.apache.logging.log4j.jul.LogManager" 
java.lang.ClassNotFoundException: org.apache.logging.log4j.jul.LogManager 
at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
at java.util.logging.LogManager$1.run(LogManager.java:195) 
at java.util.logging.LogManager$1.run(LogManager.java:181) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.util.logging.LogManager.<clinit>(LogManager.java:181) 
at org.chatbot.stt.SttEngineDemo.<clinit>(SttEngineDemo.java:25) 
at java.lang.Class.forName0(Native Method) 
at java.lang.Class.forName(Class.java:264) 

Mache ich etwas falsch? Was kann ich noch versuchen?

Update:

Ich habe auch versucht Umleitung Juli log4j2, slf4j umgehen, daher meine ursprüngliche Strategie zu ändern (Danke für die Anregung @rgoers). Um dies zu tun, habe ich die Abhängigkeit unter:

<dependency> 
     <groupId>org.apache.logging.log4j</groupId> 
     <artifactId>log4j-jul</artifactId> 
     <version>2.5</version> 
    </dependency> 

und auch die Eigenschaft System java.util.logging.manager einzustellen: org.apache.logging.log4j.jul.LogManager

Dann werden die Sphinx Protokolle verschwunden. Ich weiß, dass sie nicht zu meinem log4j2-Logger geroutet werden, da die meisten Sphinx-Logs die Level-INFO haben und sie von log4j2 verarbeitet werden sollten. Also immer noch nicht korrekt.

Antwort

3

Wenn Sie die Nachrichten an Log4j 2 routen möchten, warum nicht einfach die Bridge von Log4j 2 verwenden? log4j-jul-2.5.jar

+0

es irgendwie geholfen, obwohl ich noch eine Fehlermeldung sehe. Bitte sehen Sie meine aktualisierte Frage. – Sergio

+0

Ihr VM-Parameter ist irgendwie falsch angegeben. Sehen Sie sich die Fehlermeldung an - sie enthält das "D", den Schlüssel und das =. Wenn Sie System.setProperty verwenden, müssen Sie sicherstellen, dass es gesetzt ist, bevor jul verwendet wird. – rgoers

+0

Ich übergebe den Parameter nach der Syntax -Dkey = value, wie hier gezeigt: http://stackoverflow.com/questions/862391/how-to-pass-the-d-system-properties-which-testing-on- Finsternis – Sergio

0

Wir haben eine Lösung, hier zu arbeiten, und die Differenz I bemerkt: logger.setUseParentHandler(false) and logger.addHandler(new org.slf4j.bridge.SLF4JBridgeHandler());

ich sicherstellen, dass ich hingegen keine anderen Handler haben und dann die SLF4JBridgeHandler an den Logger Beispiel.

import java.io.File; 
import java.io.IOException; 
import java.util.logging.Handler; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

import org.slf4j.LoggerFactory; 
import org.slf4j.bridge.SLF4JBridgeHandler; 

class Helper { 

    public static Logger get(String name) { 
     Logger logger = Logger.getLogger(name); 
     logger.setUseParentHandlers(false); 
     configureLogger(logger); 
     return logger; 
    } 

    private static void configureLogger(Logger logger) { 
     try { 
      // Remove Console Handler 
      Handler[] handlers = logger.getHandlers(); 
      for (int i = handlers.length - 1; i >= 0; --i) { 
       logger.removeHandler(handlers[i]); 
      } 
      // Add handler for SLF4J 
      logger.addHandler(new org.slf4j.bridge.SLF4JBridgeHandler()); 
     } catch (Throwable ex) { 
      logger.log(Level.SEVERE, "configureLogger", ex); 
     } 
    } 

}