SpringBoot日誌:Springboot內部採用的是Commons Logging 進行日誌記錄,但在底層爲Java Util,Loggin,Log4J,Logback等日誌框架提供默認配置,雖然有很多可用日誌框架,一般使用SpringBoot默認的Logback即可,Logback效率更高,支持SLF4J。
1. 日誌依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
注:spring-boot-starter中包含了springboot-starter-logging
2. 日誌格式:
注:輸出如下內容:
時間日期:精確到毫秒,可以用於排序 日誌級別:ERROR,WARN,INFO,DEBUG,TRACE;
進程ID: 分割符:採用---來標識日誌開始部分;
線程名:方括號括起來; Logger名:通常使用源代碼的類名;
日誌內容:日誌輸出的信息
3.日誌輸出級別:
SpringBoot默認輸出的日誌級別爲:INFO,WARN,ERROR;
日誌級別從低到高爲:TRACE<DEBUG<INFO<WARN<ERROR<FATA 若設置爲WARN 則低於WARN級別的信息不會輸出
如需輸出更多日誌可以通過以下方式開啓:
命令模式配置:Java -jar app.jar -debug=true 這種命令會被SpringBoot解析,優先級最高;
資源文件配置:application.properties 配置debug=true 即可
4.輸出級別配置:
所有支持的日誌記錄系統都可以在spring環境中設置記錄級別(application.properties)
格式爲:logging.level.* = LEVEL;
loggging.level :日誌級別控制前綴,*爲表名或loggger名;
LEVEL 選項:TRACE,DEBUG,INFO,WARN,ERROR,FATAL,OFF;
例子:logging.level.root =DEBUG root日誌以DEUBG級別輸出;
logging.level.com.wuxia=DEBUG com.wuxia包下的所有class以DEBUG級別輸出;
#日誌配置
logging.level.root=info
logging.level.org.springframework.web=debug
logging.level.org.mybatis= INFO
logging.level.com.com.fyl.navigation.dao=debug
5.日誌輸出位置:
默認情況下,Springboot僅將日誌輸出到控制檯,不會寫入到日誌文件中去,如果除了控制檯輸出之外還想寫日誌文件,則需要在application.proterties設置logging.file或logging.path屬性;
logging.file :將日誌寫入到指定的文件中,默認爲相對路徑,可以設置爲絕對路徑。
logging.path:將名爲spring.log寫入到指定的文件夾中
注:如果只配置logging.file,會在項目的當前路徑下生成一個xxx.log日誌文件
如果只配置logging.path,會在指定文件夾下生成一個日誌文件spring.log 二者不能同時用,同時用只logging.file生效;
默認日誌文件達到10MB時進行切割,產生新的日誌文件:(spring.1.log,spring.2.log);
logging.file.max-size=10MB
logging.file.max-history=10
6.自定義日誌配置
日誌文件一般在ApplcationContext創建前就初始化了,所以不是必須通過spring的配置文件控制,可以外部添加配置文件控制日誌:
根據不同的日誌系統,按如下規則建立配置文件名,就可以被加載:
Logback:logback-spring.xml,logback-spring.groovy,logback.xml,logback.groovy;
Log4j:log4j-spring.properties,log4j-spring.xml,log4j.properties,log4j.xml;
推薦使用帶有spring的文件名作爲日誌文件;一般使用logback-spring.xml 作爲配置文件;文件放在resources下;
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<!--定義日誌文件的存儲地址:-->
<property name="LOG_HOME" value="D:/logs"></property>
<property name="LOG_NAME" value="logs"></property>
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
<conversionRule conversionWord="wex"
converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
<conversionRule conversionWord="wEx"
converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
<!--定義文件輸出格式-->
<property name="FILE_LOG_PATTERN"
value="${FILE_LOG_PATTERN:-%d{yyyy-MM-dd HH:mm:ss.SSS} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<property name="CONSOLE_LOG_PATTERN"
value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<!--注意:日誌級別文件
日誌記錄採用分級記錄,級別與日誌文件名相對應,不同級別的日誌信息記錄到不同的日誌文件中:
-->
<appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">D
<pattern>
${CONSOLE_LOG_PATTERN}
</pattern>
</layout>
</appender>
<appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder> <!--<encoder>表示對日誌進行編碼-->
<pattern>${FILE_LOG_PATTERN}</pattern><!-- 日誌格式 -->
<charset>utf-8</charset><!--編碼方式 -->
</encoder>
<file>${LOG_HOME}/${LOG_NAME}-all.log</file> <!--輸出文件位置及文件名-->
<!--日誌記錄器的滾動策略,按日期,大小記錄-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern> <!-- 歸檔日誌文件路徑 -->
${LOG_HOME}/backup/${LOG_NAME}-log-all-%d{yyyy-MM-dd}.%i.log
</fileNamePattern>
<maxHistory>30</maxHistory><!-- 保留最近30天 -->
<totalSizeCap>1GB</totalSizeCap><!--指定日誌文件上限,到達上限刪除舊文件 -->
<cleanHistoryOnStart>true</cleanHistoryOnStart>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>5MB</maxFileSize><!-- 日誌文件不超過5M,超過拆分文件 -->
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--filter爲系統定義的攔截器,使用ThresholdFilter來過濾掉ERROR級別以下的日誌文件不輸出到文件-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>utf-8</charset>
</encoder>
<file>${LOG_HOME}/${LOG_NAME}-error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>
${LOG_HOME}/backup/${LOG_NAME}-log-error-%d{yyyy-MM-dd}.%i.log
</fileNamePattern>
<maxHistory>30</maxHistory>
<totalSizeCap>1GB</totalSizeCap>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>5MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<!-- 配置多環境日誌輸出:(prod:生產環境 ,test:測試環境,dev:開發環境 來定義不同日誌輸出)-->
<springProfile name="prod">
<appender-ref ref="fileInfoLog"/>
</springProfile>
<springProfile name="dev,test">
<appender-ref ref="fileErrorLog"/>
</springProfile>
<root level="${logging.level.root}">
<appender-ref ref="consoleLog"/>
<appender-ref ref="fileInfoLog"/>
<appender-ref ref="fileErrorLog"/>
</root>
</configuration>
7.打印日誌:
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
private static Logger logger= LogManager.getLogger("UserService");
@Override
public List<User> showUser() {
logger.info("hello");
List<User> users = userMapper.showUser();
return users;
}
}
注:每次打印日誌都要寫private static Logger log=LogManager.getLogger("UserService");很麻煩,可以使用lombok插件;
在類上寫上註解@Slf4j:
@Service
@Slf4j
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public List<User> showUser() {
log.info("hello");
List<User> users = userMapper.showUser();
return users;
}
}