• Java日志组件1---Jdk自带Logger(java.util.logging.Logger)


    最近在看日志的一些东西,发现利用JDK自带的log也可以简单的实现日志的输出,将日志写入文件的过程记录如下:

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

    package cn.darkranger.log.logger;
    
    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;
    
    /**
     * JDK自带的Log的工具类(手写,勿喷。。)
     * 
     * @author DarkRanger
    * @date 20160615 *
    */ 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()就可以获取到,使用的过程中会自动添加日志到对应的文件)

    package cn.darkranger.log.logger;
    
    import java.io.File;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    
    /**
     * Jdk再带Logger的LoggerFactory(纯手写)
     * 
     * @author DarkRanger
     * @date 20160615
     *
     */
    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

    package cn.darkranger.log.logger;
    
    import java.io.File;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    
    import org.junit.Test;
    
    /**
     * JDK自带的Log 测试
     * 
     * @author DarkRanger
     *
     */
    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!

  • 相关阅读:
    查找一段信号的累加峰值---verilog
    AXI_stream接口时序温习
    QAM调制---Verilog代码
    数据交织模块---Verilog代码
    卷积编码后的删余模块---Verilog代码
    数据发送模块---基于地址的检测(verilog代码)
    短训练序列---Verilog代码
    长训练序列---verilog代码
    数据扰码器---Verilog代码
    卷积编码器---Verilog代码
  • 原文地址:https://www.cnblogs.com/wrcold520/p/5587680.html
Copyright © 2020-2023  润新知