1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【log4j2】log4j2.xmlを好きなところに置きたい

Last updated at Posted at 2022-12-02

動機

log4j2で使うlog4j2.xmlをsrc直下に置くのはダサいと思ったため、別の場所に置きたかった。
しかし、その方法がググってもちゃんとは出てなかったため、備忘録として残しておく。

環境

  • Windows10
  • eclipse IDE
    • Version: 2022-09 (4.25.0)
    • Build id: 20220908-1902
  • JRE: JavaSE-1.8

結論

Loggerクラスを作る前に以下のコードを使ってlog4j2.xmlを読み込めばよい:

System.setProperty("log4j.configurationFile", "<ファイルパス>");

導入

通常の場合、log4j2 + SLF4Jでログ出力をする時、/src直下にlog4j2.xmlを配置する必要がある:

src/
  - log4j2WithSlf4j
    - Main.java
  - log4j2.xml

ただし、以下の必要なライブラリはビルドパスに通しておく(古かったら適宜差し替えておいてください)。

  • log4j-api-2.19.0.jar
  • log4j-core-2.19.0.jar
  • log4j-slf4j-impl-2.19.0.jar
  • slf4j-api-1.7.25.jar

Main.javaとlog4j2.xmlはシンプルに書いておく。
ログファイルに出力することは考えずに、コンソールに出るようにしておく。

Main.java
package log4j2WithSlf4j;

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

public class Main {
	public static void main(String[] args) {
		Logger logger = LoggerFactory.getLogger(Main.class);
	    logger.info("Hello World !!");
	    
	    System.out.println("end");
	}
}
log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="30">
    <Properties>
        <Property name="LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1} - %m%n</Property>
    </Properties>
 
    <Appenders>
        <Console name="console" target="SYSTEM_OUT" follow="true">
            <PatternLayout pattern="${LOG_PATTERN}"/>
        </Console>
    </Appenders>
 
    <Loggers>
        <Root level="info">
            <AppenderRef ref="console"/>
        </Root>
    </Loggers>
</Configuration>

Javaアプリケーションとして実行すると、以下のような出力が得られる:

Main.javaの出力結果
2022-12-02 23:35:05 INFO  Main - Hello World !!
end

本題:log4j2.xmlを読み込むには

以下ではちゃんと読み込まれているか判別できるようにするため、ログ出力をちょっと変える。
コンソールちゃんに褒めてほしい人生だった。

log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="30">
    <Properties>
    	<Property name="CONGRATURATIONS">出力できてるじゃん!すっごーい!!!</Property>
        <Property name="LOG_PATTERN">${CONGRATURATIONS} %d{yyyy-MM-dd HH:mm:ss} %-5p %c{1} - %m%n</Property>
    </Properties>
 
    <Appenders>
        <Console name="console" target="SYSTEM_OUT" follow="true">
            <PatternLayout pattern="${LOG_PATTERN}"/>
        </Console>
    </Appenders>
 
    <Loggers>
        <Root level="debug">
            <AppenderRef ref="console"/>
        </Root>
    </Loggers>
</Configuration>

例えば下のようにlog4j2.xmlを配置したとする:

src/
  - log4j2WithSlf4j
    - Main.java
    - log4j2.xml

この時、Main.javaでは1行追加すればOK。

package log4j2WithSlf4j;

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

public class Main {
	public static void main(String[] args) {
+		System.setProperty("log4j.configurationFile", "log4j2WithSlf4j/log4j2.xml");
	
		Logger logger = LoggerFactory.getLogger(Main.class);
	    logger.info("Hello World !!");
	    
	    System.out.println("end");
	}
}
Main.javaの出力結果
出力できてるじゃん!すっごーい!!! 2022-12-02 23:41:04 INFO  Main - Hello World !!
end

やったぜ

ちなみにsrc/下じゃない別フォルダでもいけるらしい。

例:src外のconfigフォルダの場合

下のような配置であったとする。

src/
  - log4j2WithSlf4j
    - Main.java
config/
  - log4j2.xml

この時も同じように1行追加すればよい。

package log4j2WithSlf4j;

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

public class Main {
	public static void main(String[] args) {
+		System.setProperty("log4j.configurationFile", "config/log4j2.xml");
	
		Logger logger = LoggerFactory.getLogger(Main.class);
	    logger.info("Hello World !!");
	    
	    System.out.println("end");
	}
}
Main.javaの出力結果
出力できてるじゃん!すっごーい!!! 2022-12-02 23:51:00 INFO  Main - Hello World !!
end

/src基準でファイルパスを書くとうまくいきませんでした。どなたかご教示願います。。

後書き

これを機にSystem.*について勉強しようと思いました。本来ならあまり使うべきものではなさそうだけど。

参考

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?