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

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

  1. package cn.darkranger.log.logger;
  2.  
  3. import java.io.IOException;
  4. import java.text.SimpleDateFormat;
  5. import java.util.Date;
  6. import java.util.logging.ConsoleHandler;
  7. import java.util.logging.FileHandler;
  8. import java.util.logging.Formatter;
  9. import java.util.logging.Level;
  10. import java.util.logging.LogRecord;
  11. import java.util.logging.Logger;
  12.  
  13. /**
  14. * JDK自带的Log的工具类(手写,勿喷。。)
  15. *
  16. * @author DarkRanger
    * @date 20160615
  17. *
  18. */
  19. public class LogUtil {
  20.  
  21. // 正常的日期格式
  22. public static final String DATE_PATTERN_FULL = "yyyy-MM-dd HH:mm:ss";
  23. // 不带符号的日期格式,用来记录时间戳
  24. public static final String DATE_PATTERN_NOMARK = "yyyyMMddHHmmss";
  25.  
  26. /**
  27. * 为log设置等级
  28. *
  29. * @param log
  30. * @param level
  31. */
  32. public static void setLogLevel(Logger log, Level level) {
  33. log.setLevel(level);
  34. }
  35.  
  36. /**
  37. * 为log添加控制台handler
  38. *
  39. * @param log
  40. * 要添加handler的log
  41. * @param level
  42. * 控制台的输出等级
  43. */
  44. public static void addConsoleHandler(Logger log, Level level) {
  45. // 控制台输出的handler
  46. ConsoleHandler consoleHandler = new ConsoleHandler();
  47. // 设置控制台输出的等级(如果ConsoleHandler的等级高于或者等于log的level,则按照FileHandler的level输出到控制台,如果低于,则按照Log等级输出)
  48. consoleHandler.setLevel(level);
  49.  
  50. // 添加控制台的handler
  51. log.addHandler(consoleHandler);
  52. }
  53.  
  54. /**
  55. * 为log添加文件输出Handler
  56. *
  57. * @param log
  58. * 要添加文件输出handler的log
  59. * @param level
  60. * log输出等级
  61. * @param filePath
  62. * 指定文件全路径
  63. */
  64. public static void addFileHandler(Logger log, Level level, String filePath) {
  65. FileHandler fileHandler = null;
  66. try {
  67. fileHandler = new FileHandler(filePath);
  68. // 设置输出文件的等级(如果FileHandler的等级高于或者等于log的level,则按照FileHandler的level输出到文件,如果低于,则按照Log等级输出)
  69. fileHandler.setLevel(level);
  70. fileHandler.setFormatter(new Formatter() {
  71. @Override
  72. public String format(LogRecord record) {
  73.  
  74. // 设置文件输出格式
  75. return "[ " + getCurrentDateStr(DATE_PATTERN_FULL) + " - Level:"
  76. + record.getLevel().getName().substring(0, 1) + " ]-" + "[" + record.getSourceClassName()
  77. + " -> " + record.getSourceMethodName() + "()] " + record.getMessage() + "\n";
  78. }
  79. });
  80.  
  81. } catch (SecurityException e) {
  82. e.printStackTrace();
  83. } catch (IOException e) {
  84. e.printStackTrace();
  85. }
  86. // 添加输出文件handler
  87. log.addHandler(fileHandler);
  88. }
  89.  
  90. /**
  91. * 获取当前时间
  92. *
  93. * @return
  94. */
  95. public static String getCurrentDateStr(String pattern) {
  96. Date date = new Date();
  97. SimpleDateFormat sdf = new SimpleDateFormat(pattern);
  98. return sdf.format(date);
  99. }
  100. }

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

  1. package cn.darkranger.log.logger;
  2.  
  3. import java.io.File;
  4. import java.util.logging.Level;
  5. import java.util.logging.Logger;
  6.  
  7. /**
  8. * Jdk再带Logger的LoggerFactory(纯手写)
  9. *
  10. * @author DarkRanger
  11. * @date 20160615
  12. *
  13. */
  14. public class LogFactory {
  15.  
  16. // 全局Log的名称
  17. public static final String LOG_NAME = "Global";
  18.  
  19. // 这个文件路径必须存在,不存在会报错,并不会自动创建
  20. public static final String LOG_FOLDER = "E:\\Log\\JDKLog";
  21.  
  22. // log文件路径
  23. private static String log_filepath;
  24.  
  25. // 静态变量globleLog
  26. private static Logger globalLog;
  27.  
  28. static {
  29.  
  30. // 加载类的时候初始化log文件全路径,这里的文件名称是JDKLog_+时间戳+.log
         log_filepath = LOG_FOLDER + File.separator + "JDKLog_" + LogUtil.getCurrentDateStr(LogUtil.DATE_PATTERN_NOMARK)
  31. + ".log";
  32.  
  33. // 加载类的时候直接初始化globleLog
  34. globalLog = initGlobalLog();
  35. }
  36.  
  37. /**
  38. * 初始化全局Logger
  39. *
  40. * @return
  41. */
  42. public static Logger initGlobalLog() {
  43.  
  44. // 获取Log
  45. Logger log = Logger.getLogger(LOG_NAME);
  46.  
  47. // 为log设置全局等级
  48. log.setLevel(Level.ALL);
  49.  
  50. // 添加控制台handler
  51. LogUtil.addConsoleHandler(log, Level.INFO);
  52.  
  53. // 添加文件输出handler
  54. LogUtil.addFileHandler(log, Level.INFO, log_filepath);
  55.  
  56. // 设置不适用父类的handlers,这样不会在控制台重复输出信息
  57. log.setUseParentHandlers(false);
  58.  
  59. return log;
  60. }
  61.  
  62. public static Logger getGlobalLog() {
  63. return globalLog;
  64. }
  65.  
  66. }

3、写测试类JDKLogTest.Java

  1. package cn.darkranger.log.logger;
  2.  
  3. import java.io.File;
  4. import java.util.logging.Level;
  5. import java.util.logging.Logger;
  6.  
  7. import org.junit.Test;
  8.  
  9. /**
  10. * JDK自带的Log 测试
  11. *
  12. * @author DarkRanger
  13. *
  14. */
  15. public class JDKLogTest {
  16.  
  17. // 自定义的全局log(个人一般用这个记录)
  18. private static Logger log = LogFactory.getGlobalLog();
  19. // Jdk1.7以后自带的全局log(后面我添加了FileHandler,用于写入文件日志)
  20. private static Logger sysLog = Logger.getGlobal();
  21.  
  22. static {
         //由于jdk自带的全局log没有写入文件的功能,我这里手动添加了文件handler
  23. LogUtil.addFileHandler(sysLog, Level.INFO, LogFactory.LOG_FOLDER + File.separator + "sys.log");
  24. }
  25.  
  26. @Test
  27. public void test01() {
  28. // 级别从上往下依次降低
  29. log.severe("severe--> this is severe!");
  30. log.warning("warning--> this is warning!");
  31. log.info("info--> this is info!");
  32. log.config("config--> this is config!");
  33. log.fine("fine--> this is fine!");
  34. log.finer("finer--> this is finer!");
  35. log.finest("finest--> this is finest!");
  36. }
  37.  
  38. @Test
  39. public void test02() {
  40. log.info("info--> this is test02 log");
  41. }
  42.  
  43. @Test
  44. public void test03() {
  45. sysLog.info("test03 info!");
  46. }
  47.  
  48. @Test
  49. public void test04() {
  50. sysLog.info("test04 info!");
  51. }
  52. }

测试结果:

控制台输出:

六月 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的日志文件)

  1. [ 2016-06-15 15:26:37 - Level:S ]-[cn.darkranger.log.logger.JDKLogTest -> test01()] severe--> this is severe!
  2. [ 2016-06-15 15:26:37 - Level:W ]-[cn.darkranger.log.logger.JDKLogTest -> test01()] warning--> this is warning!
  3. [ 2016-06-15 15:26:37 - Level:I ]-[cn.darkranger.log.logger.JDKLogTest -> test01()] info--> this is info!
  4. [ 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的日志文件)

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

Java日志组件1---Jdk自带Logger(java.util.logging.Logger)的更多相关文章

  1. 【java】java自带的java.util.logging.Logger日志功能

    偶然翻阅到一篇文章,注意到Java自带的Logger日志功能,特地来细细的看一看,记录一下. 1.Java自带的日志功能,默认的配置 ①Logger的默认配置,位置在JRE安装目录下lib中的logg ...

  2. Java日志工具之java.util.logging.Logger

    今天总结下JDK自带的日志工具Logger,虽然它一直默默无闻,但有时使用它却比较方便.更详细的信息可以查看JDK API手册,本文只是简单示例入门. 创建Logger 我们可以使用Logger的工厂 ...

  3. 五分钟秒懂Java日志组件

    Java中有许多种日志记录方式,有些API有占位符,有些API没占位符,初学的人可能会搞不清楚这些日志组件的由来.我一开始的时候也是很懵逼的,后来一点点弄懂了于是就又了这篇文章. 在Java中进行日志 ...

  4. Java日志介绍(1)-java.util.logging.Logger

    java.util.logging.Logger是JDK自带的日志工具,其简单实现了日志的功能,不是很完善,所以在实际应用中使用的比较少.本文直接用代码演示其使用方法,文中所使用到的软件版本:Java ...

  5. 通配置文件的方式控制java.util.logging.Logger日志输出

    转自:http://zochen.iteye.com/blog/616151 简单的实现了下利用JDK中类java.util.logging.Logger来记录日志.主要在于仿照log4j方式用配置文 ...

  6. Java日志组件logback使用:加载非类路径下的配置文件并设置定时更新

    Java日志组件logback使用:加载非类路径下的配置文件并设置定时更新 摘自: https://blog.csdn.net/johnson_moon/article/details/7887449 ...

  7. java.util.logging.Logger使用详解 (转)

    http://lavasoft.blog.51cto.com/62575/184492/ ************************************************* java. ...

  8. java.util.logging.Logger使用具体解释

    java.util.logging.Logger不是什么新奇东西了,1.4就有了,但是由于log4j的存在,这个logger一直沉默着,事实上在一些測试性的代码中,jdk自带的logger比log4j ...

  9. 2.java.util.logging.Logger使用详解

    一.java.util.logging.Logger简介 java.util.logging.Logger不是什么新鲜东西了,1.4就有了,可是因为log4j的存在,这个logger一直沉默着, 其实 ...

随机推荐

  1. 怎么把网页保存为pdf文件

    不就是用chrome浏览器打印功能,然后保存为pdf就可以了吗? 对于一些结构简单的比如,RFC文档这样操作一般没什么问题,对于一些有浮动元素的网页就不好说了,必须先用chrome的审查元素把一些不必 ...

  2. 算法Sedgewick第四版-第1章基础-2.1Elementary Sortss-003比较算法及算法的可视化

    一.介绍 1. 2. 二.代码 1. package algorithms.elementary21; /*********************************************** ...

  3. java中方法的控制修饰符也分为:可访问控制符和非访问控制符两类。

    3 .方法的控制修饰符也分为:可访问控制符和非访问控制符两类. 可访问控制符有 4 种:公共访问控制符: public :私有访问控制符: private :保护访问控制符: protected :私 ...

  4. Luogu 4216 [SCOI2015]情报传递

    BZOJ 4448. 写起来很愉悦的题. 按照时间可持久化线段树,修改就在原来的地方加$1$即可,查询就直接询问$root_1 - root_{now - c - 1}$中相应的个数. 主席树维护树链 ...

  5. thinkphp目录解析

  6. 优先队列详解priority_queue .RP

    ) 删除.在最小优先队列(min priorityq u e u e)中,查找操作用来搜索优先权最小的元素,删除操作用来删除该元素;对于最大优先队列(max priority queue),查找操作用 ...

  7. 启动应用程序的Activty多种方式

    启动应用程序的Activity总共有三种方式,如下: 1>通过包名得到将启动应用的入口Activity,然后给intent附上相应的属性即可. 示例代码 public static void s ...

  8. java反射机制的粗略理解

    java反射机制: 涉及的对象:Class, Object, 函数:Class类:[forName(String className):static:getClass():public],Object ...

  9. Web开发秘方(WEB DEVELOPMENT RECIPES)[47.5MB] PDF扫描版

    不借助插件怎样在移动设备上实现动画效果?怎样快速搭建HTML电子邮箱?怎样制作跨PC和移动设备显示的应用界面?怎样利用最新的JavaScript框架提高应用的响应速度?怎样有效利用CoffeeScri ...

  10. PHP 中for循环的一个小小改进

    注意 : 1, $size这个值可以放在for循环中的第一个 ';' 前声明, 因为这个声明只会执行一次; 2, 第二个 ';' 中的内容, 会重复运行, 所以$i < $size 这个判断会每 ...