Logger的问题?

问题描述

请javaeye的同仁帮我解释一下:private Logger log=Logger.getLogger(this.getClass());这句代码有什么作用。我不懂,this.getClass()得到什么?Logger.getLogger(this.getClass())又得到什么,这样写,有什么好处?

解决方案

this.getClass()得到什么? this 表示当前对象的引用;getClass() 是 java.lang.Object 中的方法,它返回一个对象的运行时类;this.getClass() 就是返回当前对象的运行时类。Logger.getLogger(this.getClass())又得到什么?他得到一个Logger对象,这个Logger将监视this.getClass()这个运行时类,这个运行时类里面你可能创建了log.info(""), log.debug(""),……等语句,那么这些语句就会根据你预先定义的Logger级别来输出你的日志。就跟你写System.out.print("")一样,不同的是Logger可以根据需要按级别进行日志输出控制。(当然这只是一方面)Logger.getLogger(this.getClass())这样写,有什么好处?这样一来你只需要在基类中写一行代码就可以了,子类可以直接使用,这也是复用的原则。如果你有一个类A,你可以在A类的开始这么写Logger log=Logger.getLogger(A.class)这就定死了这个Logger只监视A类本身如果B类继承A类,你创建B类对象时,上面创建的log对象对B是不起作用的。这就就是hard code.而Logger.getLogger(this.getClass())就不同,你创建B对象时,this就是B对象的引用了,见下列代码:package com.zhaipuhong.j2se.keywords;public class ThisKeywordsA {protected String className = this.getClass().toString();public ThisKeywordsA(){System.out.println("ThisKeywordsA className == " + className);}}package com.zhaipuhong.j2se.keywords;public class ThisKeywordsB extends ThisKeywordsA{public ThisKeywordsB(){System.out.println("ThisKeywordsB className == " + className);}/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubThisKeywordsB b = new ThisKeywordsB();}} 运行结果:ThisKeywordsA className == class com.zhaipuhong.j2se.keywords.ThisKeywordsBThisKeywordsB className == class com.zhaipuhong.j2se.keywords.ThisKeywordsB由于B继承A,A对象首先被创建(请不要考虑抽象类和接口^_^)然后作为B对象的字对象创建B 对象. 此时的Logger就是B对象的一部分,可以为B对象所用。
解决方案二:
1.this.getClass()得到的是一个Class类型的对象,这个getClass方法是Objct里的方法,是所有类都有的2.Logger.getLogger(B.class);得到的是一个用当前类实例化的Logger对象,用来在输出日志的时候打印出当前的类名
解决方案三:
第一块代码应该是:class A{private Logger log=Logger.getLogger(A.class); }class B extends A{private Logger log=Logger.getLogger(B.class); }B中应该是Logger.getLogger(B.class), 前面的写错了
解决方案四:
1, 应该是受保护的吧:protected Logger log = Logger.getLogger(this.getClass())2,这种写法一般是用来给有继承关系的类使用的, 一般写法如下:class A{private Logger log=Logger.getLogger(A.class); }class B extends A{private Logger log=Logger.getLogger(A.class); }而用楼主提到的写法:class A{protected Logger log=Logger.getLogger(this.getClass());}class B extends A{}则可以共用log, 这里的this.getClass()就拿当前类型的运行时类,因为B继承A, 所以B中的this.getClass()就相当于B.class , 而A中的就相当于A.class

时间: 2024-12-20 21:17:48

Logger的问题?的相关文章

CMS系统中学习到的快速将System.out.println全部转化为logger

Logger log = Logger.getLogger(CmsSendXML.class); 然后replaceALL System.out.println 为 log.info

自定义封装Logger demo 小测试

1>  log4j.properties 文件: log4j.rootLogger=DEBUG,MINA,file ### 控制台 ### log4j.appender.stdout = org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target = System.out log4j.appender.stdout.layout = org.apache.log4j.PatternLayout log4j.appender.stdo

android-Android 5.0 Logger模块问题

问题描述 Android 5.0 Logger模块问题 在Android5.0之前Logger模块会在/dev/log下创建四个设备文件,但在Android5.0中/dev下没有了,那把四个设备文件放倒哪去了

Android的logger机制分析

分析安卓的Logger机制 一.概述 Logger机制是在Android系统中提供的一个轻量级的日志系统,这个日志系统是以驱动程序的形式在内核空间实现的,在用户空间分别提供了Java接口和C/C++接口来使用这个日志系统,使用的接口取决于编写的是Android应用程序还是系统组件. 下面我准备从应用开发和源码分析两部分来分析安卓的Logger机制. 二.从Android应用程序开发角度看Logger机制 这一部分将简要地介绍一下在Android应用程序开发中Log的使用方法 2.1概述  在程序

too many open files-Log4J中Logger如何关闭IO流

问题描述 Log4J中Logger如何关闭IO流 在项目由于日志需要对日志进行扩展,根据交易号和日期生成logger对象放入队列中,每天会清除之前的日志对象,刚开始没有发现问题,大约到了1个月左右,生产中报了java.net.SocketException:too many open files异常,首先整个系统中除了日志外,只有读取配置文件的两个本地IO操作,其他的是网络IO,其次在早上没有大规模并发请求,除了心跳报文外,其他无请求,综合上述可以将问题定位在日志上.仔细想每天我只是把日志对象从

java-log4j对于一个logger对象动态设置日志文件路径

问题描述 log4j对于一个logger对象动态设置日志文件路径 如题,比如我想对logger对象log动态设置日志输出的路径,路径分别是Alog.log和ABlog.log,但是我的程序每次在向ABlog.log中输出日志的同时都会向Alog.log也写日志 解决方案 log4j日志文件路径设置

设计一个Logger类

需求:想要实现一个Logger可以以以下方式使用: Logger log("2013-03-05.log"); log << "This is a logger test" << endl; log << "value of Temp = " << temp << endl; log << "Array[" << index <<

android Logger 一二三

我们在开发Android应用的过程中可以很方便地使用Log信息来调试程序,这都归功于Android的Logger驱动为用户层提供的Log支持.无论是底层的源代码还是上层的应用,我们都可以使用Logger这个日志设备来进行调试.Logger一共包括三个设备节点,它们分别是: /dev/log/main /dev/log/event /dev/log/radio 其驱动程序的实现源文件位于: include/linux/logger.h include/linux/logger.c 下面将对该驱动的

&quot;No appenders found for logger&quot; and &quot;Please configure log4j properly&quot;

Why do I see a warning about "No appenders found for logger" and "Please configure log4j properly"?This occurs when the default configuration files log4j.properties and log4j.xml can not be found and the application performs no explici

System.out.println() 和 log4j 的 Logger 循环输出100万次。

log4j配置参考: http://javapub.iteye.com/blog/866664 循环代码如下 system循环.       耗时,11691 package com; public class TestStaticClassMain { public static void main(String[] args) { long start = System.currentTimeMillis() ; for (int i = 0; i < 1000000; i++) { Sys