当我编写相同的 UTF-8 时,为什么两个系统上的 Log4J2 输出不同?
Why does Log4J2 output differ on two systems when I am writing the same UTF-8?
我正在将 Unicode 字符写入 Log4J2 日志。在一台机器上 (Windows 8) 我在日志中看到了这个:
2016-08-30 16:44:00.958|English: The quick brown fox jumped over the lazy dog.
2016-08-30 16:44:00.960|German: Falsches Üben von Xylophonmusik quält jeden größeren Zwerg.
2016-08-30 16:44:00.960|Russian 1: В чащах юга жил бы цитрус? Да, но фальшивый экземпляр!
2016-08-30 16:44:00.960|Russian 2: Съешь же ещё этих мягких французских булок да выпей чаю.
2016-08-30 16:44:00.960|Chinese: 中国智造,慧及全球
2016-08-30 16:44:00.960|Japanese: いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす
2016-08-30 16:44:00.960|Korean: 다람쥐 헌 쳇바퀴에 타고파
在另一台机器上(Windows Server 2012R2)我看到了这个:
2016-08-30 16:50:41.676|English: The quick brown fox jumped over the lazy dog.
2016-08-30 16:50:41.676|German: Falsches Üben von Xylophonmusik quält jeden größeren Zwerg.
2016-08-30 16:50:41.676|Russian 1: ? ????? ??? ??? ?? ??????? ??, ?? ????????? ?????????!
2016-08-30 16:50:41.676|Russian 2: ????? ?? ??? ???? ?????? ??????????? ????? ?? ????? ???.
2016-08-30 16:50:41.676|Chinese: ?????????
2016-08-30 16:50:41.676|Japanese: ??????? ????? ?????? ????? ??????? ????? ??????? ?????
2016-08-30 16:50:41.676|Korean: ??? ? ???? ???
如果Log4J2默认写UTF-8,为什么2号系统的日志文件只有问号?也就是说,第二个系统可能(可能是)缺少字体,但是第二个系统上的日志文件本身包含实际的问号,使用 hexdump 工具,我希望至少能看到文件中 UTF-8 字符的二进制文件。换句话说,我能理解为什么未知字符可能 渲染 不正确,我只是不明白为什么没有将正确的 Unicode 写入文件,如果进行写入的过程是JVM,对字符使用 Unicode。
您是否尝试在 Log4j 配置文件中为您的 Log4j 布局强制使用 UTF-8 字符集?例如,使用 PatternLayout
:
<Configuration ...>
...
<PatternLayout pattern="..." charset="UTF-8"/>
...
</Configuration>
有关 Log4j 编码问题的详细信息,请参阅 https://logging.apache.org/log4j/2.x/manual/layouts.html。
Log4j 2 中模式布局的默认字符集是系统默认字符集,而不是 UTF8。其他布局可能有不同的默认字符集,这在每个布局的 manual page 中都有记录。
如其他答案所示,您可以在布局配置中指定字符集。
我正在将 Unicode 字符写入 Log4J2 日志。在一台机器上 (Windows 8) 我在日志中看到了这个:
2016-08-30 16:44:00.958|English: The quick brown fox jumped over the lazy dog.
2016-08-30 16:44:00.960|German: Falsches Üben von Xylophonmusik quält jeden größeren Zwerg.
2016-08-30 16:44:00.960|Russian 1: В чащах юга жил бы цитрус? Да, но фальшивый экземпляр!
2016-08-30 16:44:00.960|Russian 2: Съешь же ещё этих мягких французских булок да выпей чаю.
2016-08-30 16:44:00.960|Chinese: 中国智造,慧及全球
2016-08-30 16:44:00.960|Japanese: いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす
2016-08-30 16:44:00.960|Korean: 다람쥐 헌 쳇바퀴에 타고파
在另一台机器上(Windows Server 2012R2)我看到了这个:
2016-08-30 16:50:41.676|English: The quick brown fox jumped over the lazy dog.
2016-08-30 16:50:41.676|German: Falsches Üben von Xylophonmusik quält jeden größeren Zwerg.
2016-08-30 16:50:41.676|Russian 1: ? ????? ??? ??? ?? ??????? ??, ?? ????????? ?????????!
2016-08-30 16:50:41.676|Russian 2: ????? ?? ??? ???? ?????? ??????????? ????? ?? ????? ???.
2016-08-30 16:50:41.676|Chinese: ?????????
2016-08-30 16:50:41.676|Japanese: ??????? ????? ?????? ????? ??????? ????? ??????? ?????
2016-08-30 16:50:41.676|Korean: ??? ? ???? ???
如果Log4J2默认写UTF-8,为什么2号系统的日志文件只有问号?也就是说,第二个系统可能(可能是)缺少字体,但是第二个系统上的日志文件本身包含实际的问号,使用 hexdump 工具,我希望至少能看到文件中 UTF-8 字符的二进制文件。换句话说,我能理解为什么未知字符可能 渲染 不正确,我只是不明白为什么没有将正确的 Unicode 写入文件,如果进行写入的过程是JVM,对字符使用 Unicode。
您是否尝试在 Log4j 配置文件中为您的 Log4j 布局强制使用 UTF-8 字符集?例如,使用 PatternLayout
:
<Configuration ...>
...
<PatternLayout pattern="..." charset="UTF-8"/>
...
</Configuration>
有关 Log4j 编码问题的详细信息,请参阅 https://logging.apache.org/log4j/2.x/manual/layouts.html。
Log4j 2 中模式布局的默认字符集是系统默认字符集,而不是 UTF8。其他布局可能有不同的默认字符集,这在每个布局的 manual page 中都有记录。
如其他答案所示,您可以在布局配置中指定字符集。