最近兩年一直使用logback做爲日誌記錄框架,一直很正常,今天忽然遇到一個問題,日誌框架控制檯打印和記錄文件的時候中文都是亂碼了,解決辦法以下:java
在logback.xml中設置字符集便可。app
<!-- 打印到控制檯 --> <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()方法。spa
查看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便可解決問題code