spring boot內部使用Commons Logging來記錄日誌,但也保留外部接口可讓一些日誌框架來進行實現,例如Java Util Logging,Log4J2還有Logback。若是你想用某一種日誌框架來進行實現的話,就必須先配置,默認狀況下,spring boot使用Logback做爲日誌實現的框架。html
1.1 配置控制檯日誌的debug級別 默認狀況下,spring boot從控制檯打印出來的日誌級別只有ERROR, WARN 還有INFO,若是你想要打印debug級別的日誌,能夠經過application.properites配置debug=truejava
1.2 在生產環境環境下,你能夠經過命令行進行配置日誌的debug級別 java -jar C:\Users\Administrator\app\xx\demo.jar --debugmysql
1.3 配置logging.level.*來具體輸出哪些包的日誌級別 logging.level.root=INFO logging.level.org.springframework.web=DEBUG logging.level.org.hibernate=ERRORweb
1.4 將日誌輸出到文件中 默認狀況下spring boot是不將日誌輸出到日誌文件中,但你能夠經過在application.properites文件中配置logging.file文件名稱和logging.path文件路徑,將日誌輸出到文件中 logging.path=F:\demo logging.file=demo.log logging.level.root=infospring
這裏須要注意幾點: 這裏若不配置具體的包的日誌級別,日誌文件信息將爲空 若只配置logging.path,那麼將會在F:\demo文件夾生成一個日誌文件爲spring.log(該文件名是固定的,不能更改)。若是path路徑不存在,會自動建立該文件夾 若只配置logging.file,那將會在項目的當前路徑下生成一個demo.log日誌文件。這裏可使用絕對路徑如,會自動在e盤下建立文件夾和相應的日誌文件。 logging.file=E:\demo\demo.logsql
logging.path和logging.file同時配置,不會在這個路徑有F:\demo\demo.log日誌生成,logging.path和logging.file不會進行疊加(要注意) logging.path和logging.file的value均可以是相對路徑或者絕對路徑 這就是基礎的日誌配置,能夠直接在application.properties配置,咱們還能夠在classpath路徑下,經過定義具體的日誌文件來配置——logback.xml數據庫
Logback是由log4j創始人設計的又一個開源日誌組件。logback當前分紅三個模塊:logback-core,logback- classic和logback-access。logback-core是其它兩個模塊的基礎模塊。logback-classic是log4j的一個 改良版本。此外logback-classic完整實現SLF4J API使你能夠很方便地更換成其它日誌系統如log4j或JDK14 Logging。logback-access訪問模塊與Servlet容器集成提供經過Http來訪問日誌的功能。 Logback是要與SLF4J結合起來用兩個組件的官方網站以下: 點擊查看——>logback的官方網站 點擊查看——> SLF4J的官方網站apache
maven配置安全
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.0.11</version>
</dependency>
複製代碼
Logback優勢 Logback和log4j是很是類似的,若是你對log4j很熟悉,那對logback很快就會駕輕就熟。下面列了logback相對於log4j的一些優勢:springboot
1.更快的實現 Logback的內核重寫了,在一些關鍵執行路徑上性能提高10倍以上。並且logback不只性能提高了,初始化內存加載也更小了。
二、很是充分的測試 Logback通過了幾年,數不清小時的測試。Logback的測試徹底不一樣級別的。在做者的觀點,這是簡單重要的緣由選擇logback而不是log4j。
三、 Logback-classic實現了 SLF4j 在使用SLF4j中,你都感受不到logback-classic。並且由於logback-classic很是天然地實現了SLF4J, 所 以切換到log4j或者其餘,很是容易,只須要提供成另外一個jar包就OK,根本不須要去動那些經過SLF4JAPI實現的代碼。
四、自動從新加載配置文件 當配置文件修改了,Logback-classic能自動從新加載配置文件。掃描過程快且安全,它並不須要另外建立一個掃描線程。這個技術充分保證了應用程序能跑得很歡在JEE環境裏面。
五、配置文件能夠處理不一樣的狀況 開發人員常常須要判斷不一樣的Logback配置文件在不一樣的環境下(開發,測試,生產)。而這些配置文件僅僅只有一些很小的不一樣,能夠經過,和來實現,這樣一個配置文件就能夠適應多個環境。
六、Filters(過濾器) 有些時候,須要診斷一個問題,須要打出日誌。在log4j,只有下降日誌級別,不過這樣會打出大量的日誌,會影響應用性能。在Logback,你能夠繼續 保持那個日誌級別而除掉某種特殊狀況,如alice這個用戶登陸,她的日誌將打在DEBUG級別而其餘用戶能夠繼續打在WARN級別。要實現這個功能只需 加4行XML配置。能夠參考MDCFIlter 。
七、SiftingAppender(一個很是多功能的Appender) 它能夠用來分割日誌文件根據任何一個給定的運行參數。如,SiftingAppender可以區別日誌事件跟進用戶的Session,而後每一個用戶會有一個日誌文件。
八、自動壓縮已經打出來的log RollingFileAppender在產生新文件的時候,會自動壓縮已經打出來的日誌文件。壓縮是個異步過程,因此甚至對於大的日誌文件,在壓縮過程當中應用不會受任何影響。
九、堆棧樹帶有包版本 Logback在打出堆棧樹日誌時,會帶上包的數據。
十、自動去除舊的日誌文件 經過設置TimeBasedRollingPolicy或者SizeAndTimeBasedFNATP的maxHistory屬性,你能夠控制已經產生日誌文件的最大數量。若是設置maxHistory 12,那那些log文件超過12個月的都會被自動移除。
一、Logger、appender及layout Logger做爲日誌的記錄器,把它關聯到應用的對應的context上後,主要用於存放日誌對象,也能夠定義日誌類型、級別。 Appender主要用於指定日誌輸出的目的地,目的地能夠是控制檯、文件、遠程套接字服務器、 MySQL、 PostreSQL、 Oracle和其餘數據庫、 JMS和遠程UNIX Syslog守護進程等。 Layout 負責把事件轉換成字符串,格式化的日誌信息的輸出。
二、logger context 各個logger 都被關聯到一個 LoggerContext,LoggerContext負責製造logger,也負責以樹結構排列各 logger。其餘全部logger也經過org.slf4j.LoggerFactory 類的靜態方法getLogger取得。 getLogger方法以 logger 名稱爲參數。用同一名字調用LoggerFactory.getLogger 方法所獲得的永遠都是同一個logger對象的引用。
三、有效級別及級別的繼承 Logger 能夠被分配級別。級別包括:TRACE、DEBUG、INFO、WARN 和 ERROR,定義於 ch.qos.logback.classic.Level類。若是 logger沒有被分配級別,那麼它將從有被分配級別的最近的祖先那裏繼承級別。root logger 默認級別是 DEBUG。
四、打印方法與基本的選擇規則 打印方法決定記錄請求的級別。例如,若是 L 是一個 logger 實例,那麼,語句 L.info("..")是一條級別爲 INFO 的記錄語句。記錄請求的級別在高於或等於其 logger 的有效級別時被稱爲被啓用,不然,稱爲被禁用。記錄請求級別爲 p,其logger的有效級別爲 q,只有則當 p>=q時,該請求才會被執行。 該規則是 logback 的核心。級別排序爲: TRACE < DEBUG < INFO < WARN < ERROR
Logback使用介紹:
1、:Logback配置根元素 屬性包括: 1,scan: 當此屬性設置爲true時,配置文件若是發生改變,將會被從新加載,默認值爲true。 2,scanPeriod: 設置監測配置文件是否有修改的時間間隔,若是沒有給出時間單位,默認單位是毫秒。當scan爲true時,此屬性生效。默認的時間間隔爲1分鐘。 3,debug: 當此屬性設置爲true時,將打印出logback內部日誌信息,實時查看logback運行狀態。默認值爲false。 子元素: :上下文名字; :定義屬性,可使用${}在配置文件中使用; 二,:在logback中是用於具體記錄日誌的組件,能夠用來配置日誌記錄方式,日誌記錄格式等; 屬性包括: name:appender的名字,用於下面在配置日誌的時候指定; class:使用到的appender類; 常見的appender: 1,ch.qos.logback.core.ConsoleAppender:輸出到控制檯; 2,ch.qos.logback.core.FileAppender:輸出到文件; 3,ch.qos.logback.core.rolling.RollingFileAppender:輸出到文件,能夠配置滾動策略,當日志達到某個條件以後分文件記錄; 4,還有其餘的appender,好比寫到數據庫等; 元素的基本格式:
... 元素用來規定日誌的輸出格式,全部表達式都以%開始表示接下來是一個特殊標識符 常見標識符: 1,%logger{n}:輸出Logger對象類名,n表明長度; 2,%class{n}:輸出所在類名, 3,d{pattern}或者date{pattern}:輸出日誌日期,格式同java; 4,L/line:日誌所在行號; 5,m/msg:日誌內容; 6,method:所在方法名稱; 7,p/level:日誌級別; 8,thread:所在線程名稱;
3.1 Logback的默認配置 若是配置文件 logback-test.xml 和 logback.xml 都不存在,那麼 logback 默認地會調用BasicConfigurator ,建立一個最小化配置。最小化配置由一個關聯到根 logger 的ConsoleAppender 組成。輸出用模式爲%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n 的 PatternLayoutEncoder 進行格式化。root logger 默認級別是 DEBUG。
一、Logback的配置文件 Logback 配置文件的語法很是靈活。正由於靈活,因此沒法用 DTD 或 XML schema 進行定義。儘管如此,能夠這樣描述配置文件的基本結構:以開頭,後面有零個或多個元素,有零個或多個元素,有最多一個元素。
二、Logback默認配置的步驟
(1). 嘗試在 classpath 下查找文件 logback-test.xml; (2). 若是文件不存在,則查找文件 logback.xml; (3). 若是兩個文件都不存在,logback 用 Bas icConfigurator 自動對本身進行配置,這會致使記錄輸出到控制檯。
三、logback-spring.xml 文件
springboot默認支持logback.xml或者logback-spring.xml,推薦使用logback-spring.xml,springboot會增長額外功能;
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--定義日誌文件的存儲地址 勿在 LogBack 的配置中使用相對路徑-->
<property name="LOG_PATH" value="/path" />
<!-- 控制檯輸出 -->
<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} [%thread] %-5level %logger{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}/TestWeb.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>
<!-- show parameters for hibernate sql 專爲 Hibernate 定製 -->
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" />
<logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="DEBUG" />
<logger name="org.hibernate.SQL" level="DEBUG" />
<logger name="org.hibernate.engine.QueryParameters" level="DEBUG" />
<logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" />
<!--myibatis log configure-->
<logger name="com.apache.ibatis" level="TRACE"/>
<logger name="java.sql.Connection" level="DEBUG"/>
<logger name="java.sql.Statement" level="DEBUG"/>
<logger name="java.sql.PreparedStatement" 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>
複製代碼
package com.jd.springboot;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HelloController{
//定義一個全局的記錄器,經過LoggerFactory獲取
private final static Logger logger = LoggerFactory.getLogger(HelloController.class);
public static void main(String[] args) {
logger.info("logback 成功了");
logger.error("logback 成功了");
}
}
複製代碼
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--
說明:
一、日誌級別及文件
日誌記錄採用分級記錄,級別與日誌文件名相對應,不一樣級別的日誌信息記錄到不一樣的日誌文件中
例如:error級別記錄到log_error_xxx.log或log_error.log(該文件爲當前記錄的日誌文件),而log_error_xxx.log爲歸檔日誌,
日誌文件按日期記錄,同一天內,若日誌文件大小等於或大於10M,則按0、一、2...順序分別命名
例如log-level-2018-12-28.0.log
其它級別的日誌也是如此。
二、文件路徑
若開發、測試用,在Eclipse中運行項目,則到Eclipse的安裝路徑查找logs文件夾,以相對路徑../logs。
若部署到Tomcat下,則在Tomcat下的logs文件中
三、Appender
FILEERROR對應error級別,文件名以log-error-xxx.log形式命名
FILEWARN對應warn級別,文件名以log-warn-xxx.log形式命名
FILEINFO對應info級別,文件名以log-info-xxx.log形式命名
FILEDEBUG對應debug級別,文件名以log-debug-xxx.log形式命名
stdout將日誌信息輸出到控制上,爲方便開發測試使用
-->
<contextName>SpringBootDemo</contextName>
<property name="LOG_PATH" value="D:\\JavaWebLogs" />
<!--設置系統日誌目錄-->
<property name="APPDIR" value="SpringBootDemo" />
<!-- 日誌記錄器,日期滾動記錄 -->
<appender name="FILEERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在記錄的日誌文件的路徑及文件名 -->
<file>${LOG_PATH}/${APPDIR}/log_error.log</file>
<!-- 日誌記錄器的滾動策略,按日期,按大小記錄 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 歸檔的日誌文件的路徑,例現在天是2013-12-21日誌,當前寫的日誌文件路徑爲file節點指定,能夠將此文件與file指定文件路徑設置爲不一樣路徑,從而將當前日誌文件或歸檔日誌文件置不一樣的目錄。
而2018-12-28的日誌文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
<fileNamePattern>${LOG_PATH}/${APPDIR}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 除按日誌記錄以外,還配置了日誌文件不能超過2M,若超過2M,日誌文件會以索引0開始,
命名日誌文件,例如log-error-2018-12-28.0.log -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!-- 追加方式記錄日誌 -->
<append>true</append>
<!-- 日誌文件的格式 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<!-- 此日誌文件只記錄info級別的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>error</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 日誌記錄器,日期滾動記錄 -->
<appender name="FILEWARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在記錄的日誌文件的路徑及文件名 -->
<file>${LOG_PATH}/${APPDIR}/log_warn.log</file>
<!-- 日誌記錄器的滾動策略,按日期,按大小記錄 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 歸檔的日誌文件的路徑,例現在天是2018-12-28日誌,當前寫的日誌文件路徑爲file節點指定,能夠將此文件與file指定文件路徑設置爲不一樣路徑,從而將當前日誌文件或歸檔日誌文件置不一樣的目錄。
而2018-12-28的日誌文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
<fileNamePattern>${LOG_PATH}/${APPDIR}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 除按日誌記錄以外,還配置了日誌文件不能超過10M,若超過10M,日誌文件會以索引0開始,
命名日誌文件,例如log-error-2018-12-28.0.log -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!-- 追加方式記錄日誌 -->
<append>true</append>
<!-- 日誌文件的格式 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<!-- 此日誌文件只記錄info級別的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>warn</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 日誌記錄器,日期滾動記錄 -->
<appender name="FILEINFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在記錄的日誌文件的路徑及文件名 -->
<file>${LOG_PATH}/${APPDIR}/log_info.log</file>
<!-- 日誌記錄器的滾動策略,按日期,按大小記錄 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 歸檔的日誌文件的路徑,例現在天是2018-12-28日誌,當前寫的日誌文件路徑爲file節點指定,能夠將此文件與file指定文件路徑設置爲不一樣路徑,從而將當前日誌文件或歸檔日誌文件置不一樣的目錄。
而2018-12-28的日誌文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
<fileNamePattern>${LOG_PATH}/${APPDIR}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 除按日誌記錄以外,還配置了日誌文件不能超過10M,若超過10M,日誌文件會以索引0開始,
命名日誌文件,例如log-error-2018-12-28.0.log -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!-- 追加方式記錄日誌 -->
<append>true</append>
<!-- 日誌文件的格式 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<!-- 此日誌文件只記錄info級別的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>info</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!--encoder 默認配置爲PatternLayoutEncoder-->
<encoder>
<pattern>===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<!--此日誌appender是爲開發使用,只配置最底級別,控制檯輸出的日誌級別是大於或等於此級別的日誌信息-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>debug</level>
</filter>
</appender>
<logger name="org.springframework" level="WARN" />
<logger name="org.hibernate" level="WARN" />
<!-- 生產環境下,將此級別配置爲適合的級別,以避免日誌文件太多或影響程序性能 -->
<root level="INFO">
<appender-ref ref="FILEERROR" />
<appender-ref ref="FILEWARN" />
<appender-ref ref="FILEINFO" />
<!-- 生產環境將請stdout,testfile去掉 -->
<appender-ref ref="STDOUT" />
</root>
</configuration>
複製代碼