1. 程式人生 > >Java Logger使用

Java Logger使用

在Java中實現日誌記錄的方式有很多種,其中最簡單的方式,就是System.out.print,System.err.print 這樣直接在控制檯列印訊息了。

接下來我們介紹的:java.util.logging.Logger是在JDK 1.4 版本之後加入的,提供了日誌記錄的API ,可以往控制檯/檔案中寫日誌了。

我們可以使用全域性日誌記錄器來生成簡單的日誌記錄
Logger.getGlobal().info("log test");  
輸出: 查詢或建立一個 logger:
public static Logger getLogger(String name) 
name是Logger的名稱,當我們以此名稱建立過則返回原來建立的那一個,否則建立新的。
所以
Logger logger1 = Logger.getLogger("com.xiya.test.LogDemo"
); Logger logger2 = Logger.getLogger("com.xiya.test.LogDemo"); System.out.println(logger1 == logger2);

返回true。

Logger的級別:

SEVERE 嚴重
WARNING 警告
INFO 資訊
CONFIG 配置
FINE 良好
FINER 較好
FINEST 最好
ALL 開啟所有級別日誌記錄
OFF 關閉所有級別日誌記錄
logger預設的級別是INFO,比INFO更低的日誌將不顯示。

Logger的預設級別定義是在jre安裝目錄的lib下面的logging.properties。

java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

Logger logger = Logger.getLogger("com.xiya.test.LogDemo");
logger.setLevel(Level.ALL);
ConsoleHandler consoleHandler = new ConsoleHandler();
consoleHandler.setLevel(Level.FINEST
); logger.addHandler(consoleHandler); logger.severe("嚴重"); logger.warning("警告"); logger.info("資訊"); logger.config("配置"); logger.fine("良好"); logger.finer("較好"); logger.finest("最好");
四月 24, 2017 4:53:16 下午 com.xiya.test.LogDemo main
嚴重: 嚴重
四月 24, 2017 4:53:16 下午 com.xiya.test.LogDemo main
嚴重: 嚴重
四月 24, 2017 4:53:16 下午 com.xiya.test.LogDemo main
警告: 警告
四月 24, 2017 4:53:16 下午 com.xiya.test.LogDemo main
警告: 警告
四月 24, 2017 4:53:16 下午 com.xiya.test.LogDemo main
資訊: 資訊
四月 24, 2017 4:53:16 下午 com.xiya.test.LogDemo main
資訊: 資訊
四月 24, 2017 4:53:16 下午 com.xiya.test.LogDemo main
配置: 配置
四月 24, 2017 4:53:16 下午 com.xiya.test.LogDemo main
詳細: 良好
四月 24, 2017 4:53:16 下午 com.xiya.test.LogDemo main
較詳細: 較好
四月 24, 2017 4:53:16 下午 com.xiya.test.LogDemo main
非常詳細: 最好
如上設定,我們可以顯示所有級別的日誌記錄。我們看到嚴重、警告、資訊都顯示兩次,這是由於logging.properties的原因。

簡單的說:該檔案定義了Logger預設的輸出媒介控制器(Handler):java.util.logging.ConsolerHandler,也就是將資訊輸出至控制檯。

我們也可以自定義logging.properties


測試:

import java.util.logging.*;
public class TestLogger {
	public static void main(String[] args) { 
		Logger log = Logger.getLogger("com"); 
		log.setLevel(Level.WARNING); 
		Logger log2 = Logger.getLogger("com.xiya");
		log2.info("111");
		log2.severe("222"); 
		log2.warning("333"); 
	} 
}

輸出:

四月 24, 2017 12:19:32 下午 TestLogger main
嚴重: 222
四月 24, 2017 12:19:32 下午 TestLogger main
警告: 333

從這裡可以看出,logger的名字是有層級關係的,或者可以說,子Logger繼承父Logger的Level。

Logger的Handler

java.util.logging.Handler 
  java.util.logging.MemoryHandler 
  java.util.logging.StreamHandler 
    java.util.logging.ConsoleHandler 
    java.util.logging.FileHandler 
    java.util.logging.SocketHandler

Handler 物件從 Logger 中獲取日誌資訊,並將這些資訊匯出。例如,它可將這些資訊寫入控制檯或檔案中,也可以將這些資訊傳送到網路日誌服務中,或將其轉發到作業系統日誌中。

可通過執行 setLevel(Level.OFF) 來禁用 Handler,並可通過執行適當級別的 setLevel 來重新啟用。
Handler 類通常使用 LogManager 屬性來設定 Handler 的 Filter、Formatter 和 Level 的預設值。

import java.util.logging.*;
import java.io.IOException;
public class TestLogger {
	public static void main(String[] args) throws IOException { 
		Logger log = Logger.getLogger("com");
		log.setLevel(Level.INFO); 
		Logger log1 = Logger.getLogger("com.xiya");
		ConsoleHandler consoleHandler =new ConsoleHandler(); 
        consoleHandler.setLevel(Level.ALL);
        log.addHandler(consoleHandler);
        FileHandler fileHandler = new FileHandler("testlog.log");
        fileHandler.setLevel(Level.INFO);
		//fileHandler.setFormatter(new SimpleFormatter());
        log.addHandler(fileHandler);
        log.info("111");
        log1.info("222");
        log1.fine("333");
	} 
}
輸出:

四月 24, 2017 3:29:27 下午 TestLogger main
資訊: 111
四月 24, 2017 3:29:27 下午 TestLogger main
資訊: 111
四月 24, 2017 3:29:27 下午 TestLogger main
資訊: 222
四月 24, 2017 3:29:27 下午 TestLogger main
資訊: 222
testlog.log

<?xml version="1.0" encoding="GBK" standalone="no"?>
<!DOCTYPE log SYSTEM "logger.dtd">
<log>
<record>
  <date>2017-04-24T15:30:23</date>
  <millis>1493019023251</millis>
  <sequence>0</sequence>
  <logger>com</logger>
  <level>INFO</level>
  <class>TestLogger</class>
  <method>main</method>
  <thread>1</thread>
  <message>111</message>
</record>
<record>
  <date>2017-04-24T15:30:23</date>
  <millis>1493019023297</millis>
  <sequence>1</sequence>
  <logger>com.xiya</logger>
  <level>INFO</level>
  <class>TestLogger</class>
  <method>main</method>
  <thread>1</thread>
  <message>222</message>
</record>
</log>
可見,預設的日誌方式是xml格式,很爛。所以最好自定義下logger的格式。需要用Formatter來定義。

Logger的Formatter

java.util.logging.Formatter 
  java.util.logging.SimpleFormatter 
  java.util.logging.XMLFormatter
Formatter 為格式化 LogRecords 提供支援。 
一般來說,每個日誌記錄 Handler 都有關聯的 Formatter。Formatter 接受 LogRecord,並將它轉換為一個字串。 
以上預設設定即為:fileHandler.setFormatter(new XMLFormatter());

fileHandler.setFormatter(new SimpleFormatter());對應於:

四月 24, 2017 3:34:08 下午 TestLogger main
資訊: 111
四月 24, 2017 3:34:08 下午 TestLogger main
資訊: 222
當然我們可以自定義Formatter
package com.xiya.test;

import java.io.IOException;
import java.util.Date;
import java.util.logging.*;

/**
 * Created by N3verL4nd on 2017/4/24.
 */

class LoggerFormatter extends Formatter {

    @Override
    public String format(LogRecord record) {
        return "[" + new Date() + "]" + " [" + record.getLevel() + "] "
                + record.getClass() + record.getMessage() + "\n";
    }
}

public class LogDemo {
    public static void main(String[] args) throws IOException {
        Logger logger = Logger.getLogger("com.xiya.test.LogDemo");
        logger.setLevel(Level.ALL);
        ConsoleHandler consoleHandler = new ConsoleHandler();
        logger.addHandler(consoleHandler);
        FileHandler fileHandler = new FileHandler("testLog.log");
        fileHandler.setFormatter(new LoggerFormatter());
        logger.addHandler(fileHandler);
        logger.info("hi");
    }
}

參考:

http://mouselearnjava.iteye.com/blog/1926353

http://www.cnblogs.com/xingele0917/p/4120320.html

http://lavasoft.blog.51cto.com/62575/184492

相關推薦

Java Logger(java日誌)

目錄1. 簡介2. 安裝3. log4j基本概念3.1. Logger3.2. Appender3.2.1. 使用ConsoleAppender3.2.2. 使用FileAppender3.2.3. 使用WriterAppender3.3. Layout3.4. 基本示例3.4.1. SimpleLayout

Java Logger使用

在Java中實現日誌記錄的方式有很多種,其中最簡單的方式,就是System.out.print,System.err.print 這樣直接在控制檯列印訊息了。 接下來我們介紹的:java.util.l

java Logger 的使用與配置2

Java Logging API是sun公司於2002年5月正式釋出的。它是自J2SE 1.4版本開始提供的一個新的應用程式介面。它能夠很方便地控制和輸出日誌資訊到檔案,控制檯或其它使用者定義的地方,如資料庫,電子郵件等。所以它是為終端使用者,系統管理員,軟體服務工程師和開

java logger日誌設定儲存位置

設定儲存日誌的位置,以日期作為檔名: public static final Logger logger=Logger.getLogger(Main.class.toString()); StringBuffer logPath=new

Java Logger 介紹

一個使用java.util.logging.Logger進行log輸出的示例程式碼如下: package com.sample; import java.io.File; import java.util.logging.FileHandler; import java.

java logger

這個要看你的日誌配置檔案是怎麼配置的,以log4j為例 log4j.appender.mainLog=org.apache.log4j.ConsoleAppender log4j.appender.mainLog=org.apache.log4j.DailyRollingFileAppender 第一個是控制

javajava自帶的java.util.logging.Logger日誌功能

lena mat logs pre 默認 closed custom err ole 偶然翻閱到一篇文章,註意到Java自帶的Logger日誌功能,特地來細細的看一看,記錄一下。 1.Java自帶的日誌功能,默認的配置   ①Logger的默認配置,位置在JRE安裝目錄下l

java-log4j-xml配置 category、logger、boot 標簽使用

sina 運放 oot margin XML www inf ava app 掌盞撐貝貪下參鴉傺疑http://www.docin.com/sina_6367437814 於鋅中儀蕾柯檀遜渦塗鼓蛔僑http://www.docin.com/sina_6370801430

java-log4j-xml配置category、logger、boot標簽使用

cin com 標簽 oci ddn tar boot xml配置 使用 卑閑洶誌較黴園錳譖釩蒂http://jz.docin.com/ami17633 綴兄怯烈幕怪杖曝嶽脖擋扯http://shufang.docin.com/ami17633 斬莆曰聞藝諫糜粗順迅吹h

java.util.logging.Logger 使用中關於時間格式的問題

tomcat java java.util.logging.Logger類可以打印相關日誌信息並將日誌信息寫入日誌文件 tomcat7默認的日誌格式輸出方法是 java.util.logging.SimpleFormatter.format 如: Apr 11, 201

spring boot項目升級到2.0.1,提示java.lang.ClassNotFoundException: org.apache.log4j.Logger錯誤

ava lan 簡單 src AS dex ack pen pid 首先肯定是版本出現了一點兼容問題 所以我就進入項目,查看依賴樹,cd到項目目錄下,mvn dependency:tree 我看到我的項目原先是1.5.9和現在2.0.1的區別在於org.slf4j的依賴不全

resin發布spring-boot項目報錯“java.lang.NoSuchMethodError: org.jboss.logging.Logger.getMessageLogger”

圖片 ssa 項目啟動 chm dep bubuko ava initial 4.3 說白了還是jar包沖突問題,直接說解決方式: 首先將resin/lib下的validation-api-1.0.0.GA.jar替換成項目中的包validation-api-2.0.1.F

Java Coding Style:static final Logger 的命名問題

簡述 最近公司要求使用PMD做靜態程式碼檢查時 private static final Logger logger = LoggerFactory.getLogger(Example.class); 此類程式碼會提示以下錯誤 A variable naming conve

java.lang.ClassNotFoundException: org.apache.log4j.Logger

java.lang.ClassNotFoundException: org.apache.log4j.Logger 遇到類似的問題,提示就已經很清楚了,沒有找到類,這裡是沒有找到Logger類。 方法一:   第一步 看一下log4j的jar包是否存在,如果不存在,新增ja

java.util.logging.Logger 使用詳解

原文 java.util.logging.Logger 使用詳解   概述: 第1部分 建立Logger物件 第2部分 日誌級別 第3部分 H

tomcat 日誌 java util logging Logger使用 (一)

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/Logger。。。

jar bubuko src lan noclass mage read img erro 學習SpringBoot,啟動主程序遇到如上異常,查找網上發現與slf4j-api-1.7.25.jar有關 到本地倉庫 發現是jar包異常,刪除文件夾,重新更新項目導入j

Java API連線Hbase時報錯WARN No appenders could be found for logger

報錯的內容如下: log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFactory). log4j:WARN Pleas

在es的main方法執行報錯Caused by: java.lang.ClassNotFoundException:org.apache.logging.log4j.logger

Caused by: java.lang.ClassNotFoundException:org.apache.logging.log4j.logger 沒有解決辦法 尋求大哥幫忙 檢視maven下的jar包: 雙擊開啟logger.class 發現裡面時空白 說明jar包

tomcat 日誌 java.util.logging.Logger使用 (一)

1:java sdk 自帶的logger配置檔案位於 sdk home目錄下: jdk1.6.0_25\jre\lib\logging.properties 2:啟用該日誌配置有兩種方式 1)用java -Djava.util.logging.config.file=m