SpringBoot+logback默認(rèn)日志的配置和使用方式
SpringBoot+logback默認(rèn)日志的配置和使用
記錄一下SpringBoot2.0.x使用默認(rèn)logback日志的配置和常見使用
SpringBoot的默認(rèn)日志是logback,在SpringBoot2.0.x版本中使用logback很方便而且內(nèi)存開銷小,速度快,還不需要去單獨(dú)的配置maven的jar包,因?yàn)橐呀?jīng)集成整合了的。
作為專門寫代碼來應(yīng)用的,不需要知道logback到底怎么實(shí)現(xiàn)的,什么底層,什么抽象層,反正用SpringBoot默認(rèn)的就對了,有特殊要求使用其他的 ,查找博客就能解決導(dǎo)包這些問題。
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.5.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent>
從這里點(diǎn)進(jìn)去
<!--web模塊的啟動(dòng)器 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
可以看到這個(gè)starter 繼續(xù)點(diǎn)進(jìn)去查看
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <version>2.0.5.RELEASE</version> <scope>compile</scope> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> <version>2.0.5.RELEASE</version> <scope>compile</scope> </dependency>

配置文件的位置
在項(xiàng)目的/src/main/resources目錄下,新建logback的默認(rèn)日志配置文件logback-spring.xml(配置默認(rèn)就能生效)

注意:當(dāng)然也可以直接logback.xml直接測試也是能生效的
如果說我不喜歡他的默認(rèn)文件名 我非要自定義呢?
自定義配置文件名 myw-logback-test.xml
單獨(dú)加一個(gè)配置在application.properties
#配置文件 logging.config=classpath:myw-logback-test.xml

配置文件內(nèi)容
logback的配置文件內(nèi)容 這個(gè)還真的逐字逐句的了解其真意,這對使用來說特別有用的,最常用的文件類型格式如下
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!--不設(shè)置的話默認(rèn)名稱是default,contextName標(biāo)簽?zāi)茉O(shè)置成其他名稱,用于區(qū)分不同程序應(yīng)用-->
<contextName>spring-boot-logging-myw</contextName>
<!--配置日志文件的輸出路徑-->
<property name="log.path" value="myw-log/" />
<!--輸出到控制臺或者文件-->
<appender name="xxxxxx" class="ch.qos.logback.core.xxxxxxxxx">
<!--內(nèi)容-->
</appender>
<!-- 用來設(shè)置某一個(gè)包或者具體的某一個(gè)類的日志打印 -->
<logger level="xxxx" name="xxxxx">
<!--內(nèi)容-->
</logger>
<!--指定基礎(chǔ)控制臺的日志輸出級別,level屬性指定級別 必須配置的-->
<root level="xxx">
<!--內(nèi)容-->
</root>
</configuration>
configuration標(biāo)簽
- scan=“true” scan屬性默認(rèn)就是true 意思是說配置文件發(fā)生改變后,將會(huì)重新加載,默認(rèn)值為true 實(shí)際使用默認(rèn)就可以。
- scanPeriod=“60 seconds” 這個(gè)是設(shè)置檢測配置文件是否修改的時(shí)間間隔,時(shí)間單位默認(rèn)是毫秒,默認(rèn)1分鐘,但是給了秒的單位后就是秒,一般大家都是是60 seconds這樣配置。
- debug=“false” 這個(gè)屬性默認(rèn)是false 如果需要查看logback內(nèi)部日志,可以設(shè)置為true時(shí),這樣可以實(shí)時(shí)查看logback運(yùn)行狀態(tài)數(shù)據(jù),實(shí)際上沒用過也沒測試過 不關(guān)心這個(gè)點(diǎn)兒。
contextName標(biāo)簽
這個(gè)標(biāo)簽?zāi)J(rèn)名字是default 如果需要可以改成其他名字,一般沒用
<!--不設(shè)置的話默認(rèn)名稱是default,contextName標(biāo)簽?zāi)茉O(shè)置成其他名稱,用于區(qū)分不同程序應(yīng)用--> <contextName>spring-boot-logging-myw</contextName>
在idea的控制臺會(huì)顯示設(shè)置的名稱

但是在log日志文件里沒有這個(gè)屬性值

property標(biāo)簽
用法是在當(dāng)前根目錄下創(chuàng)建日志文件夾
<!-- 當(dāng)前根目錄下創(chuàng)建路徑 --> <property name="log.path" value="myw-log/" />
也可以使用絕對路徑 在linux中用絕對路徑反而更美,一般放在linux的data目錄下面,這樣不管是直接啟動(dòng)還是使用腳本啟動(dòng)還是服務(wù)方式開機(jī)啟動(dòng) 都在data下面 當(dāng)然也可以用相對路徑 但是在加了開機(jī)啟動(dòng)service方式可能日志路徑在/根目錄下面。
<property name="log.path" value="/data/myw-log/" />
在項(xiàng)目中運(yùn)行的話這個(gè)日志文件在

appender標(biāo)簽
<!--輸出到文件-->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在記錄的日志文件的路徑及文件名 -->
<file>${log.path}/log_info.log</file>
<!--日志輸出格式 -->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset> <!-- 此處設(shè)置字符集 -->
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/sys_log-info-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
<!-- 除按日志記錄之外,還配置了日志文件不能超過50M,若超過50M,日志文件會(huì)以索引0開始, 命名日志文件,例如xxx-2023-07-16.0.log -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>50MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- 日志保存周期 天數(shù)-->
<maxHistory>30</maxHistory>
</rollingPolicy>
<!-- 級別過濾 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
appender標(biāo)簽的name和class name可以根據(jù)需要定義 class就給ch.qos.logback.core.rolling.RollingFileAppender搞定,滾動(dòng)記錄文件,目的是當(dāng)符合某個(gè)條件時(shí),將日志記錄到特殊的日志文件,其他方式也有,具體調(diào)整具體配置,寫入文件用這個(gè)就夠了,無需多學(xué)。
file標(biāo)簽用來定義文件名字,encoder標(biāo)簽用來定義日志記錄格式和編碼的,沒啥好說的。
rollingPolicy標(biāo)簽,用來移動(dòng)和重命名日志文件的,使用class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"就可以了,里面的標(biāo)簽有配置日志保存天數(shù) 日志文件大小等,也都直接用,要對日志的配置研究深入再說吧。
filter標(biāo)簽,class屬性有臨界值過濾和級別過濾
class=“ch.qos.logback.classic.filter.LevelFilter”
根據(jù)日志級別進(jìn)行過濾,如果日志級別等于配置級別,過濾器會(huì)根據(jù)onMath(用于配置符合過濾條件的操作) 和 onMismatch(用于配置不符合過濾條件的操作)接收或拒絕日志,一般用這種。
<!-- 級別過濾 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
class=“ch.qos.logback.classic.filter.ThresholdFilter”
過濾掉低于指定臨界值的日志,當(dāng)日志級別等于或高于臨界值時(shí),過濾器返回NEUTRAL;當(dāng)日志級別低于臨界值時(shí),日志會(huì)被拒絕。
<!-- 級別過濾 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
- DENY:日志將立即被拋棄不再經(jīng)過其他過濾器。
- NEUTRAL:有序列表里的下個(gè)過濾器過接著處理日志。
- ACCEPT:日志會(huì)被立即處理,不再經(jīng)過剩余過濾器。
日志級別
日志級別從低到高分為 TRACE < DEBUG < INFO < WARN < ERROR < FATAL
TRACE 和 FATAL 忽略 那么只關(guān)心日志級別 DEBUG < INFO < WARN < ERROR
那么我需要把debug info warn error分開寫入不同的文件的配置
<!--輸出到文件-->
<appender name="file_debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在記錄的日志文件的路徑及文件名 -->
<file>${log.path}/log_debug.log</file>
<!--日志輸出格式 -->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset> <!-- 此處設(shè)置字符集 -->
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/sys_log-debug-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
<!-- 除按日志記錄之外,還配置了日志文件不能超過50M,若超過50M,日志文件會(huì)以索引0開始, 命名日志文件,例如xxx-2023-07-16.0.log -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>50MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- 日志保存周期 天數(shù)-->
<maxHistory>30</maxHistory>
</rollingPolicy>
<!-- 級別過濾 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--輸出到文件-->
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在記錄的日志文件的路徑及文件名 -->
<file>${log.path}/log_error.log</file>
<!--日志輸出格式 -->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset> <!-- 此處設(shè)置字符集 -->
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/sys_log-error-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
<!-- 除按日志記錄之外,還配置了日志文件不能超過50M,若超過50M,日志文件會(huì)以索引0開始, 命名日志文件,例如xxx-2023-07-16.0.log -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>50MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- 日志保存周期 天數(shù)-->
<maxHistory>30</maxHistory>
</rollingPolicy>
<!-- 級別過濾 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--輸出到文件-->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在記錄的日志文件的路徑及文件名 -->
<file>${log.path}/log_info.log</file>
<!--日志輸出格式 -->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset> <!-- 此處設(shè)置字符集 -->
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/sys_log-info-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
<!-- 除按日志記錄之外,還配置了日志文件不能超過50M,若超過50M,日志文件會(huì)以索引0開始, 命名日志文件,例如xxx-2023-07-16.0.log -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>50MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- 日志保存周期 天數(shù)-->
<maxHistory>30</maxHistory>
</rollingPolicy>
<!-- 級別過濾 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--輸出到文件-->
<appender name="file_warn" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在記錄的日志文件的路徑及文件名 -->
<file>${log.path}/log_warn.log</file>
<!--日志輸出格式 -->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset> <!-- 此處設(shè)置字符集 -->
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/sys_log-warn-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
<!-- 除按日志記錄之外,還配置了日志文件不能超過50M,若超過50M,日志文件會(huì)以索引0開始, 命名日志文件,例如xxx-2023-07-16.0.log -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>50MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- 日志保存周期 天數(shù)-->
<maxHistory>30</maxHistory>
</rollingPolicy>
<!-- 級別過濾 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
我們在開發(fā)的時(shí)候 控制臺也是需要打印日志的,因此需要配置
<!--輸出到控制臺-->
<appender name="console_debug" class="ch.qos.logback.core.ConsoleAppender">
<!--日志輸出格式 -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>UTF-8</charset> <!-- 此處設(shè)置字符集 -->
</encoder>
<!-- 級別過濾 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--輸出到控制臺-->
<appender name="console_info" class="ch.qos.logback.core.ConsoleAppender">
<!--日志輸出格式 -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>UTF-8</charset> <!-- 此處設(shè)置字符集 -->
</encoder>
<!-- 級別過濾 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--輸出到控制臺-->
<appender name="console_warn" class="ch.qos.logback.core.ConsoleAppender">
<!--日志輸出格式 -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>UTF-8</charset> <!-- 此處設(shè)置字符集 -->
</encoder>
<!-- 級別過濾 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--輸出到控制臺-->
<appender name="console_error" class="ch.qos.logback.core.ConsoleAppender">
<!--日志輸出格式 -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>UTF-8</charset> <!-- 此處設(shè)置字符集 -->
</encoder>
<!-- 級別過濾 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
root標(biāo)簽
用來指定控制臺的輸出級別和記錄日志的級別,一般使用info級別
<root level="debug">
<appender-ref ref="file_debug" />
<appender-ref ref="file_info" />
<appender-ref ref="file_warn" />
<appender-ref ref="file_error" />
<appender-ref ref="console_debug" />
<appender-ref ref="console_info" />
<appender-ref ref="console_warn" />
<appender-ref ref="console_error" />
</root>
寫一個(gè)控制層LogBackController
package boot.example.logback.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(value="/logback")
public class LogBackController {
private final Logger log = LoggerFactory.getLogger(this.getClass());
@RequestMapping(value="/hello")
public String hello() {
System.out.println("System.out.println 打印");
log.info("log info 日志");
log.error("log error 日志");
log.warn("log warn 日志");
log.debug("log debug 日志");
return "hello world";
}
}
root標(biāo)簽的level屬性設(shè)置debug
啟動(dòng)的時(shí)候控制臺會(huì)顯示很多信息,然后訪問接口可以看到四種級別的日志都有,甚至還有調(diào)試日志

在查看file文件的日志

root標(biāo)簽的level屬性設(shè)置info
設(shè)置info后可以看到debug日志沒有了,相對來說好的多了 info也是推薦的設(shè)置,因?yàn)樗茱@示info warn和error的日志數(shù)據(jù)
控制臺 -已經(jīng)沒有了debug的數(shù)據(jù)

文件的日志


root標(biāo)簽的level屬性設(shè)置warn
控制臺 只有error和warn 至于上面的debug是main的 無需關(guān)心

文件日志


至于error 不測試了
完整的logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!--不設(shè)置的話默認(rèn)名稱是default,contextName標(biāo)簽?zāi)茉O(shè)置成其他名稱,用于區(qū)分不同程序應(yīng)用-->
<contextName>spring-boot-logging-myw</contextName>
<!-- 當(dāng)前根目錄下創(chuàng)建路徑 -->
<property name="log.path" value="myw-log/" />
<!--輸出到控制臺-->
<appender name="console_debug" class="ch.qos.logback.core.ConsoleAppender">
<!--日志輸出格式 -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>UTF-8</charset> <!-- 此處設(shè)置字符集 -->
</encoder>
<!-- 級別過濾 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--輸出到控制臺-->
<appender name="console_info" class="ch.qos.logback.core.ConsoleAppender">
<!--日志輸出格式 -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>UTF-8</charset> <!-- 此處設(shè)置字符集 -->
</encoder>
<!-- 級別過濾 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--輸出到控制臺-->
<appender name="console_warn" class="ch.qos.logback.core.ConsoleAppender">
<!--日志輸出格式 -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>UTF-8</charset> <!-- 此處設(shè)置字符集 -->
</encoder>
<!-- 級別過濾 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--輸出到控制臺-->
<appender name="console_error" class="ch.qos.logback.core.ConsoleAppender">
<!--日志輸出格式 -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>UTF-8</charset> <!-- 此處設(shè)置字符集 -->
</encoder>
<!-- 級別過濾 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--輸出到文件-->
<appender name="file_debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在記錄的日志文件的路徑及文件名 -->
<file>${log.path}/log_debug.log</file>
<!--日志輸出格式 -->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset> <!-- 此處設(shè)置字符集 -->
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/sys_log-debug-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
<!-- 除按日志記錄之外,還配置了日志文件不能超過50M,若超過50M,日志文件會(huì)以索引0開始, 命名日志文件,例如xxx-2023-07-16.0.log -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>50MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- 日志保存周期 天數(shù)-->
<maxHistory>30</maxHistory>
</rollingPolicy>
<!-- 級別過濾 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--輸出到文件-->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在記錄的日志文件的路徑及文件名 -->
<file>${log.path}/log_info.log</file>
<!--日志輸出格式 -->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset> <!-- 此處設(shè)置字符集 -->
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/sys_log-info-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
<!-- 除按日志記錄之外,還配置了日志文件不能超過50M,若超過50M,日志文件會(huì)以索引0開始, 命名日志文件,例如xxx-2023-07-16.0.log -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>50MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- 日志保存周期 天數(shù)-->
<maxHistory>30</maxHistory>
</rollingPolicy>
<!-- 級別過濾 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--輸出到文件-->
<appender name="file_warn" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在記錄的日志文件的路徑及文件名 -->
<file>${log.path}/log_warn.log</file>
<!--日志輸出格式 -->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset> <!-- 此處設(shè)置字符集 -->
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/sys_log-warn-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
<!-- 除按日志記錄之外,還配置了日志文件不能超過50M,若超過50M,日志文件會(huì)以索引0開始, 命名日志文件,例如xxx-2023-07-16.0.log -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>50MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- 日志保存周期 天數(shù)-->
<maxHistory>30</maxHistory>
</rollingPolicy>
<!-- 級別過濾 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--輸出到文件-->
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在記錄的日志文件的路徑及文件名 -->
<file>${log.path}/log_error.log</file>
<!--日志輸出格式 -->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset> <!-- 此處設(shè)置字符集 -->
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/sys_log-error-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
<!-- 除按日志記錄之外,還配置了日志文件不能超過50M,若超過50M,日志文件會(huì)以索引0開始, 命名日志文件,例如xxx-2023-07-16.0.log -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>50MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- 日志保存周期 天數(shù)-->
<maxHistory>30</maxHistory>
</rollingPolicy>
<!-- 級別過濾 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<root level="info">
<appender-ref ref="file_debug" />
<appender-ref ref="file_info" />
<appender-ref ref="file_warn" />
<appender-ref ref="file_error" />
<appender-ref ref="console_debug" />
<appender-ref ref="console_info" />
<appender-ref ref="console_warn" />
<appender-ref ref="console_error" />
</root>
</configuration>
在java中最簡單的使用
private final Logger log = LoggerFactory.getLogger(this.getClass());
在靜態(tài)類里面
package boot.example.logback.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class StaticUtils {
public static final Logger log = LoggerFactory.getLogger(StaticUtils.class);
public static void testLog(){
log.info("log info");
}
}
還可以借助lombok
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>RELEASE</version> <scope>compile</scope> </dependency>
package boot.example.logback.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
@RequestMapping(value="/logback")
public class LogBackController2 {
@RequestMapping(value="/hello2")
public String hello() {
System.out.println("System.out.println2 打印");
log.info("log info2 日志");
log.error("log error2 日志");
log.warn("log warn2 日志");
log.debug("log debug2 日志");
StaticUtils2.testLog();
return "hello world";
}
}
package boot.example.logback.controller;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class StaticUtils2 {
public static void testLog(){
log.info("log info");
}
}
至于logback里的其他標(biāo)簽 不是真正的剛需就不需要去花時(shí)間記錄了。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java數(shù)據(jù)結(jié)構(gòu)之單鏈表詳解
在之前的學(xué)習(xí)中,我們主要了解了很多 Java 的 基本語法,但是在之后的 Java學(xué)習(xí)中,了解基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)的知識非常重要,數(shù)據(jù)結(jié)構(gòu)的思想可以幫助我們更加清晰明白的了解 Java 的解題思路等等.今天我們就來開始學(xué)習(xí)實(shí)現(xiàn)一個(gè)Java基礎(chǔ)的單鏈表,需要的朋友可以參考下2021-05-05
關(guān)于@CacheEvict無法解決分頁緩存清除的解決思路
這篇文章主要介紹了關(guān)于@CacheEvict無法解決分頁緩存清除的解決思路,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
Java 判斷線程池所有任務(wù)是否執(zhí)行完畢的操作
這篇文章主要介紹了Java 判斷線程池所有任務(wù)是否執(zhí)行完畢的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08
詳解eclipse將項(xiàng)目打包成jar文件的兩種方法及問題解決方法
本文給大家介紹了eclipse中將項(xiàng)目打包成jar文件的兩種方法及其遇到問題解決方法,本文圖文并茂給大家介紹的非常詳細(xì),需要的朋友可以參考下2017-12-12
Spring Security基于HttpRequest配置權(quán)限示例詳解
這篇文章主要介紹了Spring Security基于HttpRequest配置權(quán)限示例詳解,我們在配置中配置的url被封裝成RequestMatcher,而hasRole被封裝成AuthorityAuthorizationManager,本文結(jié)合示例代碼講解的非常詳細(xì),需要的朋友可以參考下2024-03-03
Seata?AT獲取數(shù)據(jù)表元數(shù)據(jù)源碼詳解
這篇文章主要為大家介紹了Seata?AT獲取數(shù)據(jù)表元數(shù)據(jù)源碼詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
Java設(shè)計(jì)模式七大原則之接口隔離原則詳解
接口隔離原則(Interface Segregation Principle),又稱為ISP原則,就是在一個(gè)類中不要定義過多的方法,接口應(yīng)該盡量簡單細(xì)化。本文將為大家具體介紹一下Java設(shè)計(jì)模式七大原則之一的接口隔離原則,需要的可以參考一下2022-02-02
ObjectInputStream 和 ObjectOutputStream 介紹_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
ObjectInputStream 和 ObjectOutputStream 的作用是,對基本數(shù)據(jù)和對象進(jìn)行序列化操作支持。本文給大家詳細(xì)介紹了ObjectInputStream 和 ObjectOutputStream的相關(guān)知識,感興趣的朋友一起學(xué)習(xí)吧2017-05-05

