- 浏览: 489699 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
xuezhongyu01:
这个翻译是错误的,transfer是烙印或者印记的意思,所以是 ...
REST介绍 -
fanqi77:
例子中没有体现出 不同自定义exception的用途和区别
Jersey框架的统一异常处理机制 -
redhacker:
sz7250 写道恩。不错,初步了解一下rest设计概念。谢谢 ...
REST介绍 -
redhacker:
u012824908 写道运行出来以后,提示信息出现乱码,该如 ...
Jersey框架的统一异常处理机制 -
sz7250:
恩。不错,初步了解一下rest设计概念。
REST介绍
通常情况下,log4j的日志格式由它的layout组件来管理,最典型的一个日志格式的定义是这样的:
在log4j.propties文件里这样写:
最终我们产生的日志如下:
但是,在实际项目中,仅仅记录上述信息是不够的,比如,我们有这样一个需求:
1、集群状态下,我们一个应用部署了多个web server,我们希望在日志里打印出当前日志时哪台服务器上产生的。
2、为了进行审计,我们需要在日志中记录业务操作员的工号信息。
对于上述两个需求,很多同学可能在想,这还不简单吗,只要将log4j的Logger类进行简单封装,在messge部分就可以了,如果不分装也可以啊,可如下去记录这些信息:
事实上上述做法不是最巧妙的,也不是log4j所设计的标准做法。通过对log4j源码的分析,我们发现可以用如下方式扩转日志信息的格式:
然后,我们的layout格式写成如下方式,就可以达到扩展的目的:
使用%X{...}读取设置在LoggingEvent实例中的属性。这种扩展是巧妙的,优雅的,符合log4j设计者的初衷的。
基于上面的分析,我们可以进行一个封装,其代码如下:
使用这个封装,我们可以自由的对LoggingEvent类的实例属性进行控制。
下面是封装类的使用示例:
最终的日志格式如下:
在log4j.propties文件里这样写:
log4j.appender.com.xxx.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} | %l | %p | %m%n
最终我们产生的日志如下:
2011-06-21 09:55:09 | com.jl.mi.Test.main(Test.java:22) | INFO | test message!
但是,在实际项目中,仅仅记录上述信息是不够的,比如,我们有这样一个需求:
1、集群状态下,我们一个应用部署了多个web server,我们希望在日志里打印出当前日志时哪台服务器上产生的。
2、为了进行审计,我们需要在日志中记录业务操作员的工号信息。
对于上述两个需求,很多同学可能在想,这还不简单吗,只要将log4j的Logger类进行简单封装,在messge部分就可以了,如果不分装也可以啊,可如下去记录这些信息:
Logger logger = MyLogger.getLogger(Test.class); logger.info(getUserCode() + " | " + getSvrName() " | test customization log info!");
事实上上述做法不是最巧妙的,也不是log4j所设计的标准做法。通过对log4j源码的分析,我们发现可以用如下方式扩转日志信息的格式:
LoggingEvent event = new LoggingEvent(JLogger.class.getName(), logger, level, msg, e); event.setProperty(Constant.MGD_SVR_NAME, Util.getMgdSvrName()); event.setProperty(Constant.USER_CODE, Util.getUserCode());
然后,我们的layout格式写成如下方式,就可以达到扩展的目的:
log4j.appender.y_svr_logout.layout.ConversionPattern=%X{mgdSvrName} | %X{userCode} | %d{yyyy-MM-dd HH:mm:ss} | %l | %p | %m%n
使用%X{...}读取设置在LoggingEvent实例中的属性。这种扩展是巧妙的,优雅的,符合log4j设计者的初衷的。
基于上面的分析,我们可以进行一个封装,其代码如下:
package com.jl.yyf.common.logging; import com.jl.yyf.common.ini.ERPIni; import org.apache.log4j.Logger; import org.apache.log4j.Priority; import org.apache.log4j.spi.LoggingEvent; /** * Customization log tool.it has carried on the simple seal to log4j, simplifies the development. * * @author Jack Dou * @version 2010.09.17 */ public final class JLogger { private static final boolean logDisable = false; /** * JianLong log level definition. * * @author Jack Dou * @since Sep 29, 2010 */ public enum Level{ /** * debug level. */ DEBUG, /** * info level. */ INFO, /** * warn level. */ WARN, /** * error level. */ ERROR } /** * Delegate the org.apache.log4j.Logger#getLogger(String clsName) * * @param clsName Class name * @return org.apache.log4j.Logger * @see org.apache.log4j.Logger */ public static Logger getLogger(String clsName) { return Logger.getLogger(clsName); } /** * Delegate the org.apache.log4j.Logger#getLogger(Class cls) * * @param cls The class * @return org.apache.log4j.Logger * @see org.apache.log4j.Logger */ public static Logger getLogger(Class cls) { return Logger.getLogger(cls); } /** * Log the message for level(debug) * * @param logger The logger * @param msg The message * @throws IllegalArgumentException if logger or msg parameter is null. */ public static void logDebug(Logger logger, String msg) { logDebug(logger, msg, null); } /** * Log the message for level(info) * * @param logger The logger * @param msg The message * @throws IllegalArgumentException if logger or msg parameter is null. */ public static void logInfo(Logger logger, String msg) { logInfo(logger, msg, null); } /** * Log the message for level(warn) * * @param logger The logger * @param msg The message * @throws IllegalArgumentException if logger or msg parameter is null. */ public static void logWarn(Logger logger, String msg) { logWarn(logger, msg, null); } /** * Log the message for level(error) * * @param logger The logger * @param msg The message * @throws IllegalArgumentException if logger or msg parameter is null. */ public static void logError(Logger logger, String msg) { logError(logger, msg, null); } /** * Log the message for level(debug) * * @param logger The logger * @param msg The message * @param e The exception stack */ public static void logDebug(Logger logger, String msg, Throwable e) { if (logDisable){ return; } try { validateParam(logger, msg); log(logger, Level.DEBUG, msg, e); } catch (Exception ex) { onException(ex); } } /** * Log the message for level(info) * * @param logger The logger * @param msg The message * @param e The exception stack * @throws IllegalArgumentException if logger or msg parameter is null. */ public static void logInfo(Logger logger, String msg, Throwable e) { if (logDisable){ return; } try { validateParam(logger, msg); log(logger, Level.INFO, msg, e); } catch (Exception ex) { onException(ex); } } /** * Log the message for level(warn) * * @param logger The logger * @param msg The message * @param e The exception stack * @throws IllegalArgumentException if logger or msg parameter is null. */ public static void logWarn(Logger logger, String msg, Throwable e) { if (logDisable){ return; } try { validateParam(logger, msg); log(logger, Level.WARN, msg, e); } catch (Exception ex) { onException(ex); } } /** * Log the message for level(error) * * @param logger The logger * @param msg The message * @param e The exception stack * @throws IllegalArgumentException if logger or msg parameter is null. */ public static void logError(Logger logger, String msg, Throwable e) { if (logDisable){ return; } try { validateParam(logger, msg); log(logger, Level.ERROR, msg, e); } catch (Exception ex) { onException(ex); } } /** * Log the message for level(debug) * * @param cls The class * @param msg The message * @throws IllegalArgumentException if logger or msg parameter is null. */ public static void logDebug(Class cls, String msg) { logDebug(cls, msg, null); } /** * Log the message for level(info) * * @param cls The class * @param msg The message * @throws IllegalArgumentException if logger or msg parameter is null. */ public static void logInfo(Class cls, String msg) { logInfo(cls, msg, null); } /** * Log the message for level(warn) * * @param cls The class * @param msg The message * @throws IllegalArgumentException if logger or msg parameter is null. */ public static void logWarn(Class cls, String msg) { logWarn(cls, msg, null); } /** * Log the message for level(error) * * @param cls The class * @param msg The message * @throws IllegalArgumentException if logger or msg parameter is null. */ public static void logError(Class cls, String msg) { logError(cls, msg, null); } /** * Log the message for level(debug) * * @param cls The class * @param msg The message * @param e The exception stack */ public static void logDebug(Class cls, String msg, Throwable e) { if (logDisable){ return; } try { validateParam2(cls, msg); Logger logger = Logger.getLogger(cls); log(logger, Level.DEBUG, msg, e); } catch (Exception ex) { onException(ex); } } /** * Log the message for level(info) * * @param cls The class * @param msg The message * @param e The exception stack * @throws IllegalArgumentException if class or msg parameter is null. */ public static void logInfo(Class cls, String msg, Throwable e) { if (logDisable){ return; } try { validateParam2(cls, msg); Logger logger = Logger.getLogger(cls); log(logger, Level.INFO, msg, e); } catch (Exception ex) { onException(ex); } } /** * Log the message for level(warn) * * @param cls The class * @param msg The message * @param e The exception stack * @throws IllegalArgumentException if class or msg parameter is null. */ public static void logWarn(Class cls, String msg, Throwable e) { if (logDisable){ return; } try { validateParam2(cls, msg); Logger logger = Logger.getLogger(cls); log(logger, Level.WARN, msg, e); } catch (Exception ex) { onException(ex); } } /** * Log the message for level(error) * * @param cls The class * @param msg The message * @param e The exception stack * @throws IllegalArgumentException if class or msg parameter is null. */ public static void logError(Class cls, String msg, Throwable e) { if (logDisable){ return; } try { validateParam2(cls, msg); Logger logger = Logger.getLogger(cls); log(logger, Level.ERROR, msg, e); } catch (Exception ex) { onException(ex); } } /** * Log the message for level(debug, info, warn, error) * * @param logger The logger * @param msg The message * @param e The exception stack */ private static void log(Logger logger, Level level, String msg, Throwable e) { // Debug level if (level == Level.DEBUG && logger.isDebugEnabled()) { forcedLog(logger, org.apache.log4j.Level.DEBUG, org.apache.log4j.Level.DEBUG_INT, msg, e); return; } // Info level if (level == Level.INFO && logger.isInfoEnabled()) { forcedLog(logger, org.apache.log4j.Level.INFO, org.apache.log4j.Level.INFO_INT, msg, e); return; } // Warnning level if (level == Level.WARN) { forcedLog(logger, org.apache.log4j.Level.WARN, org.apache.log4j.Level.WARN_INT, msg, e); return; } // Error level if (level == Level.ERROR) { forcedLog(logger, org.apache.log4j.Level.ERROR, org.apache.log4j.Level.ERROR_INT, msg, e); return; } } /** * Overwrite Logger class metheds(info debug warn error forcedLog) * * @param logger log4j Logger instanse * @param level log4j level * @param levelInt log4j level number * @param msg log message * @param e the exception stack */ private static void forcedLog(Logger logger, Priority level, int levelInt, String msg, Throwable e) { if (logger.getLoggerRepository().isDisabled(levelInt)) return; LoggingEvent event = new LoggingEvent(JLogger.class.getName(), logger, level, msg, e); event.setProperty(Constant.MGD_SVR_NAME, Util.getMgdSvrName()); event.setProperty(Constant.USER_CODE, Util.getUserCode()); logger.callAppenders(event); } /** * Validate the parameter. * * @param logger The logger * @param msg The message */ private static void validateParam(Logger logger, String msg) { if (logger == null) { throw new IllegalArgumentException("logger must be not null."); } if (msg == null || msg.trim().equals("")) { throw new IllegalArgumentException("msg must be not null."); } } /** * Validate the parameter. * * @param cls The class * @param msg The message */ private static void validateParam2(Class cls, String msg) { if (cls == null) { throw new IllegalArgumentException("clsss must be not null."); } if (msg == null || msg.trim().equals("")) { throw new IllegalArgumentException("msg must be not null."); } } /** * Listen the exception happen. * @param e The exception */ private static void onException(Exception e) { System.out.println(e.getMessage()); //TODO:增加发送邮件或其他异常处理方式 } private static String[] propKeys = {"log.parent.path","log.mail.subject"}; static{ ERPIni ini = new ERPIni(); for (String propKey : propKeys){ System.setProperty(propKey, ini.getValue(propKey)); } } }
使用这个封装,我们可以自由的对LoggingEvent类的实例属性进行控制。
下面是封装类的使用示例:
public class Class1 { private static final Logger logger = JLogger.getLogger(Class1.class); public static void main(String[] args) { JLogger.logInfo(logger, "[Class1]this is log info ...."); } }
最终的日志格式如下:
DefaultServer | 100580 | 2011-05-31 05:32:02 | com.jl.mc.test.Class1.cb1_action(Class1.java:35) | INFO | [Class1]this is log info ....
发表评论
-
jdeveloper集成了RESTFul webservice(jersey)
2011-06-16 11:03 2212请看oracle viewlet:http://downloa ... -
Jersey主架构师,jsr311规范的制定和维护者之一——paul sandoz离开了oracle
2011-04-22 13:32 2400好久没有关注jersey ... -
Facade模式练习
2009-06-26 11:09 1031请查看附件,附件是个普通的java工程,直接用eclipse导 ... -
Adapter模式练习
2009-06-25 09:57 938请查看附件,附件是个普通的java工程,直接用eclipse导 ... -
Prototype模式练习
2009-06-24 22:48 1010请查看附件,附件是个普通的java工程,直接用eclipse导 ... -
Command模式练习
2009-06-24 22:00 1079请查看附件,附件是个普通的java工程,直接用eclipse导 ... -
监听者模式练习(包括jdk api的实现和自定义实现)
2009-06-23 22:42 1301请查看附件,附件是个普通的java工程,直接用eclipse导 ... -
用Java实现二叉树的深度优先、广度优先遍历
2009-06-23 16:20 5559请查看附件,附件是个普通的java工程,直接用eclipse导 ... -
关于jersey与resteay的初步印象
2008-10-25 17:42 1635jersery: 目标(官网上如是说): 1.追随JAX-R ... -
jersey资料收集
2008-10-22 22:10 986http://www.netbeans.org/kb/61/w ... -
solr资料收集
2008-08-21 14:53 1278http://chuanliang2007.spaces.li ... -
查找文件中的字母个数
2008-07-23 23:20 1535package com.search.test; imp ... -
请教appendReplacement的用法
2008-07-04 18:06 2688我想处理一段文字,替换其中的关键字为加红,现在写了下面的程序, ...
相关推荐
Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式...
今日给大家介绍一下java 日志的数据脱敏的实现方法,可以更好的保护数据的安全,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
SolidWorks 客户化和自定义.SolidWorks 客户化和自定义.SolidWorks 客户化和自定义.SolidWorks 客户化和自定义.SolidWorks 客户化和自定义.
介绍EPICOR 客户化的主要方法(即入门指南)
Epicor ERP 客户化 手册
客户关系管理系统(CRM):集中管理客户信息,优化销售、营销和服务流程,提升客户满意度和忠诚度。 供应链管理系统(SCM):整合供应商、制造商、分销商、零售商等供应链各环节,实现物流、资金流、信息流的协同...
teamcenter客户化form的一个实例
客户关系管理系统(CRM): 用于管理与客户之间的关系,包括客户信息、沟通记录、销售机会跟踪等。CRM系统有助于企业更好地理解客户需求,提高客户满意度和保留率。 医院管理系统: 用于管理医院或医疗机构的患者...
Oracle EBS客户化手册
U8快速开发工具是针对客户化开发的特点,基于U8平台而开发的一套简化、快速、高效的U8单据开发工具。使用快速开发工具开发的单据与U8标准单据风格一致,可通过数据库脚本的简单调整设置单据上字段格式(文本、日期、...
用友NC客户化开发全书(第三版NC5.6) 用友NC客户化开发全书(第三版NC5.6) 用友NC客户化开发全书(第三版NC5.6)
移动开发中不可避免的闪退、崩溃等异常一直是困扰开发者难题,该案例是一个全局异常捕获类,方便开发者查看原因,并且将异常信息记录保存到手机本地log日志中,方便在本机测试不出异常却在客户那边出现异常时,客户...
包含客户化定制页面-BIEE管理员手册1.0 PDF 文档
07 OAF客户化开发实例之Helpdesk文档下载开发实例v1.0.pdf
nc客户化开发全书,不是侵权,大家共享下
NC客户化开发进阶培训教程,企业二次开发必备!
06 OAF客户化开发实例之Helpdesk文档管理管理员开发实例v1.0.pdf
用友集团ERP客户化开发系列丛书-NC全册.pdf 用友集团ERP客户化开发系列丛书-NC全册.pdf
BI APPS财务客户化流程分析与实现 B