接下来我们介绍的:java.util.logging.Logger是在JDK 1.4 版本之后加入的,提供了日志记录的API ,可以往控制台/文件中写日志了。


我们可以使用全局日志记录器来生成简单的日志记录


Logger.getGlobal().info("log test");


输出:




JAVA里面logger的作用 java logger使用_自定义


查找或创建一个 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

JAVA里面logger的作用 java logger使用_自定义_02


测试:

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的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");
    }
}