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

关于Logger

最近放假在家无聊,研究一个开源框架时发现它频繁运用到了一个叫Logger的相关类来进行日志记录,作为log4j的忠实粉丝,在大多数项目上都看到的是log4j和commons-logging,这个Logger为何物?点开源码看,才发现是JDK自带的日志类,非第三方开源Jar包,于是便起了好奇之心,想看看这个Logger与log4j和commons-logging有何不同,翻了翻Blog,使用研究一番,此处说下我的初步体验。

传统的Java项目中给项目程序添加log主要有三种方式,一使用JDK中的java.util.logging包,一种是log4j,一种是commons-logging。其中log4j和commons-logging都是apache软件基金会的开源项目。这三种方式的区别如下:

Java.util.logging:

JDK标准库中的类,是JDK 1.4 版本之后添加的日志记录的功能包。

log4j:

最强大的记录日志的方式。可以通过配置 .properties 或是 .xml 的文件, 配置日志的目的地,格式等等。

commons-logging:

最综合和常见的日志记录方式,是Java中的一个日志接口,一般会与log4j一起使用。自带SimpleLog可用于日志记录。

Java Logging API提供了七个日志级别用来控制输出。这七个级别分别是:

级别

SEVERE WARNING INFO CONFIG  FINE  FINER FINEST

调用方法

severe() warning() info() config() fine() finer() finest()

含意

严重 警告 信息 配置 良好 较好 最好

Logger的使用

1、新建LogUtil.Java( 里面写了几个静态方法,为log设置等级、添加log控制台handler、添加log文件输出handler)

import java.io.IOException;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.logging.ConsoleHandler;

import java.util.logging.FileHandler;

import java.util.logging.Formatter;

import java.util.logging.Level;

import java.util.logging.LogRecord;

import java.util.logging.Logger;

 

public class LogUtil {

    

    // 正常的日期格式

    public static final String DATE_PATTERN_FULL = "yyyy-MM-dd HH:mm:ss";

    // 不带符号的日期格式,用来记录时间戳

    public static final String DATE_PATTERN_NOMARK = "yyyyMMddHHmmss";

 

    /**

     * 为log设置等级

     * 

     * @param log

     * @param level

     */

    public static void setLogLevel(Logger log, Level level) {

        log.setLevel(level);

    }

 

    /**

     * 为log添加控制台handler

     * 

     * @param log

     *            要添加handler的log

     * @param level

     *            控制台的输出等级

     */

    public static void addConsoleHandler(Logger log, Level level) {

        // 控制台输出的handler

        ConsoleHandler consoleHandler = new ConsoleHandler();

        // 设置控制台输出的等级(如果ConsoleHandler的等级高于或者等于log的level,则按照FileHandler的level输出到控制台,如果低于,则按照Log等级输出)

        consoleHandler.setLevel(level);

 

        // 添加控制台的handler

        log.addHandler(consoleHandler);

    }

 

    /**

     * 为log添加文件输出Handler

     * 

     * @param log

     *            要添加文件输出handler的log

     * @param level

     *            log输出等级

     * @param filePath

     *            指定文件全路径

     */

    public static void addFileHandler(Logger log, Level level, String filePath) {

        FileHandler fileHandler = null;

        try {

            fileHandler = new FileHandler(filePath);

            // 设置输出文件的等级(如果FileHandler的等级高于或者等于log的level,则按照FileHandler的level输出到文件,如果低于,则按照Log等级输出)

            fileHandler.setLevel(level);

            fileHandler.setFormatter(new Formatter() {

                @Override

                public String format(LogRecord record) {

 

                    // 设置文件输出格式

                    return "[ " + getCurrentDateStr(DATE_PATTERN_FULL) + " - Level:"

                            + record.getLevel().getName().substring(0, 1) + " ]-" + "[" + record.getSourceClassName()

                            + " -> " + record.getSourceMethodName() + "()] " + record.getMessage() + "\n";

                }

            });

 

        } catch (SecurityException e) {

            e.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();

        }

        // 添加输出文件handler

        log.addHandler(fileHandler);

    }

 

    /**

     * 获取当前时间

     * 

     * @return

     */

    public static String getCurrentDateStr(String pattern) {

        Date date = new Date();

        SimpleDateFormat sdf = new SimpleDateFormat(pattern);

        return sdf.format(date);

    }

}

2、新建LogFactory.Java(用于获取全局log,这里的全局log不同于jdk自带log的全局log,jdk自带的全局log需要手动添加ConsoleHandler和FileHandler,这里只全部定义好了,只需要通过LogFactory.getGlobalLog()就可以获取到,使用的过程中会自动添加日志到对应的文件)

import java.io.File;

import java.util.logging.Level;

import java.util.logging.Logger;

 

public class LogFactory {

 

    // 全局Log的名称

    public static final String LOG_NAME = "Global";

 

    // 这个文件路径必须存在,不存在会报错,并不会自动创建

    public static final String LOG_FOLDER = "E:\\Log\\JDKLog";

 

    // log文件路径

    private static String log_filepath;

 

    // 静态变量globleLog

    private static Logger globalLog;

 

    static {

 

        // 加载类的时候初始化log文件全路径,这里的文件名称是JDKLog_+时间戳+.log

     log_filepath = LOG_FOLDER + File.separator + "JDKLog_" + LogUtil.getCurrentDateStr(LogUtil.DATE_PATTERN_NOMARK)

                + ".log";

 

        // 加载类的时候直接初始化globleLog

        globalLog = initGlobalLog();

    }

 

    /**

     * 初始化全局Logger

     * 

     * @return

     */

    public static Logger initGlobalLog() {

 

        // 获取Log

        Logger log = Logger.getLogger(LOG_NAME);

 

        // 为log设置全局等级

        log.setLevel(Level.ALL);

 

        // 添加控制台handler

        LogUtil.addConsoleHandler(log, Level.INFO);

 

        // 添加文件输出handler

        LogUtil.addFileHandler(log, Level.INFO, log_filepath);

 

        // 设置不适用父类的handlers,这样不会在控制台重复输出信息

        log.setUseParentHandlers(false);

 

        return log;

    }

 

    public static Logger getGlobalLog() {

        return globalLog;

    }

 

}

3、写测试类JDKLogTest.Java

import java.io.File;

import java.util.logging.Level;

import java.util.logging.Logger;

import org.junit.Test;

 

public class JDKLogTest {

 

    // 自定义的全局log(个人一般用这个记录)

    private static Logger log = LogFactory.getGlobalLog();

    // Jdk1.7以后自带的全局log(后面我添加了FileHandler,用于写入文件日志)

    private static Logger sysLog = Logger.getGlobal();

 

    static {

     //由于jdk自带的全局log没有写入文件的功能,我这里手动添加了文件handler

        LogUtil.addFileHandler(sysLog, Level.INFO, LogFactory.LOG_FOLDER + File.separator + "sys.log");

    }

 

    @Test

    public void test01() {

        // 级别从上往下依次降低

        log.severe("severe-->   this is severe!");

        log.warning("warning-->   this is warning!");

        log.info("info-->   this is info!");

        log.config("config-->   this is config!");

        log.fine("fine-->   this is fine!");

        log.finer("finer-->   this is finer!");

        log.finest("finest-->   this is finest!");

    }

 

    @Test

    public void test02() {

        log.info("info-->   this is test02 log");

    }

 

    @Test

    public void test03() {

        sysLog.info("test03 info!");

    }

 

    @Test

    public void test04() {

        sysLog.info("test04 info!");

    }

}

测试结果:

控制台输出:

六月 15, 2016 3:26:37 下午 cn.darkranger.log.logger.JDKLogTest test01

严重: severe--> this is severe!

六月 15, 2016 3:26:37 下午 cn.darkranger.log.logger.JDKLogTest test01

警告: warning--> this is warning!

六月 15, 2016 3:26:37 下午 cn.darkranger.log.logger.JDKLogTest test01

信息: info--> this is info!

六月 15, 2016 3:26:37 下午 cn.darkranger.log.logger.JDKLogTest test02

信息: info--> this is test02 log

六月 15, 2016 3:26:37 下午 cn.darkranger.log.logger.JDKLogTest test03

信息: test03 info!

六月 15, 2016 3:26:37 下午 cn.darkranger.log.logger.JDKLogTest test04

信息: test04 info!

文件输出:

E:\Log\JDKLog\JDKLog_20160615152637.log(自定义全局log的日志文件)

[ 2016-06-15 15:26:37 - Level:S ]-[cn.darkranger.log.logger.JDKLogTest -> test01()] severe-->   this is severe!

[ 2016-06-15 15:26:37 - Level:W ]-[cn.darkranger.log.logger.JDKLogTest -> test01()] warning-->   this is warning!

[ 2016-06-15 15:26:37 - Level:I ]-[cn.darkranger.log.logger.JDKLogTest -> test01()] info-->   this is info!

[ 2016-06-15 15:26:37 - Level:I ]-[cn.darkranger.log.logger.JDKLogTest -> test02()] info-->   this is test02 log

E:\Log\JDKLog\sys.log(系统自带log全局log的日志文件)

[ 2016-06-15 15:26:37 - Level:I ]-[cn.darkranger.log.logger.JDKLogTest -> test03()] test03 info!

[ 2016-06-15 15:26:37 - Level:I ]-[cn.darkranger.log.logger.JDKLogTest -> test04()] test04 info!

声明

欢迎转载,但请保留文章原始出处

作者:Jaiky_杰哥 

出处:http://blog.csdn.net/jaikydota163/article/details/52783588

【转载】JDK自带的log工具的更多相关文章

  1. [转载]JDK自带的实用工具——native2ascii.exe

    做Java开发的时候,常常会出现一些乱码,或者无法正确识别或读取的文件,原因是编码方式的不一致.native2ascii是sun java sdk提供的一个工具.用来将别的文本类文件(比如*.txt, ...

  2. tomcat配置https–采用JDK自带的keytool工具生成证书

    转自:http://blog.csdn.net/huangxinyu_it/article/details/41693633 有关http与https的区别请看<浅谈http与https的区别( ...

  3. JDK自带VM分析工具jps,jstat,jmap,jconsole

    一.概述 SUN 的JDK中的几个工具,非常好用.秉承着有免费,不用商用的原则.以下简单介绍一下这几种工具.(注:本文章下的所有工具都存在JDK5.0以上版本的工具集里,同javac一样,不须特意安装 ...

  4. jdk 自带命令行工具

    jps工具 虚拟机进程状况工具 工具主要选项 jstat: 虚拟机统计信息监视工具 jinfo: Java配置信息工具 jinfo( Configuration Info for Java) 的作用是 ...

  5. JDK自带反编译工具javap

    在JDK的bin文件夹下,有许多自带工具: javap就是其中的一个,对应为 javap.exe javap可反编译查看Java编译器编译生成的字节码文件, 语法: javap [ options ] ...

  6. 使用JDK自带的keytool工具生成证书

    一.keytool 简介 keytool 是java用于管理密钥和证书的工具,它使用户能够管理自己的公钥/私钥对及相关证书,用于(通过数字签名)自我认证(用户向别的用户/服务认证自己)或数据完整性以及 ...

  7. JDK自带的native2ascii工具介绍

    背景:在做Java开发的时候,常常会出现一些乱码,或者无法正确识别或读取的文件,比如常见的validator验证用的消息资源(properties)文件就需要进行Unicode重新编码.原因是java ...

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

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

  9. jdk自带监控程序jvisualvm的使用

    监控小程序的配置 生产环境tomcat的配置 编辑应用所在的tomcat服务器下的bin目录下的catalina.sh文件,修改如下: 配置如下内容: export JAVA_OPTS="- ...

随机推荐

  1. 在.net core不同的版本中 webabi引用的包不同

    core2.0中: 为了要使用MVC Controller 要安装 Microsoft.AspNetCore.Mvc.Core包 Core2.1中:Microsoft.AspNetCore.App

  2. OpenMP 并行程序设计入门

    OpenMP 是一个编译器指令和库函数的集合,主要是为共享式存储计算机上的并行程序设计使用的. 0. 一段使用 OpenMP 的并行程序 #include <stdio.h> #inclu ...

  3. C#获取windows 10的下载文件夹路径

    Windows没有为“下载”文件夹定义CSIDL,并且通过Environment.SpecialFolder枚举无法使用它. 但是,新的Vista 知名文件夹 API确实使用ID定义它FOLDERID ...

  4. NS2网络模拟(4)-吞吐率图

    1: #NS2_有线部分\ForGnuplot.plot 2: 3: #gnuplot> 4: #set xtics 0, 1, 10 5: set grid 6: set xrange [0: ...

  5. 微信小程序之登录页实例

    项目效果图: 目录结构: login.wxml: <view class="container"> <view class="login-icon&qu ...

  6. 写在程序猿的困惑(特别Java程序猿)入行一年,感觉我不知道接下来该怎么办才能不断进步的,寻求翼

    入行了一年.感觉不知道接下来该怎么做才干继续进步了,求不吝赐教(V2EX) @kafka0102 :做技术能够学的东西太多了.仅仅是在不同的阶段做好不同的规划.要结合当前所做的事情去做更深入或广度的学 ...

  7. krpano全球漫游相同的声音和声音添加的场景(文章内容已移至krpano中国网站)

    请关注微信订阅号 krpano   watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdG1ob2s=/font/5a6L5L2T/fontsize/400/f ...

  8. JS判断android/IOS,并执行回调函数

    判断类型: var u = navigator.userAgent; var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') ...

  9. WPF DataGrid 的RowDetailsTemplate的使用

    <Window x:Class="DataGridExam.DataGridRowDetailsExam"        xmlns="http://schemas ...

  10. C++ Boost库简介(一些自己的感受)

    boost是一个准标准库,相当于STL的延续和扩充,它的设计理念和STL比较接近,都是利用泛型让复用达到最大化.不过对比STL,boost更加实用.STL集中在算法部分,而boost包含了不少工具类, ...