Logback日志
java版本:1.8
前言
在JAVA開(kāi)發(fā)中,我們會(huì)遇到各種各樣的bug蚪腋,怎么樣快速了解自己的bug,需要知道發(fā)生bug的地點(diǎn)時(shí)間以及其他關(guān)于bug的信息姨蟋。Logback就是一個(gè)非常好的滿足這些要求的工具屉凯。我會(huì)根據(jù)一些應(yīng)用場(chǎng)景來(lái)記錄一下使用方法。
官網(wǎng)
http://logback.qos.ch/index.html眼溶,和這官網(wǎng)有點(diǎn)寒酸簡(jiǎn)陋悠砚,我用下來(lái)只有日志報(bào)錯(cuò)時(shí),要查詢相關(guān)原因才會(huì)用的到一點(diǎn)堂飞。
依賴
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.30</version>
</dependency>
引用一下:https://www.cnblogs.com/ryelqy/p/10314147.html灌旧。
logback的配置介紹
Logger绑咱、appender及l(fā)ayout
Logger作為日志的記錄器,把它關(guān)聯(lián)到應(yīng)用的對(duì)應(yīng)的context上后枢泰,主要用于存放日志對(duì)象描融,也可以定義日志類型、級(jí)別衡蚂×耍 Appender主要用于指定日志輸出的目的地,目的地可以是控制臺(tái)毛甲、文件年叮、遠(yuǎn)程套接字服務(wù)器、 MySQL玻募、PostreSQL只损、 Oracle和其他數(shù)據(jù)庫(kù)、 JMS和遠(yuǎn)程UNIX Syslog守護(hù)進(jìn)程等七咧。 Layout 負(fù)責(zé)把事件轉(zhuǎn)換成字符串跃惫,格式化的日志信息的輸出。
logger context
各個(gè)logger 都被關(guān)聯(lián)到一個(gè) LoggerContext艾栋,LoggerContext負(fù)責(zé)制造logger辈挂,也負(fù)責(zé)以樹(shù)結(jié)構(gòu)排列各logger。其他所有l(wèi)ogger也通過(guò)org.slf4j.LoggerFactory 類的靜態(tài)方法getLogger取得裹粤。 getLogger方法以 logger名稱為參數(shù)终蒂。用同一名字調(diào)用LoggerFactory.getLogger 方法所得到的永遠(yuǎn)都是同一個(gè)logger對(duì)象的引用。
有效級(jí)別及級(jí)別的繼承
Logger 可以被分配級(jí)別遥诉。級(jí)別包括:TRACE拇泣、DEBUG、INFO矮锈、WARN 和 ERROR霉翔,定義于ch.qos.logback.classic.Level類。如果 logger沒(méi)有被分配級(jí)別苞笨,那么它將從有被分配級(jí)別的最近的祖先那里繼承級(jí)別债朵。root logger 默認(rèn)級(jí)別是 DEBUG。
打印方法與基本的選擇規(guī)則
打印方法決定記錄請(qǐng)求的級(jí)別瀑凝。例如序芦,如果 L 是一個(gè) logger 實(shí)例,那么粤咪,語(yǔ)句 L.info("..")是一條級(jí)別為 INFO的記錄語(yǔ)句模闲。記錄請(qǐng)求的級(jí)別在高于或等于其 logger 的有效級(jí)別時(shí)被稱為被啟用劝术,否則墓陈,稱為被禁用。記錄請(qǐng)求級(jí)別為 p磁奖,其 logger的有效級(jí)別為 q,只有則當(dāng) p>=q時(shí)某筐,該請(qǐng)求才會(huì)被執(zhí)行比搭。該規(guī)則是 logback 的核心。級(jí)別排序?yàn)椋?TRACE < DEBUG < INFO < WARN < ERROR
系統(tǒng)找尋logback配置文件規(guī)則
嘗試在 classpath下查找文件logback-test.xml南誊;
如果文件不存在敢辩,則查找文件logback.xml;
如果兩個(gè)文件都不存在弟疆,logback用BasicConfigurator自動(dòng)對(duì)自己進(jìn)行配置,這會(huì)導(dǎo)致記錄輸出到控制臺(tái)盗冷。
其實(shí)怠苔,這些順序在日志里也能打印出來(lái),自己看就行仪糖。
logback配置文件
首先柑司,我們希望在控制臺(tái)打印日志。
<?xmlversion="1.0"encoding="UTF-8"?>
<!--
ExampleLOGBACKConfigurationFile
http://logback.qos.ch/manual/configuration.html
-->
<configuration>
<appendername="STDOUT"class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-ddHH:mm:ss.SSS} [%thread]%-5level%logger{35}%L-%msg%n</pattern>
</encoder>
</appender>
<rootlevel="DEBUG">
? ? ? ? <appender-refref="STDOUT"/>
</root>
</configuration>
<configuration>根節(jié)點(diǎn)
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">指明了Appender名稱以及它發(fā)送的日志地址知控制臺(tái)锅劝。
<encoder>解碼器
<pattern>指明了日志輸出格式攒驰,具體語(yǔ)言規(guī)范網(wǎng)上有。
<root level="DEBUG">指明跟級(jí)別的日志指能輸出Degub以上級(jí)別的日志故爵。
<appender-ref ref="STDOUT" />指明系統(tǒng)要用名為STDOUT的日志打印玻粪。
我們還希望能在一些文件中打印日志。
<appendername="FILE"class="ch.qos.logback.core.FileAppender">
<file>testFile.log</file>
<append>true</append>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread]%-5level%logger{35}-%msg%n</pattern>
</encoder>
</appender>
<file>文件名
<append>true</append>加日志诬垂,歷史日志保留劲室。
我還希望能按包把日志按照不同級(jí)別打印到不同文件里。
<loggername="mybatis.mysql.without.spring"level="info">
<appender-refref="STDOUT"/>
</logger>
<loggername="mybatis.mysql.without.spring.service"level="info">
<appender-refref="STDOUT"/>
</logger>
<logger name="mybatis.mysql.without.spring" level="info">指明了包的地址以及設(shè)置的日志等級(jí)结窘。由于是info很洋,所以沒(méi)有dubug與trace。
由于這兩個(gè)包是從屬關(guān)系隧枫,所以service包內(nèi)的日志會(huì)被打印兩遍喉磁。
我們還可以按照日志等級(jí)不同打印到不同文件中,并且按時(shí)清空日志文件官脓。
<appendername="FILE-DEBUG"class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/logback/log/test-debug.log</file>
<rollingPolicyclass="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/logs/test-debug-%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread]%-5level%logger{35}-%msg%n</pattern>
</encoder>
<!--filter過(guò)濾器协怒,DEBUG-->
<filterclass="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">是個(gè)按時(shí)清空滾動(dòng)日志的功能。這里是設(shè)定每30天清空卑笨。
<filter class="ch.qos.logback.classic.filter.LevelFilter">設(shè)定按照的日志等級(jí)斤讥。這里是debug。
如果我們配置文件不直接在resources下(系統(tǒng)默認(rèn)地址),而是在別的地方芭商,我們也有方法手動(dòng)定位到Logback.xml配置文件派草。
public class Main{
private static final Loggerlogger = LoggerFactory.getLogger(Main.class);
public static void main(String[]args)throws IOException, JoranException{
LoggerContext lc=(LoggerContext)LoggerFactory.getILoggerFactory();
JoranConfigurator configurator=new JoranConfigurator();
configurator.setContext(lc);
lc.reset();
try{
configurator.doConfigure("src/main/resources/log/logback.xml");
}catch(JoranExceptione) {
e.printStackTrace();
? ? ?? }
StatusPrinter.printInCaseOfErrorsOrWarnings(lc);
System.out.println("===================");
logger.debug("Hello {}","debug message");
TestEntitytest Entity=new TestEntity();
testEntity.setCreateTime(newDate());
testEntity.setModifyTime(newDate());
testEntity.setContent("我是2");
System.out.println(testEntity);
logger.debug("debug");
logger.info("info");
logger.warn("warn");
logger.error("error");
Service service=new Service();
service.insert(testEntity);
System.out.println("ok");
?? }
}
LoggerContext把許多l(xiāng)ogback-classic組件基于一身,可以用于跟蹤配置文件铛楣。
JoranConfigurator增加了與logback-classic有關(guān)的功能近迁。
setContext更新context。