2016-06-13 13 views
0

ErrorHandlerを実装するJavaクラスに関するログを書きたいと思います。私のクラスは、XMLファイルの読み込みに起因するエラーを処理するために使用されます。 私はウェブサイトで自分のベストを見てみるが、なぜこのコードがログファイルを空にしているのか分からない。 また、アプリケーションでロガーを管理する方法がわかりません。ベストプラクティスは何ですか?ログファイルが1つ以上あることをお勧めしますか?複数のエラーハンドラをログする必要があります:すべてのログコードをエラーハンドラクラスに入れることをお勧めしますか?私はホールアプリケーションのロガーを実装する必要がありますか?ErrorHandlerとLog

import java.io.IOException; 
import java.util.logging.FileHandler; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import java.util.logging.SimpleFormatter; 

import org.xml.sax.ErrorHandler; 
import org.xml.sax.SAXParseException; 

class XmlErrorHandler implements ErrorHandler { 

    private static final Logger LOGGER = Logger.getLogger(XmlErrorHandler.class.getName()); 

    FileHandler fileHandler; 

    public XmlErrorHandler() { 
     try { 

      fileHandler = new FileHandler("./xml.log"); 
      LOGGER.addHandler(fileHandler); 

      SimpleFormatter formatter = new SimpleFormatter(); 
      fileHandler.setFormatter(formatter); 


     } catch (SecurityException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     }  
    } 

    public void error(SAXParseException e) { 
     log(Level.SEVERE, "Error", e); 
    } 

    public void fatalError(SAXParseException e) { 
     log(Level.SEVERE, "Fatal Error", e); 
    } 

    public void warning(SAXParseException e) { 
     log(Level.WARNING, "Warning", e); 
    } 

    private void log(Level level, String message, SAXParseException e) { 
     int line = e.getLineNumber(); 
     int col = e.getColumnNumber(); 
     String publicId = e.getPublicId(); 
     String systemId = e.getSystemId(); 

     message = message + ": " + e.getMessage() + ": line=" + line + ", col=" + col + ", PUBLIC=" + publicId 
       + ", SYSTEM=" + systemId; 

     LOGGER.log(level, message); 
    } 

} 

EDIT: 私は、ログを初期化するために行うすべては、次のとおりです。

DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); 
documentBuilder.setErrorHandler(new XmlErrorHandler()); 

答えて

0

どのようにあなたのログを呼び出していますか?私はあなたのクラスをコピーして正常に動作します。その後、

そして、この方法を呼び出す:

public static void main(String[] args) { 

     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder documentBuilder = factory.newDocumentBuilder(); 
     documentBuilder.setErrorHandler(xmlErrorHandler); 

     File f = new File("bad.xml");   
     document = documentBuilder.parse(f);   
    } 

出力:

jun 13, 2016 5:45:46 PM es.test.XmlErrorHandler log 
INFORMACIÓN: message 1 
jun 13, 2016 5:45:46 PM es.test.XmlErrorHandler log 
GRAVE: message 2 
jun 13, 2016 5:45:46 PM es.test.XmlErrorHandler log 
ADVERTENCIA: message 3 

ことを私はハンドラとしてのクラスを登録するには:これは例外を書き込み

  DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
      DocumentBuilder documentBuilder = factory.newDocumentBuilder(); 
      documentBuilder.setErrorHandler(xmlErrorHandler); 

      File f = new File("bad.xml");   
      document = documentBuilder.parse(f); 

ログファイル

+0

私は分かりませんハンドラの仕組み私はハンドラーがエラーを処理するときにログを単独で呼び出すが、私はコード – user1315621

+0

の上に置いてあります。私は例外を記録する例を使って答えを編集しました。たぶん主メソッドから最初に呼び出すようにして、Sax ErrorHandlerとして登録する必要があります。しかし、私がやることは、あなたのロガー用のクラスとあなたのErrorHandler用のクラスを作成し、それらを別々にテストすることです。 –

関連する問題