最近在看日志的一些东西,发现利用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() + "\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()就可以获取到,使用的过程中会自动添加日志到对应的文件)

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:\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!

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. setjmp和longjmp

    此文是学习 C专家编程 中的笔记. setjmp和longjmp是C语言所独有的,它们部分弥补了C语言有限的转移能力. 函数说明(来自wiki百科): int setjmp(jmp_buf env) ...

  2. PCL—关键点检测(rangeImage)低层次点云处理

    博客转载自:http://www.cnblogs.com/ironstark/p/5046479.html 关键点又称为感兴趣的点,是低层次视觉通往高层次视觉的捷径,抑或是高层次感知对低层次处理手段的 ...

  3. Luogu 4151 [WC2011]最大XOR和路径

    你谷又乱评分…… 首先发现答案只有可能是从$1$开始走到$n$,中间绕若干个环,然后使它取到的异或值最大. 这样子的话我们可以随便先取一条路径,强制选择走这条路径,然后把所有的环都丢进线性基里面去,因 ...

  4. Django框架 之 URLconf

    Django框架 之 URLconf 浏览目录 URL 摘要 Django如何处理一个请求 反向解析URL name模式 namespace模式 一.URL 1.摘要 我们要在Django项目中为应用 ...

  5. LeetCode第111题:二叉树的最小深度

    问题描述 给定一个二叉树,找出其最小深度. 最小深度是从根节点到最近叶子节点的最短路径上的节点数量. 说明: 叶子节点是指没有子节点的节点. 示例: 给定二叉树 [3,9,20,null,null,1 ...

  6. GUID介绍

    GUID介绍 GUID(Global unique identifier)全局唯一标识符,它是由网卡上的标识数字(每个网卡都有唯一的标识号)以及 CPU 时钟的唯一数字生成的的一个 16 字节的二进制 ...

  7. fiddler抓包后Jmeter实现登录接口

    登录接口测试时,先要抓取登录接口,我们使用fiddler来抓包,如下图: 然后再使用Jmeter,填写相对于的参数. 查看结果树: 关键在与抓包,搞清楚抓包的信息,可以用fiddler和火狐和谷歌.我 ...

  8. hdu3518(后缀数组)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3518 题意: 给出一个字符串, 问其中有多少字串出现了两次以上(计算次数时不能彼此覆盖, 如 &qu ...

  9. Django 实现的分页类

    后台实现的一个分页类: from django.utils.safestring import mark_safe class Page: def __init__(self, current_pag ...

  10. Django 自定义模板标签 报错django.template.exceptions.TemplateSyntaxError: '####' is not a registered tag library. Must be one of:

    我写代码遇到这个错误,但是发现程序没有写错,好像是程序有缓存,重新运行几次就好了. 自定义模板标签,可以不用写views,url直接通过自定义函数把变量传给模板. 具体实现: 1.在app下新建Pyt ...