最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java日志打印的完全使用指南

 更新時(shí)間:2022年01月19日 09:31:20   作者:豐極  
日志就是記錄程序的運(yùn)行軌跡,方便查找關(guān)鍵信息,也方便快速定位解決問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于java日志打印使用的相關(guān)資料,需要的朋友可以參考下

一、簡(jiǎn)介

  • 日志打印是java代碼開(kāi)發(fā)中不可缺少的重要一步。
  • 日志可以排查問(wèn)題,可以搜集數(shù)據(jù)

二、常用日志框架

比較常用的日志框架就是logback, 一些老項(xiàng)目會(huì)使用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);

三、日志級(jí)別

TRACE < DEBUG < INFO < WARN < ERROR

日常使用較多的是error, info , debug

四、logback簡(jiǎn)單介紹

簡(jiǎn)單介紹下常用的logback,logback優(yōu)點(diǎn):

  • 比log4j更快
  • 和log4j使用了同一個(gè)接口,slf4j-api,可以非常方便切換
  • 定義了功能非常豐富的appender
  • 支持日志壓縮

logback要正確理解xml配置文件

  • configuration:總的父節(jié)點(diǎn)
  • property:自定義屬性
  • appender:輸出控制器,可以輸出到控制臺(tái),自定義文件等
  • logger:日志級(jí)別
  • root:控制器級(jí)別

一個(gè)例子:

<?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"/>

    <!--輸出到控制臺(tái)-->
    <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
        <!--此日志appender是為開(kāi)發(fā)使用,只配置最底級(jí)別,控制臺(tái)輸出的日志級(jí)別是大于或等于此級(jí)別的日志信息-->
        <!--LevelFilter: 級(jí)別過(guò)濾器,根據(jù)日志級(jí)別進(jìn)行過(guò)濾。如果日志級(jí)別等于配置級(jí)別,過(guò)濾器會(huì)根據(jù)onMath 和 onMismatch接收或拒絕日志。-->
        <!--例如:將過(guò)濾器的日志級(jí)別配置為INFO,所有INFO級(jí)別的日志交給appender處理,非INFO級(jí)別的日志,被過(guò)濾掉。-->
        <!--<filter class="ch.qos.logback.classic.filter.LevelFilter">-->
        <!--<level>INFO</level>-->
        <!--<onMatch>ACCEPT</onMatch>-->
        <!--<onMismatch>DENY</onMismatch>-->
        <!--</filter>-->

        <!--ThresholdFilter: 臨界值過(guò)濾器,過(guò)濾掉低于指定臨界值的日志。當(dāng)日志級(jí)別等于或高于臨界值時(shí),過(guò)濾器返回NEUTRAL;當(dāng)日志級(jí)別低于臨界值時(shí),日志會(huì)被拒絕。-->
        <!-- 過(guò)濾掉所有低于 DEBUG 級(jí)別的日志,留下DEBUG及以上級(jí)別的日志 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>DEBUG</level>
        </filter>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
    </appender>

    <!-- 時(shí)間滾動(dòng)輸出 level為 INFO 日志 -->
    <appender name="errorFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--LevelFilter: 級(jí)別過(guò)濾器,根據(jù)日志級(jí)別進(jìn)行過(guò)濾。如果日志級(jí)別等于配置級(jí)別,過(guò)濾器會(huì)根據(jù)onMath 和 onMismatch接收或拒絕日志。-->
        <!--例如:將過(guò)濾器的日志級(jí)別配置為INFO,所有INFO級(jí)別的日志交給appender處理,非INFO級(jí)別的日志,被過(guò)濾掉。-->
        <!--<filter class="ch.qos.logback.classic.filter.LevelFilter">-->
        <!--<level>INFO</level>-->
        <!--<onMatch>ACCEPT</onMatch>-->
        <!--<onMismatch>DENY</onMismatch>-->
        <!--</filter>-->

        <!--ThresholdFilter: 臨界值過(guò)濾器,過(guò)濾掉低于指定臨界值的日志。當(dāng)日志級(jí)別等于或高于臨界值時(shí),過(guò)濾器返回NEUTRAL;當(dāng)日志級(jí)別低于臨界值時(shí),日志會(huì)被拒絕。-->
        <!-- 過(guò)濾掉所有低于 DEBUG 級(jí)別的日志,留下DEBUG及以上級(jí)別的日志 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>

        <!-- 正在記錄的日志文件的路徑及文件名 -->
        <file>${log.path}/error.log</file>

        <!-- 日志記錄器的滾動(dòng)策略,按日期,按大小記錄 -->
        <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時(shí)會(huì)被壓縮和切割 -->
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
    </appender>

    <!-- 時(shí)間滾動(dòng)輸出 level為 INFO 日志 -->
    <appender name="infoFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--LevelFilter: 級(jí)別過(guò)濾器,根據(jù)日志級(jí)別進(jìn)行過(guò)濾。如果日志級(jí)別等于配置級(jí)別,過(guò)濾器會(huì)根據(jù)onMath 和 onMismatch接收或拒絕日志。-->
        <!--例如:將過(guò)濾器的日志級(jí)別配置為INFO,所有INFO級(jí)別的日志交給appender處理,非INFO級(jí)別的日志,被過(guò)濾掉。-->
        <!--<filter class="ch.qos.logback.classic.filter.LevelFilter">-->
        <!--<level>INFO</level>-->
        <!--<onMatch>ACCEPT</onMatch>-->
        <!--<onMismatch>DENY</onMismatch>-->
        <!--</filter>-->

        <!--ThresholdFilter: 臨界值過(guò)濾器,過(guò)濾掉低于指定臨界值的日志。當(dāng)日志級(jí)別等于或高于臨界值時(shí),過(guò)濾器返回NEUTRAL;當(dāng)日志級(jí)別低于臨界值時(shí),日志會(huì)被拒絕。-->
        <!-- 過(guò)濾掉所有低于 DEBUG 級(jí)別的日志,留下DEBUG及以上級(jí)別的日志 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>

        <!-- 正在記錄的日志文件的路徑及文件名 -->
        <file>${log.path}/info.log</file>

        <!-- 日志記錄器的滾動(dòng)策略,按日期,按大小記錄 -->
        <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時(shí)會(huì)被壓縮和切割 -->
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
    </appender>

    <!-- 時(shí)間滾動(dòng)輸出 level為 INFO 日志 -->
    <appender name="debugFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--LevelFilter: 級(jí)別過(guò)濾器,根據(jù)日志級(jí)別進(jìn)行過(guò)濾。如果日志級(jí)別等于配置級(jí)別,過(guò)濾器會(huì)根據(jù)onMath 和 onMismatch接收或拒絕日志。-->
        <!--例如:將過(guò)濾器的日志級(jí)別配置為INFO,所有INFO級(jí)別的日志交給appender處理,非INFO級(jí)別的日志,被過(guò)濾掉。-->
        <!--<filter class="ch.qos.logback.classic.filter.LevelFilter">-->
        <!--<level>INFO</level>-->
        <!--<onMatch>ACCEPT</onMatch>-->
        <!--<onMismatch>DENY</onMismatch>-->
        <!--</filter>-->

        <!--ThresholdFilter: 臨界值過(guò)濾器,過(guò)濾掉低于指定臨界值的日志。當(dāng)日志級(jí)別等于或高于臨界值時(shí),過(guò)濾器返回NEUTRAL;當(dāng)日志級(jí)別低于臨界值時(shí),日志會(huì)被拒絕。-->
        <!-- 過(guò)濾掉所有低于 DEBUG 級(jí)別的日志,留下DEBUG及以上級(jí)別的日志 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>DEBUG</level>
        </filter>

        <!-- 正在記錄的日志文件的路徑及文件名 -->
        <file>${log.path}/debug.log</file>

        <!-- 日志記錄器的滾動(dòng)策略,按日期,按大小記錄 -->
        <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時(shí)會(huì)被壓縮和切割 -->
                <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>

五、常見(jiàn)問(wèn)題

  • 1、日志打的少,不好排查問(wèn)題?

我們經(jīng)常會(huì)遇到一個(gè)生產(chǎn)問(wèn)題,去看日志,啥都沒(méi)有,只能重新加日志,發(fā)包,再排查問(wèn)題;
所以我們要養(yǎng)成打日志的習(xí)慣,開(kāi)發(fā)環(huán)境可以debug看,生產(chǎn)看不了,只能加日志,在開(kāi)發(fā)的時(shí)候就把必要的日志加上;
比較重要的是接口的入?yún)?,返回,重要?jié)點(diǎn)開(kāi)始,結(jié)束,mq發(fā)送接收等。

  • 2、error, info , debug分別都什么時(shí)候使用?

error: 捕獲異常的時(shí)候使用,這個(gè)沒(méi)有異議
info: 比較重要的信息,使用頻次不是非常高的場(chǎng)景,比如入?yún)⒊鰠?br />debug: 一個(gè)是不是特別重要的信息,但是又不能少,還有數(shù)據(jù)量大的數(shù)據(jù),比如大量mq信息,訪問(wèn)頻繁的接口入?yún)⒊鰠?/p>

  • 3、開(kāi)啟debug好多無(wú)用的debug信息怎么辦?

把項(xiàng)目的目錄定為debug,其它定成info。這樣只有本項(xiàng)目的debug日志會(huì)打印了
logging.level.root=info
logging.level.cn.mypackage=debug

  • 4、需要自定義日志文件嗎?

logback可以把日志寫(xiě)進(jìn)自定義文件,debug,info,error分開(kāi)存儲(chǔ),歷史數(shù)據(jù)還能壓縮;
按自己項(xiàng)目的需求來(lái),大型項(xiàng)目建議分開(kāi)存儲(chǔ)。

  • 5、springboot啟動(dòng)命令自帶的日志和自定義日志文件的日志重復(fù)怎么辦?

我們一般啟動(dòng)springboot項(xiàng)目命令為:nohup java -jar XXXXXXXX.jar >> XXXXXXX.log 2>&1 &
這個(gè)會(huì)生成一個(gè)日志文件,logback配置也會(huì)生成自己的日志文件,就會(huì)重復(fù),造成空間浪費(fèi),如何取舍?

如果你們公司統(tǒng)一打包腳本的話,就用命令生成的日志文件吧,把logback配置去掉;
如果你們公司自由度比較高,就用logback生成的日志,把命令改成  >/dev/null 就可以了

  • 6、debug日志正確寫(xiě)法?
有些人可能打debug日志直接logger.debug("****");
如果項(xiàng)目的日志級(jí)別比較高,就比較浪費(fèi)性能,可以加一個(gè)
if (log.isDebugEnabled()) {
    log.debug("XXXXXXXXXXXXX");
}
  • 7、動(dòng)態(tài)日志級(jí)別?
有些公司支持動(dòng)態(tài)配置文件,比如diamond,nacos等,可以修改配置文件的級(jí)別,動(dòng)態(tài)生效
logging.level.root=info
#logging.level.root=debug

日常開(kāi)在info,出了問(wèn)題開(kāi)debug找,資源有限可以這樣做,不推薦生產(chǎn)使用

總結(jié) 

到此這篇關(guān)于java日志打印的文章就介紹到這了,更多相關(guān)java日志打印內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解決springboot運(yùn)行出現(xiàn)錯(cuò)誤:找不到或無(wú)法加載主類(lèi)com.xxxx.xxxx.Application問(wèn)題

    解決springboot運(yùn)行出現(xiàn)錯(cuò)誤:找不到或無(wú)法加載主類(lèi)com.xxxx.xxxx.Application問(wèn)題

    文章介紹了在服務(wù)器上運(yùn)行一個(gè)未使用的Java項(xiàng)目時(shí)遇到的“找不到或無(wú)法加載主類(lèi)”錯(cuò)誤,并提供了兩種解決方法:通過(guò)Maven install或build …、Goals輸入install并跳過(guò)測(cè)試來(lái)重新構(gòu)建項(xiàng)目
    2024-11-11
  • Mybatis-plus 查詢(xún)條件為空不生效問(wèn)題及解決

    Mybatis-plus 查詢(xún)條件為空不生效問(wèn)題及解決

    這篇文章主要介紹了Mybatis-plus 查詢(xún)條件為空不生效問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Mybatis實(shí)現(xiàn)分頁(yè)的注意點(diǎn)

    Mybatis實(shí)現(xiàn)分頁(yè)的注意點(diǎn)

    Mybatis提供了強(qiáng)大的分頁(yè)攔截實(shí)現(xiàn),可以完美的實(shí)現(xiàn)分功能。下面小編給大家分享小編在使用攔截器給mybatis進(jìn)行分頁(yè)所遇到的問(wèn)題及注意點(diǎn),需要的朋友一起看看吧
    2017-07-07
  • Java之Scanner.nextLine()讀取回車(chē)的問(wèn)題及解決

    Java之Scanner.nextLine()讀取回車(chē)的問(wèn)題及解決

    這篇文章主要介紹了Java之Scanner.nextLine()讀取回車(chē)的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • 如何重寫(xiě)hashcode和equals方法

    如何重寫(xiě)hashcode和equals方法

    這篇文章主要介紹了如何重寫(xiě)hashcode和equals方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • idea springboot遠(yuǎn)程debug的操作方法

    idea springboot遠(yuǎn)程debug的操作方法

    這篇文章主要介紹了idea springboot遠(yuǎn)程debug的操作方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • java設(shè)計(jì)模式之實(shí)現(xiàn)對(duì)象池模式示例分享

    java設(shè)計(jì)模式之實(shí)現(xiàn)對(duì)象池模式示例分享

    對(duì)象池模式經(jīng)常用在頻繁創(chuàng)建、銷(xiāo)毀對(duì)象(并且對(duì)象創(chuàng)建、銷(xiāo)毀開(kāi)銷(xiāo)很大)的場(chǎng)景,比如數(shù)據(jù)庫(kù)連接池、線程池、任務(wù)隊(duì)列池等。本代碼簡(jiǎn)單,沒(méi)有限制對(duì)象池大小
    2014-02-02
  • Myeclipse清理項(xiàng)目緩存的幾大方法

    Myeclipse清理項(xiàng)目緩存的幾大方法

    今天小編就為大家分享一篇關(guān)于Myeclipse清理項(xiàng)目緩存的幾大方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • java 讀取本地文件實(shí)例詳解

    java 讀取本地文件實(shí)例詳解

    這篇文章主要介紹了java 讀取本地文件實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • MyBatis+Calcite實(shí)現(xiàn)多數(shù)據(jù)庫(kù)SQL自動(dòng)適配的詳細(xì)指南

    MyBatis+Calcite實(shí)現(xiàn)多數(shù)據(jù)庫(kù)SQL自動(dòng)適配的詳細(xì)指南

    在當(dāng)今企業(yè)IT環(huán)境中,數(shù)據(jù)庫(kù)異構(gòu)性已成為常態(tài),根據(jù)DB-Engines最新調(diào)研,超過(guò)78%的企業(yè)同時(shí)使用兩種以上數(shù)據(jù)庫(kù)系統(tǒng),所以本文就來(lái)為大家介紹一下如何基于MyBatis+Calcite實(shí)現(xiàn)多數(shù)據(jù)庫(kù)SQL自動(dòng)適配吧
    2025-04-04

最新評(píng)論

且末县| 东台市| 翁源县| 台前县| 安达市| 宁南县| 澜沧| 龙川县| 游戏| 郯城县| 扶绥县| 青川县| 祁阳县| 本溪| 乐业县| 长宁县| 项城市| 龙山县| 乐都县| 德钦县| 余姚市| 桐庐县| 安阳县| 蒲城县| 会东县| 汾西县| 砚山县| 乌拉特前旗| 泗洪县| 呈贡县| 宜昌市| 交口县| 红原县| 九寨沟县| 柳州市| 绥阳县| 大宁县| 怀化市| 习水县| 象州县| 京山县|