Spring Boot 下,嘗試使用log4j 記錄日誌到logstash,在src/main/resources 目錄下添加log4j.properties 文件進行自定義輸出日誌文件,未能成功。在application.yml 中配置logging path 打印日誌成功了,但是未能調試成功日誌分文件記錄。網上查閱資料,說是Spring Boot 默認使用logback 記錄日誌。 log4j 多次嘗試後無果,遂改為使用logback 記錄,最終測試成功。
1. 關於Spring Boot 日誌文件路徑的疑惑?
同時配置了logging.path 和logging.file 屬性,如下配置:
logging: path: /var/log file: test.log
僅僅只會在項目根路徑下產生test.log 文件,不會在指定路徑下產生日誌文件(期望日誌路徑為:logging.path + logging.file)。
原因:Spring Boot 中的logging.path 和logging.file 這2個屬性,只需要配置其中之一即可,如果同時配置,則使用logging.file 屬性。
當配置了loggin.path 屬性時,將在該路徑下生成spring.log 文件,即:此時使用默認的日誌文件名spring.log。
當配置了loggin.file 屬性時,將在指定路徑下生成指定名稱的日誌文件。默認為項目相對路徑,可以為logging.file 指定絕對路徑。
logging:
path: /var/logs # 在/var/logs目錄下生成spring.log文件file: /var/logs/test.log # 在/var/logs目錄下生成test.log文件
2. logback 取代log4j的理由:
以下來在網絡摘抄:
Logback 和log4j 是非常相似的,如果你對log4j 很熟悉,那對logback 很快就會得心應手。下面列了logback 相對於log4j 的一些優點:
1、更快的實現Logback 的內核重寫了,在一些關鍵執行路徑上性能提升10倍以上。而且logback 不僅性能提升了,初始化內存加載也更小了。
2、非常充分的測試Logback 經過了幾年,數不清小時的測試。 Logback 的測試完全不同級別的。在作者的觀點,這是簡單重要的原因選擇logback 而不是log4j。
3、Logback-classic 非常自然實現了SLF4j Logback-classic 實現了SLF4j。在使用SLF4j中,你都感覺不到logback-classic。而且因為logback-classic 非常自然地實現了SLF4J,所以切換到log4j 或者其他,非常容易,只需要提供成另一個jar 包就OK,根本不需要去動那些通過SLF4JAPI 實現的代碼。
4、非常充分的文檔,官方網站有兩百多頁的文檔。
5、自動重新加載配置文件,當配置文件修改了,Logback-classic能自動重新加載配置文件。掃描過程快且安全,它並不需要另外創建一個掃描線程。這個技術充分保證了應用程序能跑得很歡在JEE環境裡面。
6、Lilith,Lilith 是log 事件的觀察者,和log4j 的chainsaw 類似。而lilith 還能處理大數量的log 數據。
7、謹慎的模式和非常友好的恢復,在謹慎模式下,多個FileAppender 實例跑在多個JVM 下,能夠安全地寫道同一個日誌文件。 RollingFileAppender 會有些限制。 Logback 的FileAppender 和它的子類包括RollingFileAppender 能夠非常友好地從I/O 異常中恢復。
8、配置文件可以處理不同的情況,開發人員經常需要判斷不同的Logback 配置文件在不同的環境下(開發,測試,生產)。而這些配置文件僅僅只有一些很小的不同,可以通過,和來實現,這樣一個配置文件就可以適應多個環境。
9、Filters(過濾器),有些時候,需要診斷一個問題,需要打出日誌。在log4j,只有降低日誌級別,不過這樣會打出大量的日誌,會影響應用性能。在Logback,你可以繼續保持那個日誌級別而除掉某種特殊情況,如alice 這個用戶登錄,她的日誌將打在DEBUG 級別而其他用戶可以繼續打在WARN 級別。要實現這個功能只需加4行XML配置。可以參考MDCFIlter 。
10、SiftingAppender(一個非常多功能的Appender) 它可以用來分割日誌文件根據任何一個給定的運行參數。如,SiftingAppender 能夠區別日誌事件跟進用戶的Session,然後每個用戶會有一個日誌文件。
11、自動壓縮已經打出來的log,RollingFileAppender 在產生新文件的時候,會自動壓縮已經打出來的日誌文件。壓縮是個異步過程,所以甚至對於大的日誌文件,在壓縮過程中應用不會受任何影響。
12、堆棧樹帶有包版本,Logback在打出堆棧樹日誌時,會帶上包的數據。
13、自動去除舊的日誌文件,通過設置TimeBasedRollingPolicy 或者SizeAndTimeBasedFNATP 的maxHistory 屬性,你可以控制已經產生日誌文件的最大數量。如果設置maxHistory 12,那那些log 文件超過12個月的都會被自動移除。
總之,logback 比log4j 太優秀了,讓我們的應用全部建立logback 上吧!
3. 引入logback 到項目中
添加包依賴,Maven style:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </dependency> <dependency> <groupId>net.logstash.logback</groupId> <artifactId>logstash-logback-encoder</artifactId> <version>4.11</version> </dependency> <dependency> <groupId>net.logstash.log4j</groupId> <artifactId>jsonevent-layout</artifactId> <version>1.7</version> </dependency>
4. 添加logback.xml
添加logback.xml 文件到src/main/resources 目錄下,系統會自動加載讀取logback.xml 配置。
logback.xml:
<?xml version="1.0" encoding="UTF-8"?><configuration scan="true" scanPeriod="60 seconds" debug="false"> <include resource="org/springframework/boot/logging/logback/base.xml" /> <contextName>logback</contextName> <!-- 記錄文件到特定目錄--> <!-- <property name="log.path" value="E://test//logback.log" /> --> <property name="log.path" value="/Users/chang/Desktop/CHLogs/logback.log" /><appender name="stash"> <destination>192.168.220.83:9601</destination> <encoder /></appender><!--輸出到控制台--><appender name="console"> <!-- <filter> <level>ERROR</level> </filter>--> <encoder> <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder></appender><!--輸出到文件--><appender name="file"> <file>${log.path}</file> <rollingPolicy> <fileNamePattern>logback.%d{yyyy-MM-dd}.log</fileNamePattern> </rollingPolicy> <encoder> <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder></appender><root level="info"> <appender-ref ref="stash"/> <appender-ref ref="console" /> <appender-ref ref="file" /></root><!-- logback為java 中的包<logger name="com.dudu.controller"/>logback.LogbackDemo:類的全路徑<logger name="com.dudu.controller.LearnController" level="WARN" additivity="false"> <appender-ref ref="console"/></logger> --></configuration>5. logstash-logback-encoder 版本問題
在spring-boot 中,如果使用logstash-logback-encoder ,可能需要告訴maven 具體的版本號以此避免包依賴衝突。例如可以像下面這樣設置logback-core, logback-classic, and logback-access 的dependencies:
<properties> <ch.qos.logback.version>1.2.3</ch.qos.logback.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>${ch.qos.logback.version}</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>${ch.qos.logback.version}</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-access</artifactId> <version>${ch.qos.logback.version}</version> </dependency> </dependencies> </dependencyManagement>6. logstash 服務搭建
參考:
1.logstash-logback-encoder
總結
以上所述是小編給大家介紹的Spring Boot 使用logback、logstash、ELK 記錄日誌文件的方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!