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
包中的一个接口。实现类有两个:OnlyOnceErrorHandler
和FallbackErrorHandler
。 OnlyOnceErrorHandle
实现 log4j 的默认错误处理策略,它发送出第一个错误的消息并忽略其余的所有错误。错误消息将输出到System.err
。FallbackErrorHandler
实现 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);
}
}