• 【转载】JDK自带的log工具


    版权声明:本文为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() + " ";
                    }
                });
     
            } 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:LogJDKLogJDKLog_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:LogJDKLogsys.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

     

  • 相关阅读:
    c# 扩展方法奇思妙用基础篇五:Dictionary<TKey, TValue> 扩展
    c# 扩展方法奇思妙用基础篇九:Expression 扩展
    c# 扩展方法奇思妙用高级篇一:改进 Scottgu 的 "In" 扩展
    c# 扩展方法奇思妙用高级篇三:Enumerable.Cast<T> 应用
    c# 扩展方法奇思妙用高级篇二:Aggregate 扩展及其改进
    c# 扩展方法奇思妙用基础篇四:Random 扩展
    c# 扩展方法奇思妙用基础篇七:IsBetween 通用扩展
    c# 扩展方法奇思妙用基础篇三:byte 常用扩展
    c# 扩展方法奇思妙用基础篇八:Distinct 扩展
    c# 扩展方法奇思妙用基础篇 六:WhereIf 扩展
  • 原文地址:https://www.cnblogs.com/the-fool/p/11054038.html
Copyright © 2020-2023  润新知