【转载】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() + "\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()就可以获取到,使用的过程中会自动添加日志到对应的文件)
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:\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!
声明
欢迎转载,但请保留文章原始出处
作者:Jaiky_杰哥
出处:http://blog.csdn.net/jaikydota163/article/details/52783588
【转载】JDK自带的log工具的更多相关文章
- [转载]JDK自带的实用工具——native2ascii.exe
做Java开发的时候,常常会出现一些乱码,或者无法正确识别或读取的文件,原因是编码方式的不一致.native2ascii是sun java sdk提供的一个工具.用来将别的文本类文件(比如*.txt, ...
- tomcat配置https–采用JDK自带的keytool工具生成证书
转自:http://blog.csdn.net/huangxinyu_it/article/details/41693633 有关http与https的区别请看<浅谈http与https的区别( ...
- JDK自带VM分析工具jps,jstat,jmap,jconsole
一.概述 SUN 的JDK中的几个工具,非常好用.秉承着有免费,不用商用的原则.以下简单介绍一下这几种工具.(注:本文章下的所有工具都存在JDK5.0以上版本的工具集里,同javac一样,不须特意安装 ...
- jdk 自带命令行工具
jps工具 虚拟机进程状况工具 工具主要选项 jstat: 虚拟机统计信息监视工具 jinfo: Java配置信息工具 jinfo( Configuration Info for Java) 的作用是 ...
- JDK自带反编译工具javap
在JDK的bin文件夹下,有许多自带工具: javap就是其中的一个,对应为 javap.exe javap可反编译查看Java编译器编译生成的字节码文件, 语法: javap [ options ] ...
- 使用JDK自带的keytool工具生成证书
一.keytool 简介 keytool 是java用于管理密钥和证书的工具,它使用户能够管理自己的公钥/私钥对及相关证书,用于(通过数字签名)自我认证(用户向别的用户/服务认证自己)或数据完整性以及 ...
- JDK自带的native2ascii工具介绍
背景:在做Java开发的时候,常常会出现一些乱码,或者无法正确识别或读取的文件,比如常见的validator验证用的消息资源(properties)文件就需要进行Unicode重新编码.原因是java ...
- 死锁排查的小窍门 --使用jdk自带管理工具jstack
本文版权归 远方的风lyh和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 开发时间久了,难免会写出一些一些死锁的代码,自己明明调用该方法可该方法就是不执行.不进该方法.日志也不打 ...
- jdk自带监控程序jvisualvm的使用
监控小程序的配置 生产环境tomcat的配置 编辑应用所在的tomcat服务器下的bin目录下的catalina.sh文件,修改如下: 配置如下内容: export JAVA_OPTS="- ...
随机推荐
- Android framework召回(3)binder使用和IBinder BpRefbase IInterface INTERFACE 之间的关系
status_t AudioSystem::setStreamVolumeIndex(audio_stream_type_t stream, int index, audio_devices_t de ...
- 改变TLabel字型和颜色(Styled特性高于自身特性,李维的博客)
最近收到几位使用者的来信都是和如何改变FireMonkey TLabel组件的字型和颜色, 这几位使用者都是直接改变TextSettings特性中的Font子特性但却无法改变字型和颜色, 因此来信询问 ...
- 四大天王变形金刚(SqlHelper)
1.的基础上推出 SqlHelper是一个基于·NET Framework的数据库操作组件.组件中包括数据库操作方法.SqlHelper用于简化你反复的去写那些数据库连接(SqlConnect ...
- springboot 修改连接地址和端口
spring boot 默认 http://localhost:8080 修改为本地IP地址和修改端口在application.properties中添加以下: server.port=9090 se ...
- Qt 创建圆角、无边框、有阴影、可拖动的窗口 good
程序窗口的边框,标题栏等是系统管理的,Qt 不能对其进行定制,为了实现定制的边框.标题栏.关闭按钮等,需要把系统默认的边框.标题栏去掉,然后使用 Widget 来模拟它们.这里介绍使用 QSS + Q ...
- XF 彩色矩形块
<?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns="http:/ ...
- WPF关于控件 父级控件,子级控件,控件模板中的控件,等之间的相互访问
原文:WPF关于控件 父级控件,子级控件,控件模板中的控件,等之间的相互访问 1,在菜单中访问 弹出菜单的控件 var mi = sender as MenuItem;//菜单条目 MenuItem ...
- centos搭建免费的ssl证书,大部分浏览器均支持!(let’s encrypt 的使用记录)
安装certbot wget https://dl.eff.org/certbot-auto chmod a+x certbot-auto 然后就是通过这个脚本获取证书,安装前先将NGINX 停一下. ...
- 浅谈.NET(C#)与Windows用户账户信息的获取
原文:浅谈.NET(C#)与Windows用户账户信息的获取 目录 1. 用户账户名称 - 使用Environment类 2. 用户账户信息 - 使用WindowsIdentity和IdentityR ...
- 龙芯GO!龙芯平台上构建Go语言环境指南
龙芯软件生态系列——龙芯GO!龙芯平台上构建Go语言环境指南2016-07-05 龙芯中科1初识Go语言Go语言是Google公司于2009年正式推出的一款开源的编程语言,是由Robert Gries ...