Logger之Logger.getLogger(CLass)
来源:互联网 发布:js数组转字符串 join 编辑:程序博客网 时间:2024/05/21 11:36
之前一直在使用System.out.println()来调试.但是用这种方式开发项目部署到生产环境,会因为众多的控制台输出降低应用的性能.这时候Log4J就成为可平衡开发和部署应用的利器了.
在项目中使用Log4J并不是一件困难的事情,简单粗暴的方式就是在每个类A中声明一个Logger私有属性
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,stdoutlog4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.Target=System.outlog4j.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!"); }}
查看结果:
log4j.appender.stdout.layout.ConversionPattern=%c %d{ABSOLUTE} %5p %c{1}:%L - %m%n不难知道%c输出所属的类目,通常就是所在类的全名。但是我们追踪的其实是LoggerTest类,结果返回的却是java.lang.Object,简直就是误导.
这时候将LoggerTest类的代码修改
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; }}
修改类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!"); }}运行结果:
看到这个结果就很爽了.以后项目就可以放弃使用System.out.println()打印语句了.
1 0
- Logger之Logger.getLogger(CLass)
- Logger之Logger.getLogger(CLass)
- Logger之Logger.getLogger(CLass)
- Logger.getLogger()
- java中Logger.getLogger(Test.class)
- java中Logger.getLogger(Test.class)
- java中Logger.getLogger(Test.class)
- java中Logger.getLogger(Test.class)
- Logger logger = Logger.getLogger(this.getClass())
- Logger.getLogger(字符串)
- Logger.getLogger和 LogFactory.getLog
- Logger.getLogger与LogFactory.getLog
- Logger.getLogger与LogFactory.getLog
- Logger.getLogger与LogFactory.getLog
- Logger.getLogger和 LogFactory.getLog
- Logger.getLogger和 LogFactory.getLog
- Logger LOG = LoggerFactory.getLogger()
- java中Logger.getLogger(xx)
- sun.misc.BASE64Encoder找不到jar包的解决方法
- Java:io流写入文件的四种实现方式的效率对比
- 5 KEYS TO WEB APP TOKEN AUTHENTICATION
- 第三次作业:网络编程
- 女神教你字符串——AC不只是一个梦想
- Logger之Logger.getLogger(CLass)
- Java加密技术(四)——非对称加密算法RSA(推荐)
- 解读ASP.NET 5 & MVC6系列:初识项目
- sqlAlchemy学习手册(一):sqlAlchemy的安装
- 黑马程序员--#pragma mark作用
- (10.1.6)极简主义
- DNS的配置与正向查找的简单操作
- 黑马程序员——【Java反射学习】Class类的使用
- Spring (1) -- For Simplify Java Development