LayoutWrappingEncoder的LogBack默认字符集?

时间:2015-08-25 14:58:17

标签: java logging utf-8 character-encoding logback

如果用户没有设置默认字符集,则Logback 1.1.3 LayoutWrappingEncoder documentation不会指示默认字符集是什么,但源代码说明了:

  

默认情况下,此属性的值为null,对应于系统的默认字符集。

但是我使用的是PatternLayoutEncoder(带有RollingFileAppender),它似乎是以UTF-8输出文件(我的Windows 7 Professional系统的默认字符集可能是不是UTF-8)。

UTF-8输出实际上是我想要的,但我想确保我没有偶然得到这个,因为文档似乎表明了别的东西。那么为什么当我没有明确指定一个字符集时,Logback会给我UTF-8输出?

2 个答案:

答案 0 :(得分:11)

回归字符编码

您可以在<charset>的定义中使用PatternLayoutEncoder,因为这是LayoutWrappingEncoder的子类,它提供setCharset方法。这在文档中由类的摘录中指出,但没有给出示例xml配置。对于LayoutWrappingEncoder,这里给出了答案:[Logback-user]: How to use UTF-8

因此,如果您通过代码进行配置,则可以使用UTF-8调用setCharset方法。或者,如果您通过xml进行配置,则为:

<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <charset>UTF-8</charset>            
        <outputPatternAsHeader>true</outputPatternAsHeader>
        <pattern>[%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>

默认文件编码

Logback的文档说明使用了默认字符编码是正确的。 Windows上的默认字符集通常不是UTF-8(例如,我的是windows-1252)。正确的做法是将logback配置为UTF-8,如上所述。即使logback从某个地方挑选UTF-8,或者file.encoding以某种方式由你设定,也不会保证将来会发生这种情况。

顺便说一句,如果你在Oracle VM上设置这个,那么Sun之前曾说过file.encoding:

  

&#34; file.encoding&#34; J2SE平台规范不要求属性;它是Sun实施的内部细节,不应由用户代码检查或修改。它也是只读的;在技​​术上不可能支持在命令行或程序执行期间的任何其他时间将此属性设置为任意值。

Eclipse和Maven

如果您正在从eclipse运行maven,并且您已经将环境设置为UTF-8,无论是环境/项目还是运行配置(对于我在公共选项卡中),那么eclipse将安排新的JVM通过设置file.encoding来进行UTF-8编码。请参阅:Eclipse's encoding documentation

答案 1 :(得分:1)

系统的默认字符集由Java确定并在系统属性file.encoding中设置,但也可以在JVM启动时指定此属性(更多在this answer中)。 Eclipse,Netbeans,Maven等可以使用此系统属性将默认字符集设置为UTF-8,这可能是输出为UTF-8的原因,即使您没有指定它。

要删除机会元素,请指定用于记录的字符集,如this answer所示。 Logback的源代码显示了如何使用字符集将字符串转换为字节以在convertToBytes方法中写入文件(更多关于字符串到字节的解释在this answer中)。

在Unix上,file.encoding的值是使用环境变量确定的(例如,如here所述,通过LANG=en_US.UTF-8确定,但可以涉及其他环境变量as well)。
在Windows上,使用命令chcp显示默认代码页。代码页编号与this list中显示的字符集相对应。例如,代码页65001对应于UTF-8。使用命令systeminfo | findstr Locale显示默认语言环境。

简而言之:一旦您的软件离开您的开发环境,您就不能假设任何特定的默认字符集。因此,请始终指定字符集。