`
redhacker
  • 浏览: 494297 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

客户化Apahce log4j日志信息

阅读更多
通常情况下,log4j的日志格式由它的layout组件来管理,最典型的一个日志格式的定义是这样的:

在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 ....
0
0
分享到:
评论
1 楼 aaron-han 2011-09-21  
log4j1.5还是1.6?

相关推荐

    log4j详解********

    为了解决这个问题,Log4j应运而生,它提供了一种更结构化、可配置的方式来管理和输出日志信息。 - **Log4j简介**:Log4j不仅允许控制日志目的地(如控制台、文件、GUI、网络等),还支持自定义输出格式和日志级别,...

    Log4j2.x架构Java开发Java经验技巧共8页.p

    Log4j2.x是Java日志记录框架的最新版本,为开发者提供了强大的日志管理和分析功能。这个框架在Java开发中扮演着至关重要的角色,因为它能够帮助开发者追踪代码执行过程中的错误、警告以及调试信息,从而提高软件的...

    Web 式样书,Log4J,发送Email

    本实战项目旨在帮助开发者掌握Web应用程序的实现,包括使用MVC设计模式、数据源(DataSource)、数据传输对象(DTO)、数据访问对象(DAO)、电子邮件发送以及日志管理工具Log4J的配置。此外,还将涉及文件上传功能...

    log4php简单教程

    通过上述介绍,我们可以看到**log4php**不仅提供了一种灵活且强大的日志记录机制,而且还支持多样化的配置方式。无论是简单的日志输出还是复杂的多目的地日志管理,log4php都能够轻松应对。这对于提高PHP应用程序的...

    EPICOR 客户化入门指南

    #### 四、EPICOR 客户化实践 本节将详细介绍EPICOR客户化实践中的一些具体步骤和技术细节。 ##### (一)准备工作 在开始EPICOR客户化之前,需要完成以下准备工作: - **确认需求**:明确客户化的目标和具体需求...

    应用系统日志规范.pdf

    这些配置文件必须采用properties文件的编写方法,commons-logging.properties文件用来指定commons-logging的实现为log4j,log4j.properties文件用来配置log4j的所有参数,日志配置信息不得配置在这两个文件以外的...

    log4net日志管理系统(.Net Core).zip

    客户关系管理系统(CRM): 用于管理与客户之间的关系,包括客户信息、沟通记录、销售机会跟踪等。CRM系统有助于企业更好地理解客户需求,提高客户满意度和保留率。 医院管理系统: 用于管理医院或医疗机构的患者...

    java日志解决方案java问题解决日志第一版.pdf

    - Log4j:Apache的Log4j是Java领域非常流行的日志框架,具有丰富的配置选项和灵活的日志级别管理。 - Logback:由Log4j的创始人设计,比Log4j更快更高效,且更专注于性能优化。 - SLF4J(Simple Logging Facade ...

    Epicor ERP 客户化 手册

    Epicor ERP 客户化 手册

    用友U9客户化开发入门

    用友U9客户化开发入门 用友U9客户化开发入门课程讲解资料,供用友伙伴学习U9客开入门用。下面是从课程中提取的重要知识点: 一、UBF 路径配置 * UBF 路径配置是用友U9客户化开发的基本步骤之一。在这个步骤中,...

    log4net日志管理系统(.Net Core). log4net for .Net Core..zip

    客户关系管理系统(CRM):集中管理客户信息,优化销售、营销和服务流程,提升客户满意度和忠诚度。 供应链管理系统(SCM):整合供应商、制造商、分销商、零售商等供应链各环节,实现物流、资金流、信息流的协同...

    NC客户化开发全书(第三版NC5.6)

    通过学习《用友NC客户化开发全书(第三版NC5.6)》,读者不仅可以掌握NC系统的客户化开发技能,还能了解到企业管理软件的开发流程和最佳实践,提升在企业信息化建设中的专业能力。同时,配合书中的实际案例,读者能够...

    Teamcenter客户化form

    teamcenter客户化form的一个实例

    spring + activiti + slf4j + mail

    3. **SLF4J(Simple Logging Facade for Java)**:SLF4J是一个日志抽象层,为各种日志框架(如log4j、logback)提供一个统一的接口。它允许开发者在部署时自由选择合适的日志实现,使得日志记录更加灵活且不绑定到...

    电信设备-日志信息的扩展保存方法.zip

    四、日志信息的安全与隐私保护 1. 加密存储:对日志数据进行加密,防止未经授权的访问。 2. 访问控制:设定权限,仅允许授权人员查看和分析日志。 3. 匿名化处理:在不影响分析的前提下,去除个人身份信息,保护用户...

    展讯SPRD平台Log工具"YLog"AP日志解析脚本 - analyzer.py

    展讯SPRD平台抓取Log工具"YLog...通过工具直接抓取的Log是具有特定格式的加密日志文件,需要通过脚本解析来还原真实Log,有时候客户提供的Log压缩包可能不是完整的,仅提供了关键的Log文件,这个时候就需要解析脚本了。

Global site tag (gtag.js) - Google Analytics