2013-04-02 9 views
87

テキストファイルに書き込むために私が作成したすべてのログを書きたい状況があります。java.util.logging.Loggerを使用するときにテキストファイルにログを書き込む方法

ログを生成するためにjava.util.logging.Logger APIを使用しています。

私は

private static Logger logger = Logger.getLogger(className.class.getName()); 
FileHandler fh; 
fh = new FileHandler("C:/className.log"); 
logger.addHandler(fh); 

を試してみました。しかし、まだコンソールだけで私のログを取得....

+0

[JavaロギングAPIの複製、標準出力へのロギングを無効にする](0120-18753) – Raedwald

+0

最初にやろうとしていたように、FileHandlerの使用を示唆する回答がいくつかあります。知っておくべきこと(痛々しく学んだレッスン):FileHandlerは* synchronized *です。つまり、非常にマルチスレッドのアプリケーションでは、潜在的なデッドロックが必要なのは、toString()メソッドがsynchronizedメソッドを呼び出す、ログに記録されるオブジェクトを渡すことだけです。 FileHandlerに注意してください。 –

答えて

169

は、このサンプルを試してみてください。わたしにはできる。 ConsoleHandlerがレジであるので、

logger.setUseParentHandlers(false); 

を使用し、コンソールハンドラを削除するには

public static void main(String[] args) { 

    Logger logger = Logger.getLogger("MyLog"); 
    FileHandler fh; 

    try { 

     // This block configure the logger with handler and formatter 
     fh = new FileHandler("C:/temp/test/MyLogFile.log"); 
     logger.addHandler(fh); 
     SimpleFormatter formatter = new SimpleFormatter(); 
     fh.setFormatter(formatter); 

     // the following statement is used to log any messages 
     logger.info("My first log"); 

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

    logger.info("Hi How r u?"); 

} 

はMyLogFile.log

Apr 2, 2013 9:57:08 AM testing.MyLogger main 
INFO: My first log 
Apr 2, 2013 9:57:08 AM testing.MyLogger main 
INFO: Hi How r u? 

編集で出力を生成しますすべてのロガーが派生する親ロガーと混同していました。

+0

それは私のために働いている...しかし、私もコンソールでログを取得しています。そこからどのように削除するには? – Pankaj

+0

すべてのログを保存したい場合、どうすればいいか教えてください。実際にこのアプローチから、アプリケーションを2回実行するとテキストファイルが置き換えられますか? – Pankaj

+0

あなたのアクセス数に応じて異なる名前のログファイルを試してみてください。 –

4

log4j for Javaと命名された良いライブラリがあります。
これは多くの機能を提供します。リンクをたどって、あなたの解決策を見つけるでしょう。

何が必要
+0

すでにlog4j2がありますが、プロジェクトレベルで設定する必要があります –

3
int SIZE = "<intialize-here>" 
int ROTATIONCOUNT = "<intialize-here>" 

Handler handler = new FileHandler("test.log", SIZE, LOG_ROTATIONCOUNT); 
logger.addHandler(handler);  // for your code.. 

// you can also set logging levels 
Logger.getLogger(this.getClass().getName()).log(Level.[...]).addHandler(handler); 
3
import java.io.IOException; 
import org.apache.log4j.Appender; 
import org.apache.log4j.FileAppender; 
import org.apache.log4j.Logger; 
import org.apache.log4j.SimpleLayout; 

/** 
* @author Kiran 
* 
*/ 
public class MyLogger { 

    public MyLogger() { 
    } 

    public static void main(String[] args) { 
     Logger logger = Logger.getLogger("MyLog"); 
     Appender fh = null; 
     try { 
      fh = new FileAppender(new SimpleLayout(), "MyLogFile.log"); 
      logger.addAppender(fh); 
      fh.setLayout(new SimpleLayout()); 
      logger.info("My first log"); 
     } catch (SecurityException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     logger.info("Hi How r u?"); 
    } 
} 
+0

ありがとう、これは私を助けましたが、Log4j 2が出てきて、私は1.2バージョンを見つけるためにサイトを魚釣りしなければなりませんでした。 – SoluableNonagon

3

たぶんthis is ...まず

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.IOException; 
import java.util.logging.FileHandler; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 

/** 
* LogToFile class 
* This class is intended to be use with the default logging class of java 
* It save the log in an XML file and display a friendly message to the user 
* @author Ibrabel <[email protected]> 
*/ 
public class LogToFile { 

    protected static final Logger logger=Logger.getLogger("MYLOG"); 
    /** 
    * log Method 
    * enable to log all exceptions to a file and display user message on demand 
    * @param ex 
    * @param level 
    * @param msg 
    */ 
    public static void log(Exception ex, String level, String msg){ 

     FileHandler fh = null; 
     try { 
      fh = new FileHandler("log.xml",true); 
      logger.addHandler(fh); 
      switch (level) { 
       case "severe": 
        logger.log(Level.SEVERE, msg, ex); 
        if(!msg.equals("")) 
         JOptionPane.showMessageDialog(null,msg, 
          "Error", JOptionPane.ERROR_MESSAGE); 
        break; 
       case "warning": 
        logger.log(Level.WARNING, msg, ex); 
        if(!msg.equals("")) 
         JOptionPane.showMessageDialog(null,msg, 
          "Warning", JOptionPane.WARNING_MESSAGE); 
        break; 
       case "info": 
        logger.log(Level.INFO, msg, ex); 
        if(!msg.equals("")) 
         JOptionPane.showMessageDialog(null,msg, 
          "Info", JOptionPane.INFORMATION_MESSAGE); 
        break; 
       case "config": 
        logger.log(Level.CONFIG, msg, ex); 
        break; 
       case "fine": 
        logger.log(Level.FINE, msg, ex); 
        break; 
       case "finer": 
        logger.log(Level.FINER, msg, ex); 
        break; 
       case "finest": 
        logger.log(Level.FINEST, msg, ex); 
        break; 
       default: 
        logger.log(Level.CONFIG, msg, ex); 
        break; 
      } 
     } catch (IOException | SecurityException ex1) { 
      logger.log(Level.SEVERE, null, ex1); 
     } finally{ 
      if(fh!=null)fh.close(); 
     } 
    } 

    public static void main(String[] args) { 

     /* 
      Create simple frame for the example 
     */ 
     JFrame myFrame = new JFrame(); 
     myFrame.setTitle("LogToFileExample"); 
     myFrame.setSize(300, 100); 
     myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     myFrame.setLocationRelativeTo(null); 
     JPanel pan = new JPanel(); 
     JButton severe = new JButton("severe"); 
     pan.add(severe); 
     JButton warning = new JButton("warning"); 
     pan.add(warning); 
     JButton info = new JButton("info"); 
     pan.add(info); 

     /* 
      Create an exception on click to use the LogToFile class 
     */ 
     severe.addActionListener(new ActionListener(){ 

      @Override 
      public void actionPerformed(ActionEvent ae) { 
       int j = 20, i = 0; 
       try { 
        System.out.println(j/i); 
       } catch (ArithmeticException ex) { 
        log(ex,"severe","You can't divide anything by zero"); 
       } 

      } 

     }); 

     warning.addActionListener(new ActionListener(){ 

      @Override 
      public void actionPerformed(ActionEvent ae) { 
       int j = 20, i = 0; 
       try { 
        System.out.println(j/i); 
       } catch (ArithmeticException ex) { 
        log(ex,"warning","You can't divide anything by zero"); 
       } 

      } 

     }); 

     info.addActionListener(new ActionListener(){ 

      @Override 
      public void actionPerformed(ActionEvent ae) { 
       int j = 20, i = 0; 
       try { 
        System.out.println(j/i); 
       } catch (ArithmeticException ex) { 
        log(ex,"info","You can't divide anything by zero"); 
       } 

      } 

     }); 

     /* 
      Add the JPanel to the JFrame and set the JFrame visible 
     */ 
     myFrame.setContentPane(pan); 
     myFrame.setVisible(true); 
    } 
} 
10

、あなたのロガーを定義し、それを呼び出そうと何クラス\方法からしましたか?作業例があり、焼きたて:あなたのコードで

public class LoggingTester { 
    private final Logger logger = Logger.getLogger(LoggingTester.class 
      .getName()); 
    private FileHandler fh = null; 

    public LoggingTester() { 
     //just to make our log file nicer :) 
     SimpleDateFormat format = new SimpleDateFormat("M-d_HHmmss"); 
     try { 
      fh = new FileHandler("C:/temp/test/MyLogFile_" 
       + format.format(Calendar.getInstance().getTime()) + ".log"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     fh.setFormatter(new SimpleFormatter()); 
     logger.addHandler(fh); 
    } 

    public void doLogging() { 
     logger.info("info msg"); 
     logger.severe("error message"); 
     logger.fine("fine message"); //won't show because to high level of logging 
    } 
} 

は、あなたは、私が上記のように、あなたがそれを行うことができ、簡単なものを必要とするが、別の選択肢がある場合、あなたはそれをフォーマットすることができ、フォーマッタを定義するために忘れてしまいました

fh.setFormatter(new Formatter() { 
      @Override 
      public String format(LogRecord record) { 
       SimpleDateFormat logTime = new SimpleDateFormat("MM-dd-yyyy HH:mm:ss"); 
       Calendar cal = new GregorianCalendar(); 
       cal.setTimeInMillis(record.getMillis()); 
       return record.getLevel() 
         + logTime.format(cal.getTime()) 
         + " || " 
         + record.getSourceClassName().substring(
           record.getSourceClassName().lastIndexOf(".")+1, 
           record.getSourceClassName().length()) 
         + "." 
         + record.getSourceMethodName() 
         + "() : " 
         + record.getMessage() + "\n"; 
      } 
     }); 

それとも、好きな他の修正:自分で、例としては、(次のコードだけで、それを挿入する代わりに、このラインfh.setFormatter(新SimpleFormatter()))があります。それが役に立てば幸い。

4

ログファイルの場所はlogging.propertiesファイルで制御できます。 java -Djava.util.logging.config.file=/scratch/user/config/logging.properties

詳細:https://docs.oracle.com/cd/E23549_01/doc.1111/e14568/handler.htm

がlogging.properties内のハンドラプロパティにFileHandlerのを追加し、ファイルにログを送信するために、ファイルハンドラ

を設定し、それはJVMパラメータEXとして渡すことができますファイル。これにより、ファイルロギングがグローバルに有効になります。

handlers= java.util.logging.FileHandler設定次のプロパティを設定することで、ハンドラ:

java.util.logging.FileHandler.pattern=<home directory>/logs/oaam.log 
java.util.logging.FileHandler.limit=50000 
java.util.logging.FileHandler.count=1 
java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter 

java.util.logging.FileHandler.patternは、出力ファイルの場所とパターンを指定します。デフォルトの設定はホームディレクトリです。

java.util.logging.FileHandler.limitは、ロガーが任意の1つのファイルに書き込む最大量をバイト単位で指定します。

java.util.logging.FileHandler.countは、循環する出力ファイルの数を指定します。

java.util.logging.FileHandler.formatterは、ファイルハンドラクラスがログメッセージをフォーマットするために使用するjava.util.loggingフォーマッタクラスを指定します。 SimpleFormatterはログレコードの簡単な「人が読める」サマリを書き込みます。代わりに$ JDK_HOME/JRE/libに/ logging.propertiesで、この構成ファイルを使用するには、Javaを指示する

:ここ

java -Djava.util.logging.config.file=/scratch/user/config/logging.properties 
0

が私のロギングクラスbased on the accepted answerです:

可能
import java.io.File; 
import java.io.IOException; 
import java.nio.file.Files; 
import java.nio.file.Paths; 
import java.text.DateFormat; 
import java.text.SimpleDateFormat; 
import java.util.Date; 
import java.util.logging.*; 

public class ErrorLogger 
{ 
    private Logger logger; 

    public ErrorLogger() 
    { 
     logger = Logger.getAnonymousLogger(); 

     configure(); 
    } 

    private void configure() 
    { 
     try 
     { 
      String logsDirectoryFolder = "logs"; 
      Files.createDirectories(Paths.get(logsDirectoryFolder)); 
      FileHandler fileHandler = new FileHandler(logsDirectoryFolder + File.separator + getCurrentTimeString() + ".log"); 
      logger.addHandler(fileHandler); 
      SimpleFormatter formatter = new SimpleFormatter(); 
      fileHandler.setFormatter(formatter); 
     } catch (IOException exception) 
     { 
      exception.printStackTrace(); 
     } 

     addCloseHandlersShutdownHook(); 
    } 

    private void addCloseHandlersShutdownHook() 
    { 
     Runtime.getRuntime().addShutdownHook(new Thread(() -> 
     { 
      // Close all handlers to get rid of empty .LCK files 
      for (Handler handler : logger.getHandlers()) 
      { 
       handler.close(); 
      } 
     })); 
    } 

    private String getCurrentTimeString() 
    { 
     DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss"); 
     return dateFormat.format(new Date()); 
    } 

    public void log(Exception exception) 
    { 
     logger.log(Level.SEVERE, "", exception); 
    } 
} 
関連する問題