2016-10-10 13 views
0

java.util.loggingを使用しようとしていません。 https://stackoverflow.com/a/8249319/3322533を利用するように試みでJava - 使用するカスタムロガーを設定してください

handlers = mypackage.logging.RequestFileHandler, mypackage.logging.MainFileHandler 
config = 

mainLogger.handlers  = mypackage.logging.MainFileHandler 

requestLogger.handlers = mypackage.logging.RequestFileHandler 

java.util.logging.ConsoleHandler.level  = INFO 
java.util.logging.ConsoleHandler.filter = 
java.util.logging.ConsoleHandler.formatter = mypackage.logging.VerySimpleFormatter 
java.util.logging.ConsoleHandler.encoding = 

mypackage.RequestFileHandler.level  = SEVERE 
mypackage.RequestFileHandler.filter = 
mypackage.RequestFileHandler.formatter = mypackage.logging.VerySimpleFormatter 
mypackage.RequestFileHandler.encoding = 
mypackage.RequestFileHandler.limit  = 
mypackage.RequestFileHandler.count  = 
mypackage.RequestFileHandler.append = false 
mypackage.RequestFileHandler.pattern = REQUESTS.%u.%g.log 

mypackage.MainFileHandler.level  = INFO 
mypackage.MainFileHandler.filter = 
mypackage.MainFileHandler.formatter = mypackage.logging.VerySimpleFormatter 
mypackage.MainFileHandler.encoding = 
mypackage.MainFileHandler.limit  = 
mypackage.MainFileHandler.count  = 
mypackage.MainFileHandler.append = false 
mypackage.MainFileHandler.pattern = MAIN.%u.%g.log 

public class MainFileHandler extends FileHandler { 
    public MainFileHandler() throws IOException, SecurityException { 
     super(); 
    } 
} 

public class RequestFileHandler extends FileHandler { 
    public RequestFileHandler() throws IOException, SecurityException { 
     super(); 
    } 
} 

意向:

介してアクセス2つのロガーを提供

又は

Logger.getLogger("requestLogger"); 

それぞれREQUESTS[...].log

(制限なしのいずれかのファイルに記録することができるメッセージの量で、および必要な場合にMAIN[...].logおよび他に(排他的に)書き込む1 、のいずれかに不要なのMSGをフィルタリングするためにログレベルを使用します。)

しかし、どちらのファイルが作成されたときにI(

)例えば

そして私

log.info("Hello World!") 

public void configureLogger(){ 
    try { 
     ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
     InputStream config = classLoader.getResourceAsStream("logging.properties"); 

     LogManager.getLogManager().readConfiguration(config); 

    }catch(Exception ex){ 
     throw new RuntimeException("logging properties failed"); 
    } 
} 

私はhandlers = ...リストにjava.util.logging.ConsoleHandlerを含め、グローバルロガーを使用する場合、代わりに、フォーマッタがために適用されるので、私は性質がロードされている知っていますコンソール出力。

だから私はファイルロガーを設定しようとしたのは間違いだと思います。これをどうやって稼働させるのですか?

EDIT

だから私は[...].pattern = [...]行を削除し、代わりにファイル名をハードコード:

public class MainFileHandler extends FileHandler implements FileHandlerProperties { 
    public MainFileHandler() throws IOException, SecurityException { 
     super("MAIN_" + new SimpleDateFormat(TIME_PATTERN).format(new Date()) + ".log"); 
    } 
} 

public class RequestFileHandler extends FileHandler implements FileHandlerProperties { 
    public RequestFileHandler() throws IOException, SecurityException { 
     super("REQUESTS_" + new SimpleDateFormat(TIME_PATTERN).format(new Date()) + ".log"); 
    } 
} 

public interface FileHandlerProperties { 
    static final String TIME_PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"; 
} 

両方のファイルは、現在作成されますが、それらは両方は(それらの異なるレベルの設定およびロガーにもかかわらず)とまったく同じが含まれており、彼らが含まれていることは、XMLである:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<!DOCTYPE log SYSTEM "logger.dtd"> 
<log> 
<record> 
    <date>2016-10-10T18:49:23</date> 
    <millis>1476118163654</millis> 
    <sequence>0</sequence> 
    <logger>mainLogger</logger> 
    <level>INFO</level> 
    <class>mypackage.main.Main</class> 
    <method>&lt;init&gt;</method> 
    <thread>1</thread> 
    <message>Hello World</message> 
</record> 
</log> 

...

+0

は「あなたのプロパティファイルから '文字。 – VGR

+0

@VGRは削除' '」'削除 ''、任意の違いを確認していないようです。 – User1291

答えて

1

助けてください問題は、クラスのロード中にLogger.getLoggerへの最初の呼び出しでログ設定が読み取られ、JDK-8033661: readConfiguration does not cleanly reinitialize the logging systemのためにconfigureLoggerメソッドが失敗する点です。

これを回避するには、最初にLogger.getLoggerを呼び出す前にconfigureLoggerが実行されていることを確認する必要があります。

public class BootMain { 

    static { 
     configureLogger(); 
     mainLogger = Logger.getLogger("mainLogger"); 
     requestLogger = Logger.getLogger("requestLogger"); 
    } 

    private static final Logger mainLogger; 

    private static final Logger requestLogger; 

    public static void main(String[] args) throws IOException { 
     mainLogger.log(Level.SEVERE, "Test from main."); 
     requestLogger.log(Level.SEVERE, "Test from request."); 
     System.out.println(new File(".").getCanonicalPath()); 
    } 

    private static void configureLogger() { 
     try { 
      InputStream config = config(); 
      LogManager.getLogManager().readConfiguration(config); 
     } catch (Exception ex) { 
      throw new RuntimeException("logging properties failed"); 
     } 
    } 

    private static String prefix() { 
     return "mypackage.logging"; 
    } 

    private static InputStream config() throws IOException { 
     String p = prefix(); 
     Properties props = new Properties(); 
     props.put("mainLogger.handlers", p + ".MainFileHandler"); 
     props.put("requestLogger.handlers", p + ".RequestFileHandler"); 
     props.put(p + ".RequestFileHandler.level", "SEVERE"); 
     props.put(p + ".MainFileHandler.level", "INFO"); 
     props.put(p + ".RequestFileHandler.pattern", "REQUESTS.%u.%g.log"); 
     props.put(p + ".MainFileHandler.pattern", "MAIN.%u.%g.log"); 
     ByteArrayOutputStream out = new ByteArrayOutputStream(); 
     props.store(out, ""); 
     return new ByteArrayInputStream(out.toByteArray()); 
    } 
} 

はまた、あなたは、JDKの本当に古いバージョンを使用していないか、JDK-5089480: java.util.logging.FileHandler uses hardcoded classname when reading propertiesに実行できることを確認してください。

そうしないと、LogManager config option to manually setup your configurationを使用することができます。

関連する問題