2013-12-23 9 views
7

Ich möchte meine Anwendung, die aus mehreren Klassen bestehen, anmelden. Ich hätte gerne eine .txt Protokolldatei am Ende. Daher mache ich eine statische Logger-Instanz und habe dafür einen FileHandler in einer Klasse erstellt. Weil ich gerne eine Datei hätte, setze ich das zweite Argument für true im FileHandler, um die Protokolldatei während der Protokollierung anhängen zu können.Java Logging durch mehrere Klassen

public class MyLogging { 
    static Logger logger; 
    public Handler fileHandler; 
    Formatter plainText; 

    public MyLogging() throws IOException{ 
     //instance the logger 
     logger = Logger.getLogger(MyLogging.class.getName()); 
     //instance the filehandler 
     fileHandler = new FileHandler("myLog.txt",true); 
     //instance formatter, set formatting, and handler 
     plainText = new SimpleFormatter(); 
     fileHandler.setFormatter(plainText); 
     logger.addHandler(fileHandler); 

    } 

Danach habe ich die anderen Logger erstellt. Ich weiß, dass ich einen Logger pro Klasse instanziieren muss. Daher mache ich nur den Logger (ohne FileHandler) für jede Klasse. Aber alle Logger referenzieren für eine Klasse (nicht für die Klasse, in der ich den Logger erstellt habe). Zum Beispiel:

public class Test1 { 
    static Logger logger; 

    public Test1()throws IOException { 

     logger = Logger.getLogger(MyLogging.class.getName()); 
    } 

Obwohl die Protokollierung durchgeführt wurde, bin ich mir nicht sicher, dass dies die richtige Lösung ist. Können Sie mir einige Ratschläge geben, wie Sie mit der Datei java.util.logging mehrere Klassen durchloggen können?

+0

Ich bin verwirrt. Sie sollten eine Protokolldatei am Ende haben, ohne nur eine Logger-Instanz zu verwenden. –

Antwort

7

In MyLogging Klasse, machen den Konstruktor private statt public, und Sie müssen die folgenden Methoden:

private static Logger getLogger(){ 
    if(logger == null){ 
     try { 
      new MyLogging(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
    return logger; 
} 
public static void log(Level level, String msg){ 
    getLogger().log(level, msg); 
    System.out.println(msg); 
} 

Die log Methode statisch ist, so kann es von jeder Klasse mit dem Klassennamen aufgerufen werden.

So aus allen Klassen, können Sie sich wie unter Log-Methode wird der Aufruf:

public class Test1 { 
    //static Logger logger; //no need to create an object for logging 

    public Test1()throws IOException { 

     MyLogging.log(Level.INFO, MyLogging.class.getName()); //call log method using classname 
    }