文系プログラマによるTIPSブログ

文系プログラマ脳の私が開発現場で学んだ事やプログラミングのTIPSをまとめています。

logbackで特定クラスのログ出力だけ別ファイルに出力する

APIだけ別のログに出力する、なんて事も可能なのです〜


f:id:treeapps:20180426142529p:plain

ログ出力をする時、◯◯◯な場合のみ、特定のログに出力したい時ってありませんか?

例えばフリーワード検索した時のログを保存し、それをサイトマップxmlに登録する時等。

では早速フリーワード検索専用のロガーを用意し、フリーワード検索用のログを出力してみましょう!

ロガーを用意する

まずはロガーを作成します。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyLogger {

	private static Logger LOGGER = LoggerFactory.getLogger(MyLogger.class);

	public static void info(String test) {
		LOGGER.info(test);
	}

	public static void main(String[] args) {
		info("yahoo!!!");
	}
}

どうでしょう。

なんとlogメソッドがあるだけのクラスなのです。(メソッド名はなんでもいいのです)

mainメソッドは単に実行用なので不要です。

設定ファイルでロガーを指定する

logback.xmlを以下のように編集します。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appender name="freewordAppender"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>freeword.log.%d{yyyy-MM-dd}</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%date{yyyy/MM/dd hh:mm:ss:SSS} %.5level - %logger{0}.%.20method %msg%n</pattern>
        </encoder>
    </appender>

    <logger name="hoge.logger.MyLogger" level="info">
        <appender-ref ref="freewordAppender" />
    </logger>
    <root level="info">
    </root>
</configuration>

ポイントは<logger>のname部分です。

パッケージではなくクラスを指定することで、そのクラスから出力したログは、指定したアペンダに従ってログ出力されるのです。

例えば検索画面でフリーワード検索実行された時、

MyLogger.log(freewordUrl);

のようにstaticメソッドであるlogを呼び出せば、先ほどのアペンダが適用され、freeword.logにURLが出力されるわけです。

fileNamePatternが指定できるので、書式も自由に決められます。

maxHistoryを指定すると世代管理が行えますが、一元管理する意味でもcronで削除した方がいいでしょう。