logback中文乱码问题

    最近两年一直使用logback作为日志记录框架,一直很正常,今天突然遇到一个问题,日志框架控制台打印和记录文件的时候中文都是乱码了,解决办法如下:

    在logback.xml中设置字符集即可。

<!-- 打印到控制台 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>
            [ %-5level] [%date{yyyy-MM-dd HH:mm:ss}] %logger{96} [%line] - %msg%n
        </pattern>
        <charset>UTF-8</charset> <!-- 此处设置字符集 -->
    </encoder>
</appender>
<!--DEBUG -->
<appender name="LOG-DEBUG"
          class="ch.qos.logback.core.rolling.RollingFileAppender">
    <prudent>true</prudent>
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>DEBUG</level>
        <OnMatch>ACCEPT</OnMatch>
        <OnMismatch>DENY</OnMismatch>
    </filter>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>./logs/DEBUG-%d{yyyy-MM-dd}.log</fileNamePattern>
        <!-- 保存前7天的日志文件 -->
        <maxHistory>7</maxHistory>
    </rollingPolicy>
    <!-- 如果超过10MB就删除 -->
    <triggeringPolicy
            class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
        <maxFileSize>10MB</maxFileSize>
    </triggeringPolicy>
    <layout>
        <Pattern>
            [ %-5level] [%date{yyyy-MM-dd HH:mm:ss}] %logger{96}[%line] - %msg%n
        </Pattern>
        <charset>UTF-8</charset> <!-- 此处设置字符集 -->
    </layout>
</appender>

   查看官方文档说明

   113657_MTRv_1428349.jpg

控制台输出用到的ConsoleAppendar和记录到文件用到的PollingFileAppender都继承自OutputStreamAppender,其中有个encoder属性,当写日志的时候会调用encoder的doEncode()方法。

 114852_x5Wt_1428349.png

查看Encoder的继承关系和配置文件可以看出控制台输出和文件输出都用到了LayoutWrappingEncoder,LayoutWrappingEncoder有个属性charset

private byte[] convertToBytes(String s) {
  if (charset == null) {
    return s.getBytes();
  } else {
    try {
      return s.getBytes(charset.name());
    } catch (UnsupportedEncodingException e) {
      throw new IllegalStateException(
              "An existing charset cannot possibly be unsupported.");
    }
  }
}

public void doEncode(E event) throws IOException {
  String txt = layout.doLayout(event);
  outputStream.write(convertToBytes(txt));
  if (immediateFlush)
    outputStream.flush();
}

 故设置charset为UTF-8即可解决问题

转载于:https://my.oschina.net/u/1428349/blog/341826

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值