OK,现在我们来研究下JDK自带的日志Logger。



从jdk1.4起,JDK开始自带一套日志系统。JDK Logger最大的优点就是不需要任何类库的支持,只要有Java的运行环境就可以使用。

相对于其他的日志空间,JDK自带的日志可谓是鸡肋,无论易用性,功能还是扩展性都要稍逊一筹,所以在商业系统中很好直接使用。

我们现在整理到日志系列了,所以这里只是做一个简单的介绍就好了,比较实际编码中也不会写到这部分代码。



JDK Logging把日志分为如下几个级别,等级依次升高。

all→finest→finer→fine→config→info→warning→server→off

如果将级别设为info,那么info值钱的低级别信息将不会输出,只有info级别只有的信息会输出,通过控制级别达到控制输出的目的。

具体看下面的代码:

package org.linkinpark.commons.logtest;

import java.util.logging.Level;
import java.util.logging.Logger; /**
* @创建作者: LinkinPark
* @创建时间: 2016年2月22日
* @功能描述: JDK自带日志测试
*/
public class LogJDKTest
{
public static Logger log = Logger.getLogger(LogJDKTest.class.toString()); public static void main(String[] args)
{
// all→finest→finer→fine→config→info→warning→server→off
// 级别依次升高,后面的日志级别会屏蔽之前的级别
log.setLevel(Level.INFO);
log.finest("finest");
log.finer("finer");
log.fine("fine");
log.config("config");
log.info("info");
log.warning("warning");
log.severe("server");
} }

控制台输出如下:

二月 22, 2016 4:31:12 下午 org.linkinpark.commons.logtest.LogJDKTest main
信息: info
二月 22, 2016 4:31:12 下午 org.linkinpark.commons.logtest.LogJDKTest main
警告: warning
二月 22, 2016 4:31:12 下午 org.linkinpark.commons.logtest.LogJDKTest main
严重: server

1,JDK log默认会有一个控制台输出,用来输出INFO级别以上的信息,当然我们也可以调用logger的setLevel()方法来设值。

2,同时我们也可以设置多个输出(Hander),每个输出设置不用的level,然后通过addHandler添加到了log中,注意为log设置级别与为每个handler设置级别的意义是不同的。

代码如下:

package org.linkinpark.commons.logtest;

import java.util.logging.ConsoleHandler;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.Logger; /**
* @创建作者: LinkinPark
* @创建时间: 2016年2月22日
* @功能描述: JDK自带日志测试
*/
public class LogJDKTest
{
public static Logger log = Logger.getLogger(LogJDKTest.class.toString()); static
{
Handler console = new ConsoleHandler();
console.setLevel(Level.SEVERE);
log.addHandler(console);
} public static void main(String[] args)
{
// all→finest→finer→fine→config→info→warning→server→off
// 级别依次升高,后面的日志级别会屏蔽之前的级别
log.setLevel(Level.INFO);
log.finest("finest");
log.finer("finer");
log.fine("fine");
log.config("config");
log.info("info");
log.warning("warning");
log.severe("server");
} }

控制台输出如下:

// 下面的输出是默认控制台的
二月 22, 2016 4:32:41 下午 org.linkinpark.commons.logtest.LogJDKTest main
信息: info
二月 22, 2016 4:32:41 下午 org.linkinpark.commons.logtest.LogJDKTest main
警告: warning
二月 22, 2016 4:32:41 下午 org.linkinpark.commons.logtest.LogJDKTest main
严重: server
// 下面的输出是自己添加hander的
二月 22, 2016 4:32:41 下午 org.linkinpark.commons.logtest.LogJDKTest main
严重: server



根据级别等级,如果设为all,则所有的信息都会被输出,如果设为off,则所有的信息都不会输出。



  • 这里贴出JDK关于该类的介绍

=====================================================================================================================================================================

Logger 对象用来记录特定系统或应用程序组件的日志消息。一般使用圆点分隔的层次名称空间来命名 Logger。Logger 名称可以是任意的字符串,但是它们一般应该基于被记录组件的包名或类名,如 java.net 或 javax.swing。此外,可以创建“匿名”的 Logger,其名称未存储在 Logger 名称空间中。

可通过调用某个 getLogger 工厂方法来获得 Logger 对象。这些方法要么创建一个新 Logger,要么返回一个合适的现有 Logger。

日志消息被转发到已注册的 Handler 对象,该对象可以将消息转发到各种目的地,包括控制台、文件、OS 日志等等。

每个 Logger 都跟踪一个“父”Logger,也就是 Logger 名称空间中与其最近的现有祖先。

每个 Logger 都有一个与其相关的 "Level"。这反映了此 logger 所关心的最低 Level。如果将 Logger 的级别设置为 null,那么它的有效级别继承自父 Logger,这可以通过其父 Logger 一直沿树向上递归得到。

可以根据日志配置文件的属性来配置日志级别,在 LogManager 类的描述中对此有所说明。但是也可以通过调用 Logger.setLevel 方法动态地改变它。如果日志级别改变了,则此变化也会影响它的子 logger,因为任何级别为 null 的子 logger 的有效级别都继承自它的父 Logger。

对于每次日志记录调用,Logger 最初都依照 logger 的有效日志级别对请求级别(例如 SEVERE 或 FINE)进行简单的检查。如果请求级别低于日志级别,则日志记录调用将立即返回。

通过此初始(简单)测试后,Logger 将分配一个 LogRecord 来描述日志记录消息。接着调用 Filter(如果存在)进行更详细的检查,以确定是否应该发布该记录。如果检查通过,则将 LogRecord 发布到其输出 Handler。在默认情况下,logger 也将 LogRecord 沿树递推发布到其父 Handler。

每个 Logger 都有一个与其关联的 ResourceBundle 名称。该指定的包用于本地化日志消息。如果一个 Logger 没有自己的 ResourceBundle 名称,则它将通过其父 Logger 沿树递归继承到 ResourceBundle 名称。

大多数 logger 输出方法都带有 "msg" 参数。此 msg 参数可以是一个原始值,也可以是一个本地化的键。在格式化期间,如果 logger 具有(或继承)一个本地化 ResourceBundle,并且 ResourceBundle 包含 msg 字符串的映射关系,那么用本地化值替换 msg 字符串。否则使用原来的 msg 字符串。通常,格式器使用 java.text.MessageFormat 形式的格式来格式化参数,例如,格式字符串
"{0} {1}" 将两个参数格式化为字符串。

将 ResourceBundle 名称映射到 ResourceBundle 时,Logger 首先试图使用该线程的 ContextClassLoader。如果 ContextClassLoader 为 null,则 Logger 将尝试 SystemClassLoader。作为初始实现中的临时过渡功能,如果 Logger 无法从 ContextClassLoader 或 SystemClassLoaderis 中找到一个
ResourceBundle,则 Logger 将会向上搜索类堆栈并连续调用 ClassLoader 来试图找到 ResourceBundle(此调用堆栈搜索是为了允许容器过渡到使用 ContextClassLoader,该功能可能在以后版本中取消)。

格式化(包括本地化)是输出 Handler 的责任,它通常会调用格式器。

注意,格式化不必同步发生。它可以延迟,直到 LogRecord 被实际写入到外部接收器。

日志记录方法划分为 5 个主要类别:

  • 一系列的 "log" 方法,这种方法带有日志级别、消息字符串,以及可选的一些消息字符串参数。

  • 一系列的 "logp" 方法(即 "log precise"),其与 "log" 方法相似,但是带有显式的源类名称和方法名称。

  • 一系列的 "logrb" 方法(即 "log with resource bundle"),其与 "logp" 方法相似,但是带有显式的在本地化日志消息中使用的资源包名称。

  • 还有跟踪方法条目("entering" 方法)、方法返回("exiting" 方法)和抛出异常("throwing" 方法)的便捷方法。

  • 最后,还有一系列在非常简单的情况下(如开发人员只想为给定的日志级别记录一条简单的字符串)使用的便捷方法。这些方法按标准级别名称命名("severe"、"warning"、"info" 等等),并带有单个参数,即一个消息字符串。

对于不带显式源名和方法名的方法,日志记录框架将尽可能确定日志记录方法中调用了哪个类和方法。但是应认识到,这样自动推断的信息可能只是近似的,甚至可能是完全错误的。这是因为允许虚拟机在 JIT 编译时可以进行广泛的优化,并且可以完全移除栈帧,导致它无法可靠地找到调用的类和方法。

Logger 上执行的所有方法都是多线程安全的。

子类化信息:注意,对于名称空间中的任意点,LogManager 类都可以提供自身的指定 Logger 实现。因此,Logger 的任何子类(它们与新的 LogManager 类一起实现的情况除外)要注意应该从 LogManager 类获得一个 Logger 实例,并应该将诸如 "isLoggable" 和 "log(LogRecord)" 这样的操作委托给该实例。注意,为了截取所有的日志记录输出,子类只需要重写
log(LogRecord) 方法。所有其他日志记录方法作为在此 log(LogRecord) 方法上的调用而实现。

=====================================================================================================================================================================

JDK自带的日志Logging的更多相关文章

  1. 【转载】JDK自带的log工具

    版权声明:本文为Jaiky_杰哥原创,转载请注明出处.This blog is written by Jaiky, reproduced please indicate. https://blog.c ...

  2. 如何使用Tomcat自带的日志实现tomcat-juli.jar

    前言 Tomcat自带的日志实现是tomcat-juli.jar,它是对默认的JDK日志java.util.logging进行一定的封装,和标准JDK日志支持相同的配置,但是和log4j等常用的日志框 ...

  3. jdk自带的MD5进行数据的加密与解密

    package com.tools.util; import java.io.IOException; import java.io.UnsupportedEncodingException; imp ...

  4. 死锁排查的小窍门 --使用jdk自带管理工具jstack

    本文版权归 远方的风lyh和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 开发时间久了,难免会写出一些一些死锁的代码,自己明明调用该方法可该方法就是不执行.不进该方法.日志也不打 ...

  5. day18包的使用与日志(logging)模块

    包的使用与日志(logging)模块1. 什么是包    包就是一个包含有__init__.py文件的文件夹    包本质就是一种模块,即包是用包导入使用的,包内部包含的文件也都是用来被导入使用2 为 ...

  6. 011 - JDK自带的性能监控工具

      一.概要: jps -l 查看现有的java进程 jps -l 显示所有正在运行的java进程id   jstack 查看Java线程      jstack -l pid; 做thread du ...

  7. 日志 logging 代码格式

    日志logging 格式代码 import logging looger = logging.getLogger() #创建一个空架子 创建一个文件句柄,用来记录日志(文件流) fh = loggin ...

  8. 日志(logging)与正则(re)模块

    logging模块 #日志:日常的流水 =>日志文件,将程序运行过程中的状态或数据进行记录,一般都是记录到日志文件中 #1.logging模块一共分为五个打印级别 debug.info.warn ...

  9. python中日志logging模块的性能及多进程详解

    python中日志logging模块的性能及多进程详解 使用Python来写后台任务时,时常需要使用输出日志来记录程序运行的状态,并在发生错误时将错误的详细信息保存下来,以别调试和分析.Python的 ...

随机推荐

  1. Mac下安装ant(利用brew)

    安装ant最简单的方法就是通过brew.步骤如下:1. 安装brew(如果已经安装可以跳过这步). ruby -e "$(curl -fsSL https://raw.github.com/ ...

  2. PE解析器的编写(三)——区块表的解析

    PE文件中所有节的属性都被定义在节表中,节表由一系列的IMAGE_SECTION_HEADER结构排列而成,每个结构用来描述一个节,结构的排列顺序和它们描述的节在文件中的排列顺序是一致的. 具有相同属 ...

  3. 跟我一起读postgresql源码(九)——Executor(查询执行模块之——Scan节点(上))

    从前面介绍的可优化语句处理相关的背景知识.实现思想和执行流程,不难发现可优化语句执行的核心内容是对于各种计划节点的处理,由于使用了节点表示.递归调用.统一接口等设计,计划节点的功能相对独立.代码总体流 ...

  4. python 爬取腾讯微博并生成词云

    本文以延参法师的腾讯微博为例进行爬取并分析 ,话不多说 直接附上源代码.其中有比较详细的注释. 需要用到的包有 BeautifulSoup WordCloud jieba # coding:utf-8 ...

  5. jsp数据

    ---恢复内容开始--- JSP 是什么 JSP全称Java Server Pages,是一种动态网页开发技术.它使用JSP标签在HTML网页中插入Java代码.标签通常以<%开头以%>结 ...

  6. https 与 http

    HTTPS,HTTP over SSL,SSL是解决传输层安全问题的网络协议,其核心是基于公钥密码学理论实现了对服务器身份认证,数据的私密性保护以及对数据完整性的校验等功能. SSL协议在HTTP请求 ...

  7. 五分钟学习React(三):纯HTML代码搭建React应用

    上一期我们使用了React官方的脚手架运行React应用.大家可能会觉得这种方法很繁琐,需要配置各种第三方插件.JQuery时代的前端真是让人怀念.这一期,我就带领大家创建一个"怀旧版&qu ...

  8. bzoj:1703: [Usaco2007 Mar]Ranking the Cows 奶牛排名

    Description     农夫约翰有N(1≤N≤1000)头奶牛,每一头奶牛都有一个确定的独一无二的正整数产奶率.约翰想要让这些奶牛按产奶率从高到低排序.    约翰已经比较了M(1≤M≤100 ...

  9. CSS3动画属性和flex弹性布局各个属性

    [CSS3动画的使用] 1.声明一个关键帧(动画): @keynames name{ from{} to{} } 每个阶段的写法: ①可以直接使用from-to的写法 ②可以设置0%-100%的写法, ...

  10. Servlet面试题归纳

    尊重原创:http://blog.csdn.net/caohaicheng/article/details/38116481 1.说一说Servlet生命周期 Servlet生命周期包括三部分: 初始 ...