封装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();
}
}
分享到:
相关推荐
Log4J学习笔记 1、配置文件 2、数据库 3、封装
第九章:J2EE开发规范 218 9.1:编码规范 218 9.2:文档资料规范 218 第十章:系统安全篇: 218 10.1:java安全结构 218 10.2:通讯安全结构 222 第十一章:Hibernate、Spring简介 222 11.1:Hinernate原理概述 222 ...
4. 封装出错,但提示成功 由于出错时您没有按ESC退出,Newprep忽略了错误继续运行, 并对系统电源进行了更改,这样,如果再次封装可能会死机。 如出现错误,请按ESC退出,您还可以重来,否则就得重新做系统了。 5...
利尔达NBXX-1系列 NB-IoT模块参考设计手册。内容包括模组的原理图和PCB参考设计,及模组封装。适用于硬件设计。
4、select ename, sal*12 anuual_sal from emp; --给搜索字段更改名称(双引号 keepFormat 别名有特殊字符,要加双引号)。 5、--任何含有空值的数学表达式,最后的计算结果都是空值。 6、select ename||sal ...
{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}...
float 32bit, 9位有效数字,含小数(四舍五入)(小数点算一位,正负号不算) double 64bit, 18位有效数字 注:float 和 double 的小数部分不可能精确,只能近似。 比较小数时,用 double i=0.01; if ( i - 0.01 ) ...
定义 计算机在开发过程中,代码越写越多,也就越难以维护,所以为了编写可维护的代码,我们会把函数进行分组,放在不同的文件里。...log = nnlog.Logger(file_name=’my1.log’, level=’debug’, when=’D’, bac
深入剖析ASP.NET组件设计]一书第三章关于ASP.NET运行原理讲述的补白 asp.net 运行机制初探(httpModule加载) 利用反射来查看对象中的私有变量 关于反射中创建类型实例的两种方法 ASP.Net应用程序的多进程模型 NET委托...
系统设计 1 jive设计思路 2 jive的工作内幕 3 Jive源代码研究 4 Jive中的设计模式 5 jive学习笔记 <br> 设计模式 1 大道至简-Java之23种模式一点就通 2 设计模式...
系统设计 1 jive设计思路 2 jive的工作内幕 3 Jive源代码研究 4 Jive中的设计模式 5 jive学习笔记 <br> <br> 数据库设计 1 Jive Forums数据库说明(英文) 2 Jive KB...
53.m rootdisk 封装和解除封装 54.A-119读书笔记-2 55.lris文件系统logging详解 56.aris中有类似windows的DLL有关的函数吗? 57.数据存储系统浅说 58.olaris 下建立可使用 pkgadd 的软体 package 59.aris 系统log...
Node.js中许多的操作都是通过调用模块里定义好的函数进行的,体现了封装的思想,实际例子可以看第三部分的读取文件的操作。接下来我们来写部分代码更好地理解模块化的内部。 //A.js文件:想调用B文件内的add函数 var ...
BiocParallel 用于平行评估的生物导体... Windows上的MulticoreParamgithub笔记用名称提交一线git log --pretty =格式:“-%h%an:%s”修理DoparParam不会传递foreach args(特别是对.options.nws的访问以进行分块)
PD嗅探器该项目基于Google设计的PD嗅探器/分析器Twinkie。 不幸的是,Twinkie的原始设计师使用类似笔记本电脑... 主MCU从BGA封装交换为QFN,并使用4L板结构。 结果,仍然使用许多BGA器件,因为它们与原始设计没有变化。
1、 凡用过Sysprep的朋友都应该知道,如果用Sysprep来重新封装系统,在重启之后会要求我们重新输入产品序列号和重新添加用户,对于企业来说很多时候是不希望员工得到产品ID的,让非IT职员来完成系统任务也很有可能...