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() + "\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)的更多相关文章
- 【java】java自带的java.util.logging.Logger日志功能
偶然翻阅到一篇文章,注意到Java自带的Logger日志功能,特地来细细的看一看,记录一下. 1.Java自带的日志功能,默认的配置 ①Logger的默认配置,位置在JRE安装目录下lib中的logg ...
- Java日志工具之java.util.logging.Logger
今天总结下JDK自带的日志工具Logger,虽然它一直默默无闻,但有时使用它却比较方便.更详细的信息可以查看JDK API手册,本文只是简单示例入门. 创建Logger 我们可以使用Logger的工厂 ...
- 五分钟秒懂Java日志组件
Java中有许多种日志记录方式,有些API有占位符,有些API没占位符,初学的人可能会搞不清楚这些日志组件的由来.我一开始的时候也是很懵逼的,后来一点点弄懂了于是就又了这篇文章. 在Java中进行日志 ...
- Java日志介绍(1)-java.util.logging.Logger
java.util.logging.Logger是JDK自带的日志工具,其简单实现了日志的功能,不是很完善,所以在实际应用中使用的比较少.本文直接用代码演示其使用方法,文中所使用到的软件版本:Java ...
- 通配置文件的方式控制java.util.logging.Logger日志输出
转自:http://zochen.iteye.com/blog/616151 简单的实现了下利用JDK中类java.util.logging.Logger来记录日志.主要在于仿照log4j方式用配置文 ...
- Java日志组件logback使用:加载非类路径下的配置文件并设置定时更新
Java日志组件logback使用:加载非类路径下的配置文件并设置定时更新 摘自: https://blog.csdn.net/johnson_moon/article/details/7887449 ...
- java.util.logging.Logger使用详解 (转)
http://lavasoft.blog.51cto.com/62575/184492/ ************************************************* java. ...
- java.util.logging.Logger使用具体解释
java.util.logging.Logger不是什么新奇东西了,1.4就有了,但是由于log4j的存在,这个logger一直沉默着,事实上在一些測试性的代码中,jdk自带的logger比log4j ...
- 2.java.util.logging.Logger使用详解
一.java.util.logging.Logger简介 java.util.logging.Logger不是什么新鲜东西了,1.4就有了,可是因为log4j的存在,这个logger一直沉默着, 其实 ...
随机推荐
- 怎么把网页保存为pdf文件
不就是用chrome浏览器打印功能,然后保存为pdf就可以了吗? 对于一些结构简单的比如,RFC文档这样操作一般没什么问题,对于一些有浮动元素的网页就不好说了,必须先用chrome的审查元素把一些不必 ...
- 算法Sedgewick第四版-第1章基础-2.1Elementary Sortss-003比较算法及算法的可视化
一.介绍 1. 2. 二.代码 1. package algorithms.elementary21; /*********************************************** ...
- java中方法的控制修饰符也分为:可访问控制符和非访问控制符两类。
3 .方法的控制修饰符也分为:可访问控制符和非访问控制符两类. 可访问控制符有 4 种:公共访问控制符: public :私有访问控制符: private :保护访问控制符: protected :私 ...
- Luogu 4216 [SCOI2015]情报传递
BZOJ 4448. 写起来很愉悦的题. 按照时间可持久化线段树,修改就在原来的地方加$1$即可,查询就直接询问$root_1 - root_{now - c - 1}$中相应的个数. 主席树维护树链 ...
- thinkphp目录解析
- 优先队列详解priority_queue .RP
) 删除.在最小优先队列(min priorityq u e u e)中,查找操作用来搜索优先权最小的元素,删除操作用来删除该元素;对于最大优先队列(max priority queue),查找操作用 ...
- 启动应用程序的Activty多种方式
启动应用程序的Activity总共有三种方式,如下: 1>通过包名得到将启动应用的入口Activity,然后给intent附上相应的属性即可. 示例代码 public static void s ...
- java反射机制的粗略理解
java反射机制: 涉及的对象:Class, Object, 函数:Class类:[forName(String className):static:getClass():public],Object ...
- Web开发秘方(WEB DEVELOPMENT RECIPES)[47.5MB] PDF扫描版
不借助插件怎样在移动设备上实现动画效果?怎样快速搭建HTML电子邮箱?怎样制作跨PC和移动设备显示的应用界面?怎样利用最新的JavaScript框架提高应用的响应速度?怎样有效利用CoffeeScri ...
- PHP 中for循环的一个小小改进
注意 : 1, $size这个值可以放在for循环中的第一个 ';' 前声明, 因为这个声明只会执行一次; 2, 第二个 ';' 中的内容, 会重复运行, 所以$i < $size 这个判断会每 ...