您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“java日志打印怎么使用”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
日志打印是java代碼開發(fā)中不可缺少的重要一步。
日志可以排查問題,可以搜集數(shù)據(jù)
比較常用的日志框架就是logback, 一些老項目會使用log4j,他們用的都是slf4j-api統(tǒng)一接口。
(1) 使用log4j
log4j使用: 1. slf4j-api-1.5.11.jar 2. slf4j-log4j12-1.5.11.jar 3. log4j-1.2.15.jar 4. log4j.properties
代碼中
import org.slf4j.Logger; import org.slf4j.LoggerFactory; Logger logger = LoggerFactory.getLogger(xx.class);
(2) 使用logback
logback使用: 1. slf4j-api-1.5.11.jar 2. logback-core.jar 3. logback-classic.jar 4. logback.xml
代碼同log4j
import org.slf4j.Logger; import org.slf4j.LoggerFactory; Logger logger = LoggerFactory.getLogger(xx.class);
TRACE < DEBUG < INFO < WARN < ERROR
日常使用較多的是error, info , debug
簡單介紹下常用的logback,logback優(yōu)點:
比log4j更快
和log4j使用了同一個接口,slf4j-api,可以非常方便切換
定義了功能非常豐富的appender
支持日志壓縮
logback要正確理解xml配置文件
configuration:總的父節(jié)點
property:自定義屬性
appender:輸出控制器,可以輸出到控制臺,自定義文件等
logger:日志級別
root:控制器級別
一個例子:
<?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="60 seconds"> <contextName>XXXXXXXX</contextName> <property name="log.path" value="./log/"/> <!-- 日志最大的歷史 30天 --> <property name="maxHistory" value="30"/> <property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId}] [%-5level] [%logger{30}:%line] %msg%n"/> <!--輸出到控制臺--> <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender"> <!--此日志appender是為開發(fā)使用,只配置最底級別,控制臺輸出的日志級別是大于或等于此級別的日志信息--> <!--LevelFilter: 級別過濾器,根據(jù)日志級別進行過濾。如果日志級別等于配置級別,過濾器會根據(jù)onMath 和 onMismatch接收或拒絕日志。--> <!--例如:將過濾器的日志級別配置為INFO,所有INFO級別的日志交給appender處理,非INFO級別的日志,被過濾掉。--> <!--<filter class="ch.qos.logback.classic.filter.LevelFilter">--> <!--<level>INFO</level>--> <!--<onMatch>ACCEPT</onMatch>--> <!--<onMismatch>DENY</onMismatch>--> <!--</filter>--> <!--ThresholdFilter: 臨界值過濾器,過濾掉低于指定臨界值的日志。當(dāng)日志級別等于或高于臨界值時,過濾器返回NEUTRAL;當(dāng)日志級別低于臨界值時,日志會被拒絕。--> <!-- 過濾掉所有低于 DEBUG 級別的日志,留下DEBUG及以上級別的日志 --> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>DEBUG</level> </filter> <encoder> <pattern>${log.pattern}</pattern> </encoder> </appender> <!-- 時間滾動輸出 level為 INFO 日志 --> <appender name="errorFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!--LevelFilter: 級別過濾器,根據(jù)日志級別進行過濾。如果日志級別等于配置級別,過濾器會根據(jù)onMath 和 onMismatch接收或拒絕日志。--> <!--例如:將過濾器的日志級別配置為INFO,所有INFO級別的日志交給appender處理,非INFO級別的日志,被過濾掉。--> <!--<filter class="ch.qos.logback.classic.filter.LevelFilter">--> <!--<level>INFO</level>--> <!--<onMatch>ACCEPT</onMatch>--> <!--<onMismatch>DENY</onMismatch>--> <!--</filter>--> <!--ThresholdFilter: 臨界值過濾器,過濾掉低于指定臨界值的日志。當(dāng)日志級別等于或高于臨界值時,過濾器返回NEUTRAL;當(dāng)日志級別低于臨界值時,日志會被拒絕。--> <!-- 過濾掉所有低于 DEBUG 級別的日志,留下DEBUG及以上級別的日志 --> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>ERROR</level> </filter> <!-- 正在記錄的日志文件的路徑及文件名 --> <file>${log.path}/error.log</file> <!-- 日志記錄器的滾動策略,按日期,按大小記錄 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 每天日志歸檔路徑以及格式 --> <fileNamePattern>${log.path}/error-%d{yyyyMMdd}.%i.log.zip</fileNamePattern> <!--日志文件保留天數(shù)--> <maxHistory>${maxHistory}</maxHistory> <!-- 日志總保存量為2GB --> <totalSizeCap>2GB</totalSizeCap> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <!--文件達(dá)到 最大100MB時會被壓縮和切割 --> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <encoder> <pattern>${log.pattern}</pattern> </encoder> </appender> <!-- 時間滾動輸出 level為 INFO 日志 --> <appender name="infoFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!--LevelFilter: 級別過濾器,根據(jù)日志級別進行過濾。如果日志級別等于配置級別,過濾器會根據(jù)onMath 和 onMismatch接收或拒絕日志。--> <!--例如:將過濾器的日志級別配置為INFO,所有INFO級別的日志交給appender處理,非INFO級別的日志,被過濾掉。--> <!--<filter class="ch.qos.logback.classic.filter.LevelFilter">--> <!--<level>INFO</level>--> <!--<onMatch>ACCEPT</onMatch>--> <!--<onMismatch>DENY</onMismatch>--> <!--</filter>--> <!--ThresholdFilter: 臨界值過濾器,過濾掉低于指定臨界值的日志。當(dāng)日志級別等于或高于臨界值時,過濾器返回NEUTRAL;當(dāng)日志級別低于臨界值時,日志會被拒絕。--> <!-- 過濾掉所有低于 DEBUG 級別的日志,留下DEBUG及以上級別的日志 --> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level> </filter> <!-- 正在記錄的日志文件的路徑及文件名 --> <file>${log.path}/info.log</file> <!-- 日志記錄器的滾動策略,按日期,按大小記錄 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 每天日志歸檔路徑以及格式 --> <fileNamePattern>${log.path}/info-%d{yyyyMMdd}.%i.log.zip</fileNamePattern> <!--日志文件保留天數(shù)--> <maxHistory>${maxHistory}</maxHistory> <!-- 日志總保存量為10GB --> <totalSizeCap>2GB</totalSizeCap> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <!--文件達(dá)到 最大100MB時會被壓縮和切割 --> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <encoder> <pattern>${log.pattern}</pattern> </encoder> </appender> <!-- 時間滾動輸出 level為 INFO 日志 --> <appender name="debugFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!--LevelFilter: 級別過濾器,根據(jù)日志級別進行過濾。如果日志級別等于配置級別,過濾器會根據(jù)onMath 和 onMismatch接收或拒絕日志。--> <!--例如:將過濾器的日志級別配置為INFO,所有INFO級別的日志交給appender處理,非INFO級別的日志,被過濾掉。--> <!--<filter class="ch.qos.logback.classic.filter.LevelFilter">--> <!--<level>INFO</level>--> <!--<onMatch>ACCEPT</onMatch>--> <!--<onMismatch>DENY</onMismatch>--> <!--</filter>--> <!--ThresholdFilter: 臨界值過濾器,過濾掉低于指定臨界值的日志。當(dāng)日志級別等于或高于臨界值時,過濾器返回NEUTRAL;當(dāng)日志級別低于臨界值時,日志會被拒絕。--> <!-- 過濾掉所有低于 DEBUG 級別的日志,留下DEBUG及以上級別的日志 --> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>DEBUG</level> </filter> <!-- 正在記錄的日志文件的路徑及文件名 --> <file>${log.path}/debug.log</file> <!-- 日志記錄器的滾動策略,按日期,按大小記錄 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 每天日志歸檔路徑以及格式 --> <fileNamePattern>${log.path}/debug-%d{yyyyMMdd}.%i.log.zip</fileNamePattern> <!--日志文件保留天數(shù)--> <maxHistory>${maxHistory}</maxHistory> <!-- 日志總保存量為2GB --> <totalSizeCap>2GB</totalSizeCap> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <!--文件達(dá)到 最大100MB時會被壓縮和切割 --> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <encoder> <pattern>${log.pattern}</pattern> </encoder> </appender> <logger name="com.baomidou" level="debug"/> <root level="info"> <appender-ref ref="consoleAppender"/> <appender-ref ref="errorFileAppender"/> <appender-ref ref="infoFileAppender"/> <appender-ref ref="debugFileAppender"/> </root> </configuration>
1、日志打的少,不好排查問題?
我們經(jīng)常會遇到一個生產(chǎn)問題,去看日志,啥都沒有,只能重新加日志,發(fā)包,再排查問題;
所以我們要養(yǎng)成打日志的習(xí)慣,開發(fā)環(huán)境可以debug看,生產(chǎn)看不了,只能加日志,在開發(fā)的時候就把必要的日志加上;
比較重要的是接口的入?yún)?,返回,重要?jié)點開始,結(jié)束,mq發(fā)送接收等。
2、error, info , debug分別都什么時候使用?
error: 捕獲異常的時候使用,這個沒有異議
info: 比較重要的信息,使用頻次不是非常高的場景,比如入?yún)⒊鰠?br/>debug: 一個是不是特別重要的信息,但是又不能少,還有數(shù)據(jù)量大的數(shù)據(jù),比如大量mq信息,訪問頻繁的接口入?yún)⒊鰠?/p>
3、開啟debug好多無用的debug信息怎么辦?
把項目的目錄定為debug,其它定成info。這樣只有本項目的debug日志會打印了
logging.level.root=info
logging.level.cn.mypackage=debug
4、需要自定義日志文件嗎?
logback可以把日志寫進自定義文件,debug,info,error分開存儲,歷史數(shù)據(jù)還能壓縮;
按自己項目的需求來,大型項目建議分開存儲。
5、springboot啟動命令自帶的日志和自定義日志文件的日志重復(fù)怎么辦?
我們一般啟動springboot項目命令為:nohup java -jar XXXXXXXX.jar >> XXXXXXX.log 2>&1 &
這個會生成一個日志文件,logback配置也會生成自己的日志文件,就會重復(fù),造成空間浪費,如何取舍?如果你們公司統(tǒng)一打包腳本的話,就用命令生成的日志文件吧,把logback配置去掉;
如果你們公司自由度比較高,就用logback生成的日志,把命令改成 >/dev/null 就可以了
6、debug日志正確寫法?
有些人可能打debug日志直接logger.debug("****"); 如果項目的日志級別比較高,就比較浪費性能,可以加一個 if (log.isDebugEnabled()) { log.debug("XXXXXXXXXXXXX"); }
7、動態(tài)日志級別?
有些公司支持動態(tài)配置文件,比如diamond,nacos等,可以修改配置文件的級別,動態(tài)生效 logging.level.root=info #logging.level.root=debug 日常開在info,出了問題開debug找,資源有限可以這樣做,不推薦生產(chǎn)使用
“java日志打印怎么使用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。