以下是springboot的一個局部依賴關系:
可以看到,java util logging(jul)、common-logging(jcl)、log4j,都被橋接到了slf4j-api上,slf4j-api只提供了slf4j的接口,並無實現,圖中的logback-classic則直接對slf4j進行了實現,而logback-core則支撐了logback-classic
我們可以得出springboot默認日志的最終實現者是logback,即你使用了spring-boot-starter則會引入該日志框架,同時你還可以使用common-logging,log4j,slf4j,java util logging的寫法。
依賴關系分析結束,我們直接上logback的配置文件——logback.xml:
配置示例如下:
<?xml version="1.0" encoding="UTF-8"?> <!-- Copyright 2010-2011 The myBatis Team Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> <configuration debug="false"> <!--定義日志文件的存儲地址 勿在 LogBack 的配置中使用相對路徑--> <property name="LOG_HOME" value="/home" /> <!-- 控制台輸出 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %green(%-5level) %blue(%property{PID}) --- [%-20thread] %cyan(%-70logger{50}) : %msg%n</pattern> </encoder> </appender> <!-- 按照每天生成日志文件 --> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--日志文件輸出的文件名--> <FileNamePattern>${LOG_HOME}/eureka-server.log.%d{yyyy-MM-dd}.log</FileNamePattern> <!--日志文件保留天數--> <MaxHistory>30</MaxHistory> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> </encoder> <!--日志文件最大的大小--> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <MaxFileSize>10MB</MaxFileSize> </triggeringPolicy> </appender> <appender name="liuyx" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--日志文件輸出的文件名--> <FileNamePattern>${LOG_HOME}/liuyx.log.%d{yyyy-MM-dd}.log</FileNamePattern> <!--日志文件保留天數--> <MaxHistory>30</MaxHistory> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> </encoder> <!--日志文件最大的大小--> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <MaxFileSize>10MB</MaxFileSize> </triggeringPolicy> </appender> <!-- 配置一個更自由的log, 可以直接在java中使用 log4j寫法: Logger logger = LogManager.getLogger("liuyxlogger"); 或者slf4j的寫法 Logger logger = LoggerFactory.getLogger("liuyxlogger"); 來將日志打印到指定的文件 --> <logger name="liuyxlogger" additivity="TRUE" level="INFO"> <appender-ref ref="liuyx" level="INFO" /> </logger> <!--myibatis log configure 命名空間寫法--> <logger name="org.apache.ibatis" level="DEBUG"/> <!-- 日志輸出級別 --> <root level="INFO"> <appender-ref ref="STDOUT" /> <appender-ref ref="FILE" /> </root> <!--日志異步到數據庫 --> <!--<appender name="DB" class="ch.qos.logback.classic.db.DBAppender"> <connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource"> <dataSource class="com.mchange.v2.c3p0.ComboPooledDataSource"> <driverClass>com.mysql.jdbc.Driver</driverClass> <url>jdbc:mysql://127.0.0.1:3306/databaseName</url> <user>root</user> <password>root</password> </dataSource> </connectionSource> </appender>--> </configuration>
注釋很明白了,把它放在maven項目的resources目錄下即可生效。
2018年7月10日追加:
spring-boot中對logback做了一些加工,如果我們使用文件名logback-spring.xml,這些加工便會生效,比如,從配置文件中讀取一個參數,以下是一個示例配置:
<?xml version="1.0" encoding="UTF-8"?> <!-- spring對logback提供了一些擴展,如果想使用這些擴展,請使用本文件的文件名替代logback.xml,詳見 https://docs.spring.io/spring-boot/docs/1.5.6.RELEASE/reference/htmlsingle/#boot-features-logging --> <configuration debug="false"> <include resource="org/springframework/boot/logging/logback/defaults.xml"/> <springProperty scope="context" name="springAppName" source="spring.application.name"/> <!--定義日志文件的存儲地址 勿在 LogBack 的配置中使用相對路徑--> <property name="LOG_HOME" value="/log/${springAppName}" /> <!-- 控制台輸出 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %green(%-5level) %blue(%property{PID}) --- [%-20thread] %cyan(%-70logger{50}) : %msg%n</pattern> </encoder> </appender> <!-- 按照每天生成日志文件 --> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!--<file>${LOG_HOME}/%d{yyyy-MM-dd}/log.log</file>--> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!--日志文件輸出的文件名--> <fileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}/log-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!--日志文件保留天數--> <maxHistory>30</maxHistory> <maxFileSize>30MB</maxFileSize> <!--所有日志最大尺寸--> <totalSizeCap>10GB</totalSizeCap> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level - %msg%n</pattern> </encoder> <!--<filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter>--> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <!-- 過濾掉TRACE和DEBUG級別的日志 --> <level>INFO</level> </filter> </appender> <!-- 異步輸出 --> <appender name ="ASYNC" class= "ch.qos.logback.classic.AsyncAppender"> <!-- 不丟失日志.默認的,如果隊列的80%已滿,則會丟棄TRACT、DEBUG、INFO級別的日志 --> <!--<discardingThreshold >0</discardingThreshold>--> <!-- 更改默認的隊列的深度,該值會影響性能.默認值為256 --> <queueSize>512</queueSize> <!-- 添加附加的appender,最多只能添加一個 --> <appender-ref ref ="FILE"/> </appender> <!--<logger name="org.springframework.amqp" level="INFO"/> <logger name="org.springframework.boot" level="INFO"/>--> <!--<logger name="com.inspur" level="INFO"/>--> <!-- 日志輸出級別 --> <root level="INFO"> <appender-ref ref="STDOUT" /> <appender-ref ref="ASYNC" /> </root> </configuration>