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 ...
随机推荐
- 跳跃表Skip List【附java实现】
skip list的原理 Java中的LinkedList是一种常见的链表结构,这种结构支持O(1)的随机插入及随机删除, 但它的查找复杂度比较糟糕,为O(n). 假如我们有一个有序链表如下,如果我们 ...
- xargs 参数
hadoop fs -ls /source/recommend/at_access | awk -F "/" '{print $NF}' | grep -v $(date +%Y% ...
- JVM 调优
JVM内存,由三个部分构成 年轻代+老年代+永久代: 需要调试的是年轻代和老年代 的参数: 先解释几个JVM参数: -XMx : 最大可用内存: -Xms:初始化内存: -xss: 线程栈 的大小: ...
- 如何调试delphi的Access violation at address错误
1.什么是 MAP 文件?简单地讲,MAP 文件是程序的全局符号.源文件和代码行号信息的唯一的文本表示方法,它可以在任何地方.任何时候使用,不需要有额外的程序进行支持. 2.DELPHI下生成MAP文 ...
- [Angular 2] Template property syntax
This lesson covers using the [input] syntax to change an element property such as “hidden” or “conte ...
- 网络接口 使用NSURLConnection完成Get和Post方法
网络接口 使用NSURLConnection完成Get和Post方法 什么是URL: URL就是统一资源定位器(UniformResourceLocator:URL).通俗地说,它是用来指出某一项信息 ...
- iOS 下的相册与图片处理
需求 很多公司项目中都会使用到相册,以及相机,保存图片,从相册中选取图片等等操作.本文将详细介绍该功能如何实现优化,以及使用一些优秀的第三方库来辅助完成我们的需求. photos framework ...
- Android 用MediaCodec实现视频硬解码
http://blog.csdn.net/halleyzhang3/article/details/11473961 http://www.360doc.com/content/14/0119/10/ ...
- 9.8 noip模拟试题
LazyChild黑OJ(blackoj.pas/c/cpp) LazyChild开了一家“善良OJ”.但大多数人都不知道,这其实是家黑OJ.亲爱的同学,请不要惊讶,古时候有黑店,现代为什么不能有黑O ...
- C#解leetcode 53.Maximum Subarray
Find the contiguous subarray within an array (containing at least one number) which has the largest ...