Javaでのログ出力についてようわかってなかったので基礎から調べました。
目的
- プログラムの実行過程を把握するため
- System.out.printだと単純な出力だけなので、出力するレベルの変更、テキストファイルへの出力などを制御できない
設定
Javaでは標準でjava.util.loggingというログのライブラリがあり、この設定をカスタマイズしてログを出すのがよいと思います。
設定はプロパティファイルでlogging.propertiesとし、プロジェクトディレクトリ直下)におきます。
プロパティの内容はコメントを参照して下さい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#ファイルとコンソールに出力する、という意味です。これをかかないとそもそも動きません。 handlers=java.util.logging.FileHandler,java.util.logging.ConsoleHandler #出力レベルの制御をしています。詳細はリンクを参照 java.util.logging.ConsoleHandler.level=WARNING #ここで出力形式を決めます。(SimpleFormatterとXMLFormatterがあります。) java.util.logging.ConsoleHandler.formatter=java.util.logging.XMLFormatter #ファイルの保存場所とファイル名です。下記の設定だとユーザーディレクトリになります(WinだとC:\\Users\\(ユーザー名)です) java.util.logging.FileHandler.pattern = %h/namamugi%u.log #1ファイルに書きこむバイト数です。 java.util.logging.FileHandler.limit = 50000 #追加上書きがあるかいなか java.util.logging.FileHandler.append= true #作成ログファイル数 java.util.logging.FileHandler.count = 10 #Consoleのときと同じで出力形式です。 java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter |
ソース
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
public class Main { //ここにファイル名とファイルパスの情報を書きます。 protected static final String ROOT_DIR = System.getProperty("user.dir"); protected static final String LOGGING_PROPERTIES = "logging.properties"; public static void main(String[] args) { Main ja = new Main(); ja.start(); } public Main() { try { //ここで読みこみます。 String filePath = ROOT_DIR + File.separator + LOGGING_PROPERTIES; InputStream inStream = new FileInputStream(filePath); LogManager.getLogManager().readConfiguration(inStream); } catch (IOException | SecurityException ex) { //Exceptionの記述 } } public void start() { //ここでロガーの生成です。クラス名を書くのが一般的なようです。 //レベル別にそれぞれ出力しています。 Logger logger = Logger.getLogger("Main"); logger.finest("隣の客はよく柿食う客だ。"); logger.finer("東京都特許許可局。"); logger.fine("かえるぴょこぴょこ。"); logger.config("庭には二羽鶏が。"); logger.info("生麦生米生卵。"); logger.warning("あかまきがみ。"); logger.severe("すもももももももものうち。"); } } |
出力
上記のソースを書くとコンソールには以下のように出力されます。
(XMLFormatterにしていること、WARNINGレベル以上の出力が反映されていないのがわかると思います。)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<?xml version="1.0" encoding="windows-31j" standalone="no"?> <!DOCTYPE log SYSTEM "logger.dtd"> <log> <record> <date>2015-08-26T12:09:12</date> <millis>1440558552234</millis> <sequence>1</sequence> <logger>Main</logger> <level>WARNING</level> <class>com.mycompany.subject.Main</class> <method>start</method> <thread>1</thread> <message>あかまきがみ。</message> </record> <record> <date>2015-08-26T12:09:12</date> <millis>1440558552234</millis> <sequence>2</sequence> <logger>Main</logger> <level>SEVERE</level> <class>com.mycompany.subject.Main</class> <method>start</method> <thread>1</thread> <message>すもももももももものうち。</message> </record> |
ちなみにファイルには下記のように出力されています。(こちら出力レベルは同じでSimpleFormatter形式です。)
1 2 3 4 |
8 26, 2015 12:09:12 午後 com.mycompany.subject.Main start 警告: あかまきがみ。 8 26, 2015 12:09:12 午後 com.mycompany.subject.Main start 重大: すもももももももものうち。 |
リンク
忘れっぽいエンジニアのJakarta Strutsリファレンス ログをコンソールに出力する(java.util.logging.ConsoleHandler)
java.util.logging – FileHandler.patternで指定したディレクトリを作成する
今回の内容は超基本なので徐々に発展的な内容にしていきたいなと思います。