Java util Logger的使用步驟

Java util Logger是java原生的日志生成工具,不需要另外引用類庫(kù),使用方便,學(xué)習(xí)簡(jiǎn)單,能夠在小型應(yīng)用中靈活使用。下面從實(shí)際應(yīng)用角度,對(duì)Logger的使用步驟作出總結(jié),以實(shí)現(xiàn)快速掌握。

Logger的使用一般包括以下幾個(gè)步驟:

一、 定義全局的Logger,在不同的類中共用

關(guān)鍵語(yǔ)句

 Logger myLogger = Logger.getLogger("com.mycompany.myapp");

方法參數(shù)是Logger的名稱,當(dāng)名稱相同時(shí)候,同一個(gè)名稱的Logger只創(chuàng)建一個(gè),實(shí)現(xiàn)各個(gè)類中共享。

二、 設(shè)定輸出媒介控制器(Handler)

共有四步:

  1. 一般日志輸出包括調(diào)試時(shí)輸出到控制臺(tái),以及程序運(yùn)行時(shí)輸出到文件,因此Handler包括了控制臺(tái)ConsoleHandler以及文件FileHandler。
  2. Handler輸出的日志格式為默認(rèn)格式,系統(tǒng)提供的格式包括SimpleFormatter、XMLFormatter等,輸出的內(nèi)容一般比較冗余,不滿足使用,最好使用自定義內(nèi)容輸出格式,可使用派生自Formatter類的自定義子類。
  3. 設(shè)定Handler的輸出等級(jí),默認(rèn)是info級(jí)。
  4. Handler加入到Logger中。

關(guān)鍵語(yǔ)句

  //創(chuàng)建consoleHandler 自定義類實(shí)例,用于在控制臺(tái)發(fā)送日志
  ConsoleHandler consoleHandler = new ConsoleHandler();
  //設(shè)置consoleHandler實(shí)例輸出格式
  consoleHandler.setFormatter(new ConsoleLogFormatter());
  //加入到Logger中
  myLogger.addHandler(consoleHandler);
  //不顯示系統(tǒng)自帶的consoleHandler,否則控制臺(tái)將發(fā)出兩條同樣的日志
  myLogger.setUseParentHandlers(false);
    
  //在工程目錄下創(chuàng)建log文件夾
  File dir = new File("log");
  if(!dir.exists() || !dir.isDirectory())
  dir.mkdir();

  //創(chuàng)建fileHandler 自定義類實(shí)例,用于在文件保存日志  
  FileHandler fileHandler = new         
  FileHandler("log\\myapp.%u.%g.txt",1000,2,true);
  fileHandler.setFormatter(new FileLogFormatter());
  fileHandler.setLevel(Level.INFO);
  myLogger.addHandler(fileHandler);

說(shuō)明 :

  • 創(chuàng)建日志文件前,若沒(méi)有文件夾,log將會(huì)報(bào)錯(cuò),因此在寫入日志文件前,檢查文件夾是否存在,不存在則創(chuàng)建文件夾。
  • FileHandler fileHandler = new FileHandler("log\myapp.%u.%g.txt",1000,2,true);
    語(yǔ)句意義為:新建FileHandler,地址為工程文件路徑下;log\myapp.%u.%g.txt,循環(huán)文件編號(hào)為%u.%g,文件最大1000字節(jié),2個(gè)文件循環(huán),是否追加文件為“是”,否則總為新建文件。
  • myLogger.setUseParentHandlers(false);
    語(yǔ)句意義為:系統(tǒng)自帶的consoleHandler設(shè)置為不生效,僅生效增加的自定義consoleHandler,否則控制臺(tái)將發(fā)出兩條同樣的日志。

三、 Logger設(shè)置輸出等級(jí),并輸出日志

關(guān)鍵語(yǔ)句

    myLogger.setLevel(Level.INFO);
    myLogger.info("一般信息1 ");
    myLogger.info("一般信息2 ");

完整的程序代碼為:

public class LogProduce {

    public static void main(String[] args) throws IOException {

        Logger myLogger = Logger.getLogger("com.mycompany.myapp");

        ConsoleHandler consoleHandler = new ConsoleHandler();
        consoleHandler.setFormatter(new ConsoleLogFormatter());
        myLogger.addHandler(consoleHandler);
        myLogger.setUseParentHandlers(false);

        File dir = new File("log");
        if(!dir.exists() || !dir.isDirectory())
            dir.mkdir();

        FileHandler fileHandler = new FileHandler("log\\myapp.%u.%g.txt",1000,2,true);
        fileHandler.setFormatter(new FileLogFormatter());
        fileHandler.setLevel(Level.INFO);
        myLogger.addHandler(fileHandler);

        myLogger.setLevel(Level.INFO);
        myLogger.info("一般信息1 ");
        myLogger.info("一般信息2 ");

        LogUser logUser1 = new LogUser();
        logUser1.produceLog();
    }
}

實(shí)際輸出為;
Console輸出:


未命名圖片.jpg

文件輸出:


image.png

四、補(bǔ)充說(shuō)明

  1. ConsoleLogFormatterFileLogFormatter 兩個(gè)派生的 Formatter 子類
public class FileLogFormatter extends Formatter {

    public FileLogFormatter(){
        super();
    }

    @Override
    public String format(LogRecord r) {
        Date date = new Date();
        String sDate = date.toString();
        String lineSperator = System.getProperty("line.separator");

        StringBuilder sb = new StringBuilder();
        sb.append("[" + sDate + "]" + "[" + r.getLevel() +"]");
        sb.append(r.getMessage());
        //在一條日志結(jié)束后采用常量方式的系統(tǒng)換行符,因?yàn)?“\n” 形式可能不識(shí)別 
        sb.append(lineSperator);

        return sb.toString();
    }
}

該子類重寫了format方法,用于用戶自定義輸出,使用StringBuilder類拼裝。
關(guān)鍵語(yǔ)句

String lineSperator = System.getProperty("line.separator");

若直接在格式字符串中插入傳統(tǒng)換行符“\n",在輸出文件中可能不能識(shí)別,因此采用系統(tǒng)定義的換行符 line.separator。
類似的,ConsoleLogFormatter代碼為:

public class ConsoleLogFormatter extends Formatter {

    public ConsoleLogFormatter(){
        super();
    }

    @Override
    public String format(LogRecord r) {

        String lineSperator = System.getProperty("line.separator");

        StringBuilder sb = new StringBuilder();
        sb.append(r.getMessage());
        sb.append(lineSperator);

        return sb.toString();

    }
}
  1. 子類中調(diào)用Logger
    在子類中調(diào)用getLogger即可。
public class LogUser {

    Logger myLogger = Logger.getLogger("com.mycompany.myapp");

    public void produceLog(){

        myLogger.info("LogUser.produceLog");
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容