Java - 日志收集与处理

3/8/2017来源:ASP.NET技巧人气:3063

日志的出现是为了弥补使用System.out.PRintln()进行调试的不足. 因为打印语句需要我们一条一条手动控制.

日志的管理分为两大部分:

日志记录器 日志处理器

日志记录器负责按设定级别对日志进行记录和向上传递, 日志处理器负责按设定级别对日志进行打印.

日志记录器

使用全局日志记录器

最简单的使用情况是通过调用Logger.getGlobal()获得全局日志记录器. 然后通过info()这样的方法来按级别输出日志.

可以通过Logger.global.setLevel(Level.OFF)设置日志级别. 现在设置的是OFF, 则所有的日志信息都不会输出.

注意 日志输出语句只要存在, 无论是否最终进行了输出, 其消息体就会创建, 如果担心消息创建的代价, 可以使用lambda表达式代替. 详见 Jav8 - 通过lambd表达式进行计算 一文.

按名创建日志记录器

如果你想对每个类创建分离的日志记录器, 可以使用以下语句:

Logger logger = Logger.getLogger(LoggerExample.class.getName());

注意 日志记录器是有层级的, 也就是说如果你有一个日志记录器名为com.congyh, 如果你关闭了com日志记录器的日志输出, 那么com.congyh也不会进行日志输出.

日志级别

日志共有七种级别: SEVERE, WARNING, INFO, CONFIG, FINE, FINER, FINEST.

默认情况下, 会输出INFO及以上级别的日志, 可以通过使用Level.ALL来开启所有级别的日志, 也可以按日志级别进行控制.

你应该使用CONFIG及以下级别的日志来输出debug信息.

日志处理器

日志处理器按照输出的形式分为三种: ConsoleHandler, FileHandler, SocketHandler.

默认的日志处理器工作在INFO级别, 如果不对其进行修改, 即使日志记录器设置在例如CONFIG级别, 那么日志实际上是只记录不输出. 假设我们现在有一个类叫做LoggerExample, 正确的使用案例如下:

// 按名创建日志记录器 Logger logger = Logger.getLogger(LoggerExample.class.getName()); logger.setLevel(Level.CONFIG); ConsoleHandler consoleHandler = new ConsoleHandler(); consoleHandler.setLevel(Level.CONFIG); logger.addHandler(consoleHandler); logger.config("使用按名创建的logger输出CONFIG级别的信息");

程序输出如下:

三月 05, 2017 10:24:49 上午 com.github.congyh.log.LoggerExample main 配置: 使用按名创建的logger输出CONFIG级别的信息