2016-03-31 6 views
0

java.util.loggingを使用するサードパーティライブラリ(Sphinx)を使用しています。私はslf4jにログを送るいくつかの方法を試してきました。私は成功せず、私はこれと他のフォーラムで見つけることができるすべてのソリューションを適用SLF4JへのJULログの出力が正しく行われない

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 

:私が使用したいのロギングライブラリは次のように構成されてLog4j2、です。なかでも:

私はPOMにこのMavenの依存関係を追加しました:

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

を私はまた、静的ブロックでこれを呼び出してみました:

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

そして、システムプロパティを設定してみました:

私の最後の試みでは、私はVMの引数に合格しました:

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

と以下の例外だ:

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) 

私が何か間違ったことをやっているの?それ以外に何ができますか?

更新:

私はまた、それゆえ私の元の戦略(提案@rgoersに感謝を)変え、SLF4Jをバイパスし、log4j2に7月リダイレクトしてみました。 これを行うためには、私は以下の依存関係を追加しました:org.apache.logging.log4j.jul.LogManager

そして、スフィンクスログがなくなっている:

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

もシステムプロパティ java.util.logging.managerを設定します。私は彼らが私のlog4j2ロガーにルーティングされていないことを知っています。なぜなら、ほとんどのSphinxログはINFOレベルでlog4j2によって処理されるべきだからです。それでも正しいわけではありません。

答えて

3

Log4j 2にメッセージをルーティングする場合は、なぜLog4j 2のブリッジを使用しないのですか? log4jの-7月-2.5.jar

+0

まだエラーメッセージが表示されますが、それは助けになります。更新された質問をご覧ください。 – Sergio

+0

VMパラメータが何らかの形で間違って指定されています。エラーメッセージを見てください - それは "D"、キーと=を含んでいます。 System.setPropertyを使用する場合は、何かがjulを使用する前に設定されていることを確認する必要があります。 – rgoers

+0

ここに示すように、-Dkey = valueという構文に従ってパラメータを渡しています。http://stackoverflow.com/questions/862391/how-to-pass-the-d-system-properties-while-testing-on-日食 – Sergio

0

私たちは働いてここに解決策を持っていると私は気づいた違いがある:私は、他のハンドラを持っているし、その後ロガーへSLF4JBridgeHandlerを添付していないことを確認してくださいlogger.setUseParentHandler(false) and logger.addHandler(new org.slf4j.bridge.SLF4JBridgeHandler());

インスタンス。

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); 
     } 
    } 

} 
関連する問題