LogBack LayoutWrappingEncoder 的默认字符集?

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

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

但是,我使用的是a(带有a),它似乎以UTF-8输出文件(并且我的Windows 7专业系统的默认字符集可能不是UTF-8)。PatternLayoutEncoderRollingFileAppender

UTF-8输出实际上是我想要的,但我想确保我不是偶然得到的,因为文档似乎指出了其他东西。那么,为什么Logback在我没有显式指定字符集时会给我UTF-8输出呢?


答案 1

日志回传字符编码

您可以在 您的定义中使用,因为这是 的子类,它提供了该方法。这在文档中通过类的摘录来指示,但没有给出示例 xml 配置。对于 LayoutWrappingEncoder,这里给出了一个答案:[Logback-user]:如何使用 UTF-8<charset>PatternLayoutEncoderLayoutWrappingEncodersetCharset

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

<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(例如,我的字符集)。正确的做法是将日志备份配置为 UTF-8,如上所述。即使 logback 是从某个地方选择 UTF-8,或者是由你以某种方式设置的,也不能保证将来会发生这种情况。windows-1252file.encoding

顺便说一句,Sun之前说过file.encoding,如果你在Oracle VM上设置它:

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

Eclipse 和 Maven

如果您从 eclipse 运行 maven,并且您已经将环境设置为 UTF-8,或者用于环境/项目或运行配置(在通用选项卡中为我),则 eclipse 将通过设置 来安排新的 JVM 具有 UTF-8 编码。参见:Eclipse 的编码文档file.encoding


答案 2

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

若要删除机会元素,请指定用于日志记录的字符集,如本答案中所示。Logback 的源代码显示了如何使用字符集将字符串转换为字节,以便在 convertToBytes 方法中写入文件(有关字符串到字节的更多信息,请参阅此答案)。

在 Unix 上,的值是使用环境变量确定的(例如,通过此处所述,但也可以涉及其他环境变量)。
在 Windows 上,默认代码页显示命令 。代码页号与此列表中显示的字符集相对应。例如,代码页 65001 对应于 UTF-8。默认区域设置随命令 一起显示。file.encodingLANG=en_US.UTF-8chcpsysteminfo | findstr Locale

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


推荐