【问题标题】:LogBack default charset for LayoutWrappingEncoder?LayoutWrappingEncoder 的 LogBack 默认字符集?
【发布时间】:2015-08-25 14:58:17
【问题描述】:

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

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

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

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

【问题讨论】:

  • 看起来你是偶然得到这个的。我查看了源代码,在 PatternLayoutEncoder 中找不到任何调用“setCharset”的类。文档用“用户选择的字符集编码”指示this 很好的答案中已经描述的内容。
  • 但是这个“偶然”是如何工作的呢?我在 Windows 机器上 --- 它从哪里获得 UTF-8?它必须来自某个地方。
  • 默认字符集(通过LayoutWrappingEncoder 中的getBytes() 使用)是bit complicated,但not a mystery。这些链接可以帮助确定 UTF-8 的来源?
  • 啊,现在我们到了某个地方 --- 你提到 LogBack 使用来自 getBytes() 的值,这意味着使用来自 Charset.defaultCharset 的值。奇怪的是......这会在我的 Windows 系统上返回 UTF-8!这很令人惊讶,因为我一直认为InputStreamReader 在 Windows 上会默认为 UTF-8 以外的其他内容(例如Windows-1252)……但不,它也会返回"UTF8"!也许我的 Eclipse+Maven 设置做了一些奇怪的事情,或者 Java 8 改变了默认值。无论如何,vanOekel,您想提供一个答案以便获得赏金吗?
  • Eclipse 你可以在工作区设置中覆盖文件编码。我怀疑您已经将其设置为 UTF-8。同样在运行配置文件中,您可以更改编码:您将在 Eclipse 中获得 UTF-8,因为您已将项目/环境设置为这样。

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


【解决方案1】:

Logback 字符编码

您可以在PatternLayoutEncoder 的定义中使用<charset>,因为这是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 是由您以某种方式设置的,也不能保证将来会发生这种情况。

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

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

Eclipse 和 Maven

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 提供的两个答案都很好。在选择赏金时,我必须考虑到 andygavin 首先提供了答案。他提供了解决我的问题的实际代码而不是链接;并且是第一个指出我的 Eclipse+Maven 设置可能使我的默认字符集成为 UTF-8 的原因。感谢您的反馈,您在 getBytes() 上的注释很有帮助。
    • @GarretWilson 这听起来很公平。此外,我一路上学到了一两件事,这总是好的。
    猜你喜欢
    • 2021-08-03
    • 2016-09-18
    • 2022-01-17
    • 2012-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    相关资源
    最近更新 更多