深入分析Java的内置日志API(java.util.logging)(一)
简介
任何的软件系统,日志都是非常重要的一部分。良好统一的日志规范会大大提高应用程序的可维护性、可靠性,并进而提高开发效率,指导业务。在早期,Java工程师往往都是利用 System.err.println 或 System.out.println将 Java 应用内部的状态信息或错误消息打印到系统的控制台中,这种简易的保存方式显然无法满足保存日志信息所需的持久性和便利性等要求。所以,SUN 公司在发布 JDK 1.4 时,在 java.util.logging 包提供了一个日志框架。通常,直接使用 JUL 表示该框架。利用 JUL 的 API,Java 工程师可以输出不同重要级别(比如 error、info 和 debug)的日志信息到一个集中的位置(比如 rotating file)。同时,Java 工程师可以完全控制输出日志信息的重要级别和输出格式。
框架概述
笔者认为,学习任何一门新技术或新概念的最佳方式都是 先整体后细节。所以,笔者先抛出 JUL 的框架概述图:

- Application 将多种级别(level)的日志信息传递给 Logger 对象;
- Logger 对象使用 Level 和 Filter 对接受到的日志信息进行过滤;将日志信息转换成 LogRecord 对象后传递给 Handler 对象;
- Handler 对象使用 Level 和 Filter 对接受到的 LogRecord 对象进行过滤;并使用 Formatter 格式化 LogRecord 对象并输出到外部的文件或者数据库中。
- Logger 对象之间存在着父子层级关系,这种层级关系是通过 Logger 对象的名称来决定。
LogManager(日志管理器)
在 JUL 被 JVM 加载时,会有一个 LogManager 对象被创建出来作为全局组件而存在。这个全局组件主要负责创建和管理 Logger 对象,同时生成和维护全局的日志配置信息,这个全局配置信息可能是从配置文件中读取而来,也可能是从配置类读取而来。在默认配置的情况下,LogManager 只创建一个Level 为 Level.INFO 的 ConsoleHandler,该 ConsoleHandler 的日志信息输出目的地是 System.err。同时,这个 ConsoleHandle 属于 LogManager 中的 root logger(根记录器)。
在 Java 应用所使用的某个 JVM 中,有且仅有一个 LogManager 对象存在。通常,Java 工程师可以使用如下的代码获取该 LogManager 实例对象:
LogManager manager = LogManager.getLogManager();
通常情况下,Java 工程师都不要与该 LogManager 对象直接交互,除非某些特殊情形。比如重新加载配置类或配置文件,这种情况可以使用如下所示的实例代码:
// 重读配置类或配置文件
manager.readConfiguration();
// 重读特定位置的配置类与配置文件
manager.readConfiguration(inputStream);
通过使用 LogManager 的 getLoggingMXBen() 方法,可以获取一个 MXBen(Java Management Extensions)。简单地实例代码如下:
LoggingMXBean mxBean = manager.getLoggingMXBen();
当然,LogManager 还有很多其他的方法与特性,有兴趣的同学可以进一步查看 JavaDoc 或者源码。
Logger(日志记录器)
JUL 的主要入口类是 java.util.Logger。进行日志记录的第一步就是创建一个 Logger 对象:
Logger logger = Logger.getLogger("www.tiantianbianma.com");
传递给 Logger 类中 getLogger 工厂方法的字符串 “www.tiantianbianma.com” 就是所创建的 Logger 对象的名称。
在实际的项目开发中,一般的做法是使用当前 Java 类的名称或所在包的名称作为 Logger 对象的名称。一个常见的示例代码如下:
public class Application {
Logger logger = Logger.getLogger(this.getClass().getName());
}
如果需要一个静态的 Logger 对象,示例代码如下:
public class Application {
static Logger logger = Logger.getLogger(Application.class.getName());
}
如果需要查询 Logger 对象的名称,可以使用 getName() 方法。
String loggerName = logger.getName();
使用 Logger 对象进行日志记录的方式很多,部分方式的示例代码如下:
log (Level level, String message);
log (Level level, String message, Object param);
logp (Level level, String sourceClass, String sourceMethod, String msg);
logrb (Level level, String sourceClass, String sourceMethod, String bundle, String msg);
entering (String sourceClass, String sourceMethod);
...
深入分析Java的内置日志API(java.util.logging)(一)的更多相关文章
- java 并发——内置锁
坚持学习,总会有一些不一样的东西. 一.由单例模式引入 引用一下百度百科的定义-- 线程安全是多线程编程时的计算机程序代码中的一个概念.在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同 ...
- java script 内置对象
java script 内置对象 Date 日期对象 字符串对象 定义字符串的方法就是直接赋值 使用 String 对象的 toUpperCase() 方法来将字符串小写字母转换为大写,反之 toLo ...
- JDK内置日志系统
1.Java应用中的日志功能 ================= 一般的Java应用程序中都有记录日志的需求,目前主流的记录日志的方法是在应用程序中引入log4j,用log4j来生成日志.其实,JDK ...
- ASP.NET Core 2.1 : 十二.内置日志、使用Nlog将日志输出到文件
应用离不开日志,虽然现在使用VS有强大的调试功能,开发过程中不复杂的情况懒得输出日志了(想起print和echo的有木有),但在一些复杂的过程中以及应用日常运行中的日志还是非常有用. ASP.NET ...
- ThinkPHP内置日志记录
ThinkPHP内置日志记录日志记录http://document.thinkphp.cn/manual_3_2.html#log 日志的处理工作是由系统自动进行的,在开启日志记录的情况下,会记录下允 ...
- MyBatis 内置日志工厂基于运行时自省机制选择合适的日志工具
mybatis – MyBatis 3 | 日志 http://www.mybatis.org/mybatis-3/zh/logging.html MyBatis 内置日志工厂基于运行时自省机制选择合 ...
- 第七节:Asp.Net Core内置日志和整合NLog(未完)
一. Asp.Net Core内置日志 1. 默认支持三种输出方式:控制台.调试(底部输出窗口).EventSource,当然也可以在Program类中通过logging.ClearProviders ...
- 利用Java内置的API开发JMX功能
一.什么是JMX JMS是一种Java规范,定义了如何管理一个软件系统(或应用程序)的规范. 对于一个简单的应用程序,该程序本身不需要被管理.但如果是开发的一个复杂系统(如一个电商平台.一个企业内部管 ...
- java synchronized内置锁的可重入性和分析总结
最近在读<<Java并发编程实践>>,在第二章中线程安全中降到线程锁的重进入(Reentrancy) 当一个线程请求其它的线程已经占有的锁时,请求线程将被阻塞.然而内部锁是可重 ...
随机推荐
- JSONP不支持循环调用
问题描述 在jquery或zepto下,循环调用同一个jsonp ;i<;i++){ $.ajax({ url:'https://m.suning.com/authStatus?callback ...
- Node.js 8有哪些重要功能和修复?
欢迎大家持续关注葡萄城控件技术团队博客,更多更好的原创文章尽在这里~~ 5月30日12点,Node.js 8正式发布了,这个版本具有一系列新功能和性能改进,并且这些功能和改进将获得长期支持(LTS). ...
- 【2017-06-02】Jquery基础
Jquery就是Js集成的一些方法包. 注意:Jquery的引入位置在<head></head>里. 一.选择器 1.Id选择器 $("#div1") 2. ...
- 论如何把JS踩在脚下 —— JQuery基础及Ajax请求详解
一.什么是JQuery? JQuery是一种JavaScript框架,是一堆大神搞出来的能够让前端程序猿敲更少代码.实现更多功能的工具(在此,跪谢各位JQuery开发大大们!!!).JQuery的使用 ...
- 容器常用操作 - 每天5分钟玩转 Docker 容器技术(25)
前面讨论了如何运行容器,本节学习容器的其他常用操作. stop/start/restart 容器 通过 docker stop 可以停止运行的容器. 容器在 docker host 中实际上是一个进程 ...
- bootstrapValidator 使用(包含入门demo,常用方法,以及常用的规则)
一 什么是bootstrapValidator? -- 一个基于 jquery,boostrap 的表单验证框架....简单实用上手快,页面美观还过得去,不废话了,直接撸. 二 boots ...
- OpenSSL "heartbleed" 安全漏洞
在 heartbleed 的官网上有关于 CVE-2014-0160 漏洞的详细信息,这是关于 OpenSSL 的信息泄漏漏洞导致的安全问题.改 Heartbleed bug 可以让互联网的任何人读取 ...
- java之真假分页
真分页(要的是什么范围的记录在数据库查的时候就只查这几条记录):select s.* from (select *,row_number() over(order by SLoginId) as ro ...
- Windows窗口的尺寸和位置
介绍 窗口的大小和位置表示为一个矩形边界,该矩形的坐标是相对于屏幕或父窗口而言的.顶级窗口的坐标是相对于屏幕的左上角而言的,子窗口的坐标则是相对于父窗口的左上角而言.应用程序创建窗口时(CreateW ...
- 关于php网络爬虫phpspider。
前几天,被老板拉去说要我去抓取大众点评某家店的数据,当然被我义正言辞的拒绝了,理由是我不会...但我的反抗并没有什么卵用,所以还是乖乖去查资料,因为我是从事php工作的,首先找的就是php的网络爬虫源 ...