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





  2017-04-24T15:30:23
  1493019023251
  0
  com
  INFO
  TestLogger
  main
  1
  111


  2017-04-24T15:30:23
  1493019023297
  1
  com.xiya
  INFO
  TestLogger
  main
  1
  222


可见,默认的日志方式是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,Java学习笔记)