1、日志框架
市面上的日志框架:JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j....
|
日志門面 (日志的抽象層) |
日志實作 |
|
JCL(Jakarta Commons Logging) SLF4j(Simple Logging Facade for Java) jboss-logging |
Log4j JUL(java.util.logging) Log4j2 Logback |
左邊選一個門面(抽象層)、右邊選一個日志實作;
日志門面:SLF4J;日志實作:Logback;
SpringBoot:底層是Spring框架,Spring框架默認是用JCL;
SpringBoot選用 SLF4j和logback
2、SLF4j使用
(1).如何在系統中使用SLF4J
官方檔案:http://www.slf4j.org/
開發時,日志記錄方法的呼叫,不應直接呼叫日志的實作類,而是呼叫日志抽象層里面的方法;給系統里面匯入slf4j的jar和logback的實作jar

[1].SLF4j的HelloWorld
http://www.slf4j.org/manual.html
|
import org.slf4j.Logger; import org.slf4j.LoggerFactory;
public class HelloWorld { public static void main(String[] args) { Logger logger = LoggerFactory.getLogger(HelloWorld.class); logger.info("Hello World"); } } |

每一個日志的實作框架都有自己的組態檔,使用slf4j以后,組態檔還是做成日志實作框架自己本身的組態檔;
(2)歷史遺留問題
其中一個系統使用system(slf4j+logback),Spring系統使用spring(commons-logging),mybatis、xxx 如果想要整合這些東西,日志使用的都不一致,如何統一日志記錄,即使是不同框架如何統一使用slf4j進行輸出?如何解決.
http://www.slf4j.org/legacy.html

問題:如何讓系統中所有日志統一到SLF4j

通過以上官方的圖片我們知道:
[1].首先將系統中其他日志框架排除出去
[2].用中間包替換原有的日志框架
[3].匯入slf4j其他的實作
(3)SpringBoot日志關系
|
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> |
SpringBoot使用它來做日志功能;
|
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </dependency> |
底層依賴關系

總結:
?1)SpringBoot底層也是使用slf4j+logback的方式進行日志記錄
?2)SpringBoot也把其他的日志都替換成了slf4j;
?3)中間替換包
|
@SuppressWarnings("rawtypes") public abstract class LogFactory {
static String UNSUPPORTED_OPERATION_IN_JCL_OVER_SLF4J = "http://www.slf4j.org/codes.html#unsupported_operation_in_jcl_over_slf4j";
static LogFactory logFactory = new SLF4JLogFactory(); |

4)如果我們要引入其他框架?一定要把這個框架的默認日志依賴移除掉?
Spring框架用的是commons-logging;
|
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> |
SpringBoot能自動適配所有的日志,而且底層使用slf4j+logback的方式記錄日志,引入其他框架的時候,只需要把這個框架依賴的日志框架排除掉即可;
(4)日志使用
[1].默認配置
SpringBoot默認幫我們配置好了日志;
|
//記錄器 Logger logger = LoggerFactory.getLogger(getClass()); @Test public void contextLoads() { //日志的級別 由低到高 trace<debug<info<warn<error //可以調整輸出的日志級別;日志就只會在這個級別及以后的高級別生效 logger.trace("這是trace日志...."); logger.debug("這是debug日志...."); //springboot默認使用的是info級別 沒有指定級別則使用springboot的默認規定的級別;root級別 logger.info("這是info日志......"); logger.warn("這是warn日志......"); logger.error("這是error日志...."); } |

|
logging.file |
logging.path |
Example |
Description |
|
(none) |
(none) |
|
只在控制臺輸出 |
|
指定檔案名 |
(none) |
my.log |
輸出日志到my.log檔案 |
|
(none) |
指定目錄 |
/var/log |
輸出到指定目錄的 spring.log 檔案中 |
|
<-- 日志輸出格式: %d表示日期時間, %thread表示執行緒名, %-5level:級別從左顯示5個字符寬度 %logger{50} 表示logger名字最長50個字符,否則按照句點分割, %msg:日志訊息, %n是換行符 --> %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n |
范例:SpringBoot修改日志的默認配置
|
#logging.file已經過期 需要更換為logging.file.name #指定路徑D:/springboot.log #logging.file.name=D:/springboot.log
#在當前磁盤的根路徑下創建spring檔案夾和里面的log檔案夾;使用spring.log作為默認檔案 logging.file.path=./spring/log
#在控制臺輸出日志的格式 logging.pattern.console=%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n #指定檔案中日志輸出的格式 logging.pattern.file=%d{yyyy-MM-dd} ===> [%thread] ===> %-5level ===> %logger{50} ===> %msg%n |
[2].指定配置
給類路徑下放上每個日志框架自己的組態檔即可;SpringBoot就不使用他默認配置的了,
|
Logging System |
Customization |
|
Logback |
logback-spring.xml, logback-spring.groovy, logback.xml or logback.groovy |
|
Log4j2 |
log4j2-spring.xml or log4j2.xml |
|
JDK (Java Util Logging) |
logging.properties |
logback.xml:直接就被日志框架識別了;
logback-spring.xml:日志框架就不直接加載日志的配置項,由SpringBoot決議日志配置,可以使用SpringBoot的高級Profile功能
|
<springProfile name="staging"> <!-- configuration to be enabled when the "staging" profile is active --> 可以指定某段配置只在某個環境下生效 </springProfile> |
范例:logback-spring.xml
|
<appender name="stdout" > <!-- 日志輸出格式: %d表示日期時間, %thread表示執行緒名, %-5level:級別從左顯示5個字符寬度 %logger{50} 表示logger名字最長50個字符,否則按照句點分割, %msg:日志訊息, %n是換行符 --> <layout > <springProfile name="dev"> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ----> [%thread] ---> %-5level %logger{50} - %msg%n</pattern> </springProfile> <springProfile name="!dev"> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ==== [%thread] ==== %-5level %logger{50} - %msg%n</pattern> </springProfile> </layout> </appender> |
如果使用logback.xml作為日志組態檔,還要使用profile功能,會有以下錯誤
`no applicable action for [springProfile]`
(5)切換日志框架
[1].log4j
|
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <artifactId>logback-classic</artifactId> <groupId>ch.qos.logback</groupId> </exclusion> <exclusion> <artifactId>log4j-over-slf4j</artifactId> <groupId>org.slf4j</groupId> </exclusion> </exclusions> </dependency>
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </dependency> |
[2].log4j2
|
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <artifactId>spring-boot-starter-logging</artifactId> <groupId>org.springframework.boot</groupId> </exclusion> </exclusions> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency> |
參考檔案:http://www.slf4j.org//
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/165335.html
標籤:Java
上一篇:面試官:大部分面試官都會問到的5個Java面試題你都懷疑人生,還跟我提想要月薪20k?
下一篇:IO那些事
