Eclipse で Java プログラムを実行しても大丈夫だったのに、いざ Jar ファイルを作って実行すると コンソール出力やログファイルが文字化けしてしまう
原因が、Eclipse なのか Ant なのか Log4j2 なのか色々悩みました。
犯人は、 Log4j でした。
ログファイルに出力するときの文字コードを指定します。
赤文字の属性を PatternLayout に持たせます。
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn">
<Properties>
<Property name="loglayout">%d{yyyy-MM-dd HH:mm:ss.SSS}, %-5p, %t, %c, %m%n</Property>
<Property name="filename">Log/App.log</Property>
</Properties>
<Appenders>
<RollingFile name="RollingFile" fileName="${filename}" filePattern="${filename}-%d{yyyy-MM-dd-HH}-%i.log" ignoreExceptions="false">
<PatternLayout pattern="${loglayout}" charset="UTF-8" />
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="250 MB" />
<OnStartupTriggeringPolicy />
</Policies>
<DefaultRolloverStrategy max="9"/>
</RollingFile>
<Console name="STDOUT" target="SYSTEM_OUT" ignoreExceptions="false">
<PatternLayout pattern="%m%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="trace">
<AppenderRef ref="STDOUT" />
<AppenderRef ref="RollingFile" />
</Root>
</Loggers>
</Configuration>
またプロパティファイルなどのリソースをファイルにもたせてプログラムから参照しているときも注意が必要です。
ファイルから読み込むときに文字コードを指定しておかないと Windows だとシフトJIS で実行されるので読み込んだ時点でファイルが文字化けします。Eclipse で動かすときは 文字コードを指定しているので文字化けしません。
InputStream is = XXXXX.class.getClassLoader().getResourceAsStream("App.properties");
BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"));