log4j配置

private static Log log = LogFactory.getLog(*.class);// rootLogger   
private static final Logger auditLogger = Logger.getLogger("AUDIT");// other logger

<?xml version="1.0" encoding="UTF-8"?>
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    <appender class="org.apache.log4j.ConsoleAppender" >
        <layout name="STDOUT" class="com.citi.dashboard.common.log.DashboardPatternLayout">    
            <param name="ConversionPattern"    value="%d{MM/dd/yyyy,HH:mm:ss}|%5p|%F:%L|%U|%m%n" />
        </layout>
    </appender>
    <appender name="RollingFile" class="org.apache.log4j.RollingFileAppender">
        <param name="File" value="/export/enterprise-docs/avita/Log/web/avita/${weblogic.Name}_avita.log" />
        <param name="MaxFileSize" value="500KB" />
        <param name="MaxBackupIndex" value="5" />
        <layout class="com.citi.dashboard.common.log.DashboardPatternLayout">
            <param name="ConversionPattern"    value="%d{MM/dd/yyyy,HH:mm:ss}|%5p|%F:%L|%U|%m%n" />
        </layout>
    </appender>

      <appender name="AuditAppender" class="org.apache.log4j.rolling.RollingFileAppender">
        <rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
          <param name="FileNamePattern" value="/export/enterprise-docs/avita/Log/web/avita/${weblogic.Name}_avita_audit_log.%d{yyyy-MM-dd}"/>
        </rollingPolicy>
        <layout class="com.citi.dashboard.common.log.DashboardPatternLayout">
            <param name="ConversionPattern"
             value="%d{MM/dd/yyyy HH:mm:ss}| %m |%n"/>
        </layout>
      </appender>
         
          <appender name="MailAppender" class="com.citi.dashboard.common.log.DashboardSMTPAppender">
              <param name="threshold" value="ERROR"/>
              <param name="BufferSize" value="512" />
              <param name="SMTPHost" value="localhost"/>
              <param name="Subject" value="Avita Error Message" />
              <param name="From" value="12@23.com"/>
              <param name="To" value="12@23.com" />
              <layout class="com.citi.dashboard.common.log.DashboardHTMLPatternLayout">
            <param name="ConversionPattern"
                value="%d{MM/dd/yyyy,HH:mm:ss}|%5p|%F:%L|%m%n" />
            </layout>
         </appender>
    
        <appender name="SqlAppender" class="com.citi.dashboard.common.log.AvitaJDBCAppender">
            <param name="Threshold" value="INFO"/>      
            <param name="BufferSize" value="5"/>  ">
            <param name="driver" value="com.sybase.jdbc3.jdbc.SybDriver"/>
            <param name="user" value="sales"/>
            <param name="password" value="sales123"/>
            <param name="sql" value="{call sales.SD_MKT_InsertAccessLog('%d{MM/dd/yyyy HH:mm:ss}','%X{adminId}','%X{userId}','%X{userRole}','%X{avitaTab}',null) }"/>
        </appender>
    
    <category name="org.apache">
        <priority value="error" />
    </category>
    <category name="org.springframework">
        <priority value="error" />
    </category>
    <category name="com.citi">
        <priority value="debug" />
    </category>
    <category name="net.sf.jasperreports">
        <priority value="error" />
    </category>
    <category name="org.apache.commons">
        <priority value="error" />
    </category>
    
    <logger name="AUDIT">
        <priority value="info" />
        <appender-ref ref="AuditAppender"/>
    </logger>
    
    
     <root>
      <priority value="info" />
      <appender-ref ref="STDOUT"/>
      <appender-ref ref="RollingFile" />
      <appender-ref ref="MailAppender" />
    </root>
    

</log4j:configuration>

logger是从root继承而来,默认的用logger写的日志会被root重复写一份,如何防止这种情况呢,网上有人提出可以去掉root里的 appender-ref,这不是一个好的解决方法,logger只是为了单独处理一些日志,大部分的日志还是要依靠root来完成。其实 log4j提供了一种很好的解决方式,断开logger与root的继承关系,只要在配置文件里的logger加上属性additivity="false" 就可以了。

个人觉得下面这种格式比较混乱

log4j.rootLogger=info,stdout,info,debug,error
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%-5p] [%d{HH:mm:ss}] %c - %m%n

errorHandler : 另一个 setter/getter 方法是为 ErrorHandler 而存在的。appender 可能把它们的错误处理委托给一个ErrorHandler 对象――即org.apache.log4j.spi 包中的一个接口。实现类有两个:OnlyOnceErrorHandlerFallbackErrorHandlerOnlyOnceErrorHandle 实现 log4j 的默认错误处理策略,它发送出第一个错误的消息并忽略其余的所有错误。错误消息将输出到System.errFallbackErrorHandler 实现 ErrorHandler 接口,以便能够指定一个辅助的 appender。如果主 appender 失败,辅助 appender 将接管工作。错误消息将输出到System.err ,然后登录到新的辅助 appender。 close()doAppend()close() 方法释放 appender 中分配的任何资源,比如文件句柄、网络连接,等等。在编写自定义 appender 代码时,务必要实现这个方法,以便当您的 appender 关闭时,它的 closed 字段将被设置为true

public synchronized void doAppend (LoggingEvent event) {

    if (closed) {         // step 1
     LogLog.error("Attempted to append to closed appender [" + name + "].");
     return;
    }
    if ( !isAsSevereAsThreshold (event.level) ) {        // step 2
        return;
    }
    Filter f = this.headFilter;        // step 3
    FILTER_LOOP:
    while ( f != null) {
        switch ( f .decide(event) ) {
        case Filter.DENY: return;
        case Filter.ACCEPT: break FILTER_LOOP;
        case Filter.NEUTRAL: f = f.next;
        }
    }
    this.append(event);        // step 4
}

public interface Appender {
     void addFilter(Filter newFilter);    void clearFilters() ;     Filter getFilter();                                              
     void close();                                                        
     void doAppend(LoggingEvent event);            
     boolean requiresLayout();  
         
    Layout getLayout();    void setLayout(Layout layout);       
    String getName();   void setName(String name);
    ErrorHandler getErrorHandler();  void setErrorHandler(ErrorHandler errorHandler);
}

// AppenderSkeleton callback methods public boolean requiresLayout() { ... } public void activateOptions() { ... } public void append(LoggingEvent event) { ... } public synchronized void close() { ... }


public void activateOptions() { try { cb = new CyclicBuffer(bufferSize); if (SSL) { con = new SSLXMPPConnection(host, port); } else { con = new XMPPConnection(host, port); } con.login(username, password); if (chatroom) { groupchat = con.createGroupChat(recipient); groupchat.join(nickname != null ? nickname : username); } else { chat = con.createChat(recipient); } } catch (Exception e) { errorHandler.error("Error while activating options for appender named [" + name + "]", e, ErrorCode.GENERIC_FAILURE); } }

public void append(LoggingEvent event) {

    // check pre-conditions
    if (!checkEntryConditions()) {
        return;
    }

    cb.add(event);
    if (evaluator.isTriggeringEvent(event)) {
        sendBuffer();
    }
}

protected  boolean checkEntryConditions() {
    if ((this.chat == null) && (this.groupchat == null)) {
        errorHandler.error("Chat object not configured");
        return false;
    }

    if (this.layout == null) {
     errorHandler.error("No layout set for appender named [" + name + "]");
     return false;
    }
    return true;
}

protected void sendBuffer() {
    try {
        StringBuffer buf = new StringBuffer();
            
        int len = cb.length();
        for (int i = 0; i < len; i++) {
            LoggingEvent event = cb.get();
            buf.append(layout.format(event));
            
            // if layout doesn't handle exceptions, the appender has 
            // to do it
            if (layout.ignoresThrowable()) {
                String[] s = event.getThrowableStrRep();
                if (s != null) {
                    for (int j = 0; j < s.length; j++) {
                        buf.append(LINE_SEP);
                        buf.append(s[j]);
                    }
                }
            }
        }

        if (chatroom) {
            groupchat.sendMessage(buf.toString());
        } else {
            chat.sendMessage(buf.toString());
        }

    } catch(Exception e) {
        errorHandler.error("Could not send message 
          in IMAppender [" + name + "]", 
            e, ErrorCode.GENERIC_FAILURE);
    }
}

 

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值