`
mwhgJava
  • 浏览: 94520 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Log4j笔记 第九章 封装Log4j

阅读更多
封装log4j要素:
1、对外不暴露log4j的包名和类名。
2、保护日志发生现场LocationInfo(日志发生时的类、方法、类文件及行数)。
3、方便的格式化日志字符串,MessageFormat.format()。
4、保持效率。
5、方便使用。

下面为部分片段,详情见附件。
更多功能,参考org.apache.log4j.logMF和org.apache.log4j.logSF。
public class Logger {

	private final org.apache.log4j.Logger logger;

	private Logger(Class<?> clazz) {
		logger = org.apache.log4j.Logger.getLogger(clazz);
	}

	private Logger() {
		logger = org.apache.log4j.Logger.getRootLogger();
	}

	public static Logger getLogger(Class<?> clazz) {
		return new Logger(clazz);
	}

	public static Logger getRootLogger() {
		return new Logger();
	}

	public void debug(Object message) {
		if (logger.isDebugEnabled()) {
			forcedLog(logger, Level.DEBUG, message);
		}
	}

	public void debug(Object message, Throwable t) {
		if (logger.isDebugEnabled()) {
			forcedLog(logger, Level.DEBUG, message, t);
		}
	}

	public void debug(String pattern, Object... arguments) {
		if (logger.isDebugEnabled()) {
			forcedLog(logger, Level.DEBUG, format(pattern, arguments));
		}
	}
	public void debug(String pattern, Throwable t, Object... arguments) {
		if (logger.isDebugEnabled()) {
			forcedLog(logger, Level.DEBUG, format(pattern, arguments), t);
		}
	}	

	public void assertLog(boolean assertion, String message) {
		if (!assertion) {
			forcedLog(logger, Level.ERROR, message);
		}
	}

	private static void forcedLog(org.apache.log4j.Logger logger, Level level, Object message) {
		logger.callAppenders(new LoggingEvent(FQCN, logger, level, message, null));
	}

	private static void forcedLog(org.apache.log4j.Logger logger, Level level, Object message, Throwable t) {
		logger.callAppenders(new LoggingEvent(FQCN, logger, level, message, t));
	}

	private static String format(String pattern, Object... arguments) {
		return MessageFormat.format(pattern, arguments);
	}

	private static final String FQCN;

	static {
		FQCN = Logger.class.getName();
	}

}

分享到:
评论
3 楼 penuel 2014-07-25  
保护日志发生现场LocationInfo(日志发生时的类、方法、类文件及行数)。
这一点还是没做到呀,按照你写的,日志还是出现定位在了封装的这个Logger里;
2 楼 mwhgJava 2011-09-09  
bluepenguin2008 写道
你好,请问这个封装后怎么用啊。
每个类还是要像下面这样声明吗?
private Logger log = Logger.getLogger(this.getClass());

和标准的Log4j的用法一样。

为了少生成Logger的实例,Logger定义为静态变量。

private static final Logger log = Logger.getLogger(xxx.class);
xxx为本类的类名。
1 楼 bluepenguin2008 2011-09-03  
你好,请问这个封装后怎么用啊。
每个类还是要像下面这样声明吗?
private Logger log = Logger.getLogger(this.getClass());

相关推荐

    Log4J学习笔记

    Log4J学习笔记 1、配置文件 2、数据库 3、封装

    J2EE学习笔记

    第九章:J2EE开发规范 218 9.1:编码规范 218 9.2:文档资料规范 218 第十章:系统安全篇: 218 10.1:java安全结构 218 10.2:通讯安全结构 222 第十一章:Hibernate、Spring简介 222 11.1:Hinernate原理概述 222 ...

    一键封装工具标准版5.0.0707

    4. 封装出错,但提示成功 由于出错时您没有按ESC退出,Newprep忽略了错误继续运行, 并对系统电源进行了更改,这样,如果再次封装可能会死机。 如出现错误,请按ESC退出,您还可以重来,否则就得重新做系统了。 5...

    利尔达NB-IoT模块参考设计手册

    利尔达NBXX-1系列 NB-IoT模块参考设计手册。内容包括模组的原理图和PCB参考设计,及模组封装。适用于硬件设计。

    精髓Oralcle讲课笔记

    4、select ename, sal*12 anuual_sal from emp; --给搜索字段更改名称(双引号 keepFormat 别名有特殊字符,要加双引号)。 5、--任何含有空值的数学表达式,最后的计算结果都是空值。 6、select ename||sal ...

    Java学习笔记-个人整理的

    {14.4}dom4j}{207}{section.14.4} {14.5}XPath}{210}{section.14.5} {14.6}apache.commons}{211}{section.14.6} {15}sqlite3}{213}{chapter.15} {16}Web基础}{215}{chapter.16} {16.1}...

    整理后java开发全套达内学习笔记(含练习)

    float 32bit, 9位有效数字,含小数(四舍五入)(小数点算一位,正负号不算) double 64bit, 18位有效数字 注:float 和 double 的小数部分不可能精确,只能近似。 比较小数时,用 double i=0.01; if ( i - 0.01 ) ...

    python第三方库学习笔记

    定义 计算机在开发过程中,代码越写越多,也就越难以维护,所以为了编写可维护的代码,我们会把函数进行分组,放在不同的文件里。...log = nnlog.Logger(file_name=’my1.log’, level=’debug’, when=’D’, bac

    asp.net知识库

    深入剖析ASP.NET组件设计]一书第三章关于ASP.NET运行原理讲述的补白 asp.net 运行机制初探(httpModule加载) 利用反射来查看对象中的私有变量 关于反射中创建类型实例的两种方法 ASP.Net应用程序的多进程模型 NET委托...

    jive.chm

    系统设计 1 jive设计思路 2 jive的工作内幕 3 Jive源代码研究 4 Jive中的设计模式 5 jive学习笔记 &lt;br&gt; 设计模式 1 大道至简-Java之23种模式一点就通 2 设计模式...

    Jive资料集

    系统设计 1 jive设计思路 2 jive的工作内幕 3 Jive源代码研究 4 Jive中的设计模式 5 jive学习笔记 &lt;br&gt; &lt;br&gt; 数据库设计 1 Jive Forums数据库说明(英文) 2 Jive KB...

    unix大全(涵盖了UNIX学习的方方面面)

    53.m rootdisk 封装和解除封装 54.A-119读书笔记-2 55.lris文件系统logging详解 56.aris中有类似windows的DLL有关的函数吗? 57.数据存储系统浅说 58.olaris 下建立可使用 pkgadd 的软体 package 59.aris 系统log...

    (Node.js笔记01)Hello&模块化&启动服务器返回页面

    Node.js中许多的操作都是通过调用模块里定义好的函数进行的,体现了封装的思想,实际例子可以看第三部分的读取文件的操作。接下来我们来写部分代码更好地理解模块化的内部。 //A.js文件:想调用B文件内的add函数 var ...

    BiocParallel:用于平行评估的生物导体设施

    BiocParallel 用于平行评估的生物导体... Windows上的MulticoreParamgithub笔记用名称提交一线git log --pretty =格式:“-%h%an:%s”修理DoparParam不会传递foreach args(特别是对.options.nws的访问以进行分块)

    PD-sniffer:USB PD嗅探器

    PD嗅探器该项目基于Google设计的PD嗅探器/分析器Twinkie。 不幸的是,Twinkie的原始设计师使用类似笔记本电脑... 主MCU从BGA封装交换为QFN,并使用4L板结构。 结果,仍然使用许多BGA器件,因为它们与原始设计没有变化。

    sysinternals 工具集合 (20090226版)

     1、 凡用过Sysprep的朋友都应该知道,如果用Sysprep来重新封装系统,在重启之后会要求我们重新输入产品序列号和重新添加用户,对于企业来说很多时候是不希望员工得到产品ID的,让非IT职员来完成系统任务也很有可能...

Global site tag (gtag.js) - Google Analytics