お手軽Log作成(Java)

ログファイルを出力する簡単なテストプログラムです。(log4jは使いません。)

Logger.java

ログ出力部品として呼び出されるクラス例です。

package com.itbibo.example.logger;

import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.nio.charset.Charset;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;

public class Logger {

    /** 日付フォーマット **/
    private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS");
    /** ログファイルのライター **/
    private static PrintWriter logW = null;
    /** ログファイル初期化フラグ **/
    private static boolean logInit = false;

    /**
     * ログファイル初期化(上書き)
     * @param logFilePath ログファイルパス
     * @param charset 文字集合名
     * @return
     */
    public static int initFile(String logFilePath, Charset charset) {
        return init(logFilePath,charset,false);
    }

    /**
     * ログファイル初期化(追記)
     * @param logFilePath ログファイルパス
     * @param charset 文字集合名
     * @return
     */
    public static int initFileAppend(String logFilePath, Charset charset) {
        return init(logFilePath,charset,true);
    }

    /**
     * ログ出力初期化
     * @param logFilePath
     * @param charset 文字集合名
     * @param append (true:追記、false:上書き)
     * @see https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/nio/charset/Charset.html
     *       https://docs.oracle.com/javase/jp/11/intl/supported-encodings.html
     * @return
     */
    private static int init(String logFilePath, Charset charset, boolean append) {

        if (logInit) {
            return 1;
        }

        // PrintWriterクラスのオブジェクトを生成する
        try {
            logW = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(logFilePath), charset)), append);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return 1;
        }
        logInit = true;
        return 0;
    }

    /** INFOログ **/
    public static void info(String msg) { logOutput(" INFO  ", msg); }

    /** WARNログ **/
    public static void warn(String msg) { logOutput(" WARN  ", msg); }

    /** ERRORログ **/
    public static void error(String msg) { logOutput(" ERROR ", msg); }

    /** ERRORログ(例外有) **/
    public static void error(String msg, Exception e) {
        StringWriter sw = new StringWriter();
        PrintWriter pw = new PrintWriter(sw);
        e.printStackTrace(pw);
        logOutput(" ERROR ", msg.concat(" ").concat(sw.toString()));
    }

    /** FATALログ(例外有) **/
    public static void fatal(String msg, Exception e) {
        StringWriter sw = new StringWriter();
        PrintWriter pw = new PrintWriter(sw);
        e.printStackTrace(pw);
        logOutput(" FATAL ",  msg.concat(" ").concat(sw.toString()));
    }

    /**
     * ログ出力
     * @param logCategory ログカテゴリ
     * @param msg ログメッセージ
     */
    private static void logOutput(String logCategory, String msg) {
        if (!logInit) {
            return;
        }
        StringBuilder sb = new StringBuilder();
        sb.append(Thread.currentThread().getStackTrace()[3].getClassName());
        sb.append(".");
        sb.append(Thread.currentThread().getStackTrace()[3].getMethodName());
        Timestamp timestamp = new Timestamp(System.currentTimeMillis());
        logW.println(sdf.format(timestamp) + logCategory + sb.toString() + " " + msg);
        logW.flush();
    }

    /**
     * ログファイルを閉じる
     */
    public static void close() {
        if (logW != null) {
            logW.close();
        }
        logInit = false;
    }
}

LoggerTest.java

ログ出力部品を呼び出すクラス例です。

package com.itbibo.example.logger;

import java.nio.charset.Charset;

public class LoggerTest {

    public static void main(String[] args) {
        String logFilePathShift_JIS="C:\\tmp\\LoggerTest-Shift_JIS.log";
        Logger.initFile(logFilePathShift_JIS, Charset.forName("Shift_JIS"));
        Logger.info("Logger info テスト");
        Logger.warn("Logger warnning テスト");
        Logger.error("Logger error テスト");
        Logger.close();
        String logFilePathUTF_8="C:\\tmp\\LoggerTest-UTF-8.log";
        Logger.initFile(logFilePathUTF_8, Charset.forName("UTF-8"));
        Logger.info("Logger info テスト");
        Logger.warn("Logger warnning テスト");
        Logger.error("Logger error テスト");
        Logger.close();
    }
}

参考サイト

タイトルとURLをコピーしました