Logger之Logger.getLogger(CLass)
之前一直在使用System.out.println()来调试.但是用这种方式开发项目部署到生产环境,会因为众多的控制台输出降低应用的性能.这时候Log4J就成为可平衡开发和部署应用的利器了.
在项目中使用Log4J并不是一件困难的事情,简单粗暴的方式就是在每个类A中声明一个Logger私有属性
- private static Logger logger = Logger.getLogger(A.class);
private static Logger logger = Logger.getLogger(A.class);
这样虽然简单,但是带来有两个问题:
1.增加系统开销-每个使用Log4J的类都增加了对象属性.
2.麻烦:每个使用Logger的类都要重复声明上面Logger对象.
其实不难发现可以使用重构手法,声明一个公用的类Log4jUtils,处理Logger的公共操作.
不过呢,问题不这么简单.首先要解决一个问题,Logger.getLogger(A.class)中的A.class有什么用?A.class可以不可以瞎写?
先做个试验,先简单配置log4j.properties文件
- #日志级别,输出目的地
- log4j.rootLogger=debug,stdout
- log4j.appender.stdout=org.apache.log4j.Conso
- leAppender
- log4j.appender.stdout.Target=System.out
- log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
- #输出格式
- log4j.appender.stdout.layout.ConversionPattern=%c %d{ABSOLUTE} %5p %c{1}:%L - %m%n

#日志级别,输出目的地
log4j.rootLogger=debug,stdout log4j.appender.stdout=org.apache.log4j.Conso
leAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#输出格式
log4j.appender.stdout.layout.ConversionPattern=%c %d{ABSOLUTE} %5p %c{1}:%L - %m%n
新建一个测试类
- import org.apache.log4j.Logger;
- /**
- * Created by li on 2015/5/24.
- */
- public class LoggerTest {
- private static Logger logger = Logger.getLogger(Object.class);
- public static void main(String[] args) {
- logger.debug("Hello World!");
- }
- }

import org.apache.log4j.Logger; /**
* Created by li on 2015/5/24.
*/ public class LoggerTest {
private static Logger logger = Logger.getLogger(Object.class); public static void main(String[] args) {
logger.debug("Hello World!");
}
}
查看结果:
结合log4j.properties配置的
- log4j.appender.stdout.layout.ConversionPattern=%c %d{ABSOLUTE} %5p %c{1}:%L - %m%n

log4j.appender.stdout.layout.ConversionPattern=%c %d{ABSOLUTE} %5p %c{1}:%L - %m%n
不难知道%c这时候将LoggerTest类的代码修改
- private static Logger logger = Logger.getLogger(LoggerTest.class);

private static Logger logger = Logger.getLogger(LoggerTest.class);
运行结果变为:
要的结果终于出现了.至此,明白了getLogger(class)的参数用途:追踪产生此日志的类.
现在就出现了新的问题:若要使用一个类Log4jUtils来专门处理Logger对象的声明等操作,那么如何处理getLogger(class)的参数问题?
也就是如何在Log4jUtils得到调用logger对象的类型.
解决这个困难可以是使用Java的反射机制
看下面的代码:
类Log4jUtils:
- /**
- * Created by li on 2015/5/23.
- */
- public class Log4JUtils{
- private static Logger logger = null;
- public static Logger getLogger(){
- if (null == logger){
- //Java8 废弃了Reflection.getCallerClass()
- logger = Logger.getLogger(Reflection.getCallerClass().getName());
- logger.debug("调用者类名"+Reflection.getCallerClass().getName());
- }
- return logger;
- }
- }

/**
* Created by li on 2015/5/23.
*/
public class Log4JUtils{ private static Logger logger = null; public static Logger getLogger(){
if (null == logger){
//Java8 废弃了Reflection.getCallerClass()
logger = Logger.getLogger(Reflection.getCallerClass().getName());
logger.debug("调用者类名"+Reflection.getCallerClass().getName());
}
return logger;
}
}
修改类LoggerTest的代码:
- /**
- * Created by li on 2015/5/24.
- */
- public class LoggerTest {
- // private static Logger logger = Logger.getLogger(LoggerTest.class);
- public static void main(String[] args) {
- Log4JUtils.getLogger().debug("Hello World!");
- }
- }

/**
* Created by li on 2015/5/24.
*/ public class LoggerTest {
// private static Logger logger = Logger.getLogger(LoggerTest.class); public static void main(String[] args) {
Log4JUtils.getLogger().debug("Hello World!");
}
}
运行结果:
看到这个结果就很爽了.以后项目就可以放弃使用System.out.println()打印语句了.
Logger之Logger.getLogger(CLass)的更多相关文章
- logger.debug,logger.info,logger.warn,logger.error,logger.fatal的区别
logger.debug,logger.info,logger.warn,logger.error,logger.fatal的区别 logger.debug,logger.info,logger.wa ...
- Logger之Logger.getLogger(CLass)技巧代替system.out.print
---恢复内容开始--- 尊重原创:http://www.cnblogs.com/zxf330301/p/5876117.html 之前一直在使用System.out.println()来调试.但是用 ...
- java中的 private Logger log=Logger.getLogger(this.getClass());
this.getClass()得到什么? this 表示当前对象的引用: getClass() 是 java.lang.Object 中的方法,它返回一个对象的运行时类: this.getClass( ...
- Logger.getLogger()和LogFactory.getLog()的区别
第一.Logger.getLogger()和LogFactory.getLog()的区别 1.Logger.getLogger()是使用log4j的方式记录日志: 2.LogFactory.getLo ...
- java中Logger.getLogger(Test.class)
java中Logger.getLogger(Test.class) log4的使用方法: log4是具有日志记录功能,主要通过一个配置文件来对程序进行监测有两种配置方式:一种程序配置,一种文件配置有三 ...
- java中Logger.getLogger(Test.class),即log4日志的使用
log4的使用方法: log4是具有日志记录功能,主要通过一个配置文件来对程序进行监测有两种配置方式:一种程序配置,一种文件配置有三个主要单元要了解,Logger,appender,layout. l ...
- Java日志管理:Logger.getLogger()和LogFactory.getLog()的区别(详解Log4j)
Java日志管理:Logger.getLogger()和LogFactory.getLog()的区别(详解Log4j) 博客分类: Java综合 第一.Logger.getLogger()和Log ...
- org.apache.log4j.Logger详解
org.apache.log4j.Logger 详解 1. 概述 1.1. 背景 在应用程序中添加日志记录总的来说基于三个目的 :监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工 ...
- Java程序日志:java.util.logging.Logger类
一.Logger 的级别 比log4j的级别详细,全部定义在java.util.logging.Level里面.各级别按降序排列如下:SEVERE(最高值)WARNINGINFOCONFIGFINEF ...
随机推荐
- Rules
我们之前处理异常的时候用到过Rules,当然还有很多其他规则.Rules允许弹性的添加或者重定义测试方法的行为.测试者可以重复使用或者扩展下面的某一个Rules,也可以写一个属于自己的规则. 这里先展 ...
- flumeng-kafka-plugin
github 参考地址:https://github.com/beyondj2ee/flumeng-kafka-plugin/tree/master/flumeng-kafka-plugin /* * ...
- zookeeper 集群 Cannot open channel to X at election address Error contacting service. It is probably not running.
zookeeper集群 启动 1.问题现象. 启动每一个都提示 STARTED 但是查看 status时全部节点都报错 [root@ip-172-31-19-246 bin]# sh zkSer ...
- JAX-WS + Spring 开发webservice
通过几天的时间研究了下使用jax-ws来开发webservice,看了网上的一些资料总结出jax-ws的开发大概分为两种. 以下项目使用的spring3.0,jar包可以到官网下载 第一种:使用独立的 ...
- Mono For Android离线激活
我们之前创建过Mono For Android的开发环境,但是使用一段时间后就说明证书过期,那如何破解呢? 但我说的这个也就只能使用免费的证书. 首先下载免费的证书,monoandroid.licx, ...
- Qt 学习之路 :访问网络(4)
前面几章我们了解了如何使用QNetworkAccessManager 访问网络.在此基础上,我们已经实现了一个简单的查看天气的程序.在这个程序中,我们使用QNetworkAccessManager进行 ...
- UNDERSTANDING VOLATILE VIA EXAMPLE--reference
We have spent last couple of months stabilizing the lock detection functionality in Plumbr. During t ...
- Android - 软件自动更新的实现(转)
在客户端实现更新操作 涉及到三个技术: 1.xml文件的解析 2.HttpURLConnection连接 3.文件流I/O 这里创建一个解析xml文件的服务类:ParXmlService.java p ...
- BeautifulSoup在Windows下安装(running 2to3)
在windows下安装beautifulsoup经常会出现说是在python3下无法运行Python2的代码,这时需要将Python下的tool下的scripts目录添加到环境变量中,然后运行2to3 ...
- java邮件客户端
/*** *邮件VO **/package net.jk.util.email.vo; import java.util.Date; import java.util.List; import net ...