最近两年一直使用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>
查看官方文档说明
控制台输出用到的ConsoleAppendar和记录到文件用到的PollingFileAppender都继承自OutputStreamAppender,其中有个encoder属性,当写日志的时候会调用encoder的doEncode()方法。
查看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即可解决问题