简介

  任何的软件系统,日志都是非常重要的一部分。良好统一的日志规范会大大提高应用程序的可维护性、可靠性,并进而提高开发效率,指导业务。在早期,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);
...

如果对于 Logger 对象中进行日志记录的多组方法以及它们之间的区别感兴趣,可以查看 天天编码 的这篇文章

深入分析Java的内置日志API(java.util.logging)(一)的更多相关文章

  1. java 并发——内置锁

    坚持学习,总会有一些不一样的东西. 一.由单例模式引入 引用一下百度百科的定义-- 线程安全是多线程编程时的计算机程序代码中的一个概念.在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同 ...

  2. java script 内置对象

    java script 内置对象 Date 日期对象 字符串对象 定义字符串的方法就是直接赋值 使用 String 对象的 toUpperCase() 方法来将字符串小写字母转换为大写,反之 toLo ...

  3. JDK内置日志系统

    1.Java应用中的日志功能 ================= 一般的Java应用程序中都有记录日志的需求,目前主流的记录日志的方法是在应用程序中引入log4j,用log4j来生成日志.其实,JDK ...

  4. ASP.NET Core 2.1 : 十二.内置日志、使用Nlog将日志输出到文件

    应用离不开日志,虽然现在使用VS有强大的调试功能,开发过程中不复杂的情况懒得输出日志了(想起print和echo的有木有),但在一些复杂的过程中以及应用日常运行中的日志还是非常有用. ASP.NET ...

  5. ThinkPHP内置日志记录

    ThinkPHP内置日志记录日志记录http://document.thinkphp.cn/manual_3_2.html#log 日志的处理工作是由系统自动进行的,在开启日志记录的情况下,会记录下允 ...

  6. MyBatis 内置日志工厂基于运行时自省机制选择合适的日志工具

    mybatis – MyBatis 3 | 日志 http://www.mybatis.org/mybatis-3/zh/logging.html MyBatis 内置日志工厂基于运行时自省机制选择合 ...

  7. 第七节:Asp.Net Core内置日志和整合NLog(未完)

    一. Asp.Net Core内置日志 1. 默认支持三种输出方式:控制台.调试(底部输出窗口).EventSource,当然也可以在Program类中通过logging.ClearProviders ...

  8. 利用Java内置的API开发JMX功能

    一.什么是JMX JMS是一种Java规范,定义了如何管理一个软件系统(或应用程序)的规范. 对于一个简单的应用程序,该程序本身不需要被管理.但如果是开发的一个复杂系统(如一个电商平台.一个企业内部管 ...

  9. java synchronized内置锁的可重入性和分析总结

    最近在读<<Java并发编程实践>>,在第二章中线程安全中降到线程锁的重进入(Reentrancy) 当一个线程请求其它的线程已经占有的锁时,请求线程将被阻塞.然而内部锁是可重 ...

随机推荐

  1. Notification的基本用法以及使用RemoteView实现自定义布局

    Notification的作用 Notification是一种全局效果的通知,在系统的通知栏中显示.既然作为通知,其基本作用有: 显示接收到短消息.即时信息等 显示客户端的推送(广告.优惠.新闻等) ...

  2. 化繁为简(三)—探索Mapreduce简要原理与实践

    目录-探索mapreduce 1.Mapreduce的模型简介与特性?Yarn的作用? 2.mapreduce的工作原理是怎样的? 3.配置Yarn与Mapreduce.演示Mapreduce例子程序 ...

  3. 抽象工厂(AbstractFactory)模式-创建型模式

    1.new 的问题 常见的对象创建方法: //创建一个Road对象 Road road=new Road(); new的问题:实现依赖,不能应对具体实例的变化 怎么理解上面这句话呢? 可以这样理解:我 ...

  4. openvpn实现内网 映射到 外网

    openvpn实现内网 映射到 外网 场景介绍: 机器介绍 本地一台Ubuntu服务器A , 处于内网中 , 无外网IP 外网一台Ubuntu服务器B , 外网地址139.199.4.205 目标 : ...

  5. yum安装phpmyadmin小问题

    在CentOS6上面安装phpmyadmin前,加入repo: rpm --import http://dag.wieers.com/rpm/packages/RPM-GPG-KEY.dag.txt ...

  6. zookeeper-开始

    ZooKeeper:为分布式应用提供的分布式协调服务 ZooKeeper提供一系列原语用于分布式应用构建更高层次的服务,如同步.配置维护.分组以及命名空间. 设计目标: ZooKeeper足够简单且可 ...

  7. MATLAB仿真中连续和离散的控制器有何区别?

    matlab系统同时提供连续和离散的控制器和对象的目的是:在降低用户使用复杂程度的同时提高仿真精度.仿真速度和应用的广泛性. 仿真步长和求解精度的概念对于理解这个问题至关重要. 首先是步长,步长和求解 ...

  8. TestNG+ExtentReports生成超漂亮的测试报告

    一个优雅.漂亮的测试报告,能够给我们的测试工作带来不少的加分,而报告的模版实在是让我们这些技术人员头疼的问题,设计的实在是没有什么美感. 那么今天就给大家分享一个自动化测试中,一个超漂亮的测试报告模版 ...

  9. XCOM2中敌对生物设计分析(Aliens篇)

    Aliens Aliens作为游戏设定中入侵的外星人,有各式外貌及奇特的战斗方式,掌握一些高能科技或利用精神力量进行攻击 Sectoid 使用灵能战斗的外星人,并无高级版本,初级便会使用精神控制,生命 ...

  10. javaScript高级程序设计笔记 1

    核心  ECMAScript 文档对象模型  DOM 浏览器对象模型 BOM 延迟脚本  defer typeof操作符      判断字符类型  返回   undefined  boolean  s ...