`

Log4j自定义Appender(二)

阅读更多

自定义Appender实际应用

 

场景一:利用log4j MongoDB插件 向 MongoDB数据库写入数据

 

1.项目引入 jar 包:spring-data-mongodb-log4j:1.8.0,及 log4j 1.2以上jar包

2.log4j.properties 配置

 

 

log4j.rootLogger=INFO, stdout

log4j.appender.stdout=org.springframework.data.mongodb.log4j.MongoLog4jAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - <%m>%n
log4j.appender.stdout.host = localhost
log4j.appender.stdout.port = 27017
log4j.appender.stdout.database = logs
#log4j.appender.stdout.collectionPattern = %X{year}%X{month}
log4j.appender.stdout.collectionPattern = sys_logs
log4j.appender.stdout.applicationId = my.application
log4j.appender.stdout.warnOrHigherWriteConcern = FSYNC_SAFE

 

3.程序中应用

 

Logger log = Logger.getRootLogger();
log.info("I am ready.") ;

 

 

说明:

org.springframework.data.mongodb.log4j.MongoLog4jAppender

此类中通过

extends AppenderSkeleton

 

实现了自定义 Appender  如下:

 

package org.springframework.data.mongodb.log4j;
import com.mongodb.BasicDBList;
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.Mongo;
import com.mongodb.WriteConcern;
import java.net.UnknownHostException;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.Level;
import org.apache.log4j.MDC;
import org.apache.log4j.PatternLayout;
import org.apache.log4j.spi.LoggingEvent;
public class MongoLog4jAppender extends AppenderSkeleton {
    public static final String LEVEL = "level";
    public static final String NAME = "name";
    public static final String APP_ID = "applicationId";
    public static final String TIMESTAMP = "timestamp";
    public static final String PROPERTIES = "properties";
    public static final String TRACEBACK = "traceback";
    public static final String MESSAGE = "message";
    public static final String YEAR = "year";
    public static final String MONTH = "month";
    public static final String DAY = "day";
    public static final String HOUR = "hour";
    protected String host = "localhost";
    protected int port = 27017;
    protected String database = "logs";
    protected String collectionPattern = "%c";
    protected PatternLayout collectionLayout;
    protected String applicationId;
    protected WriteConcern warnOrHigherWriteConcern;
    protected WriteConcern infoOrLowerWriteConcern;
    protected Mongo mongo;
    protected DB db;
    public MongoLog4jAppender() {
        this.collectionLayout = new PatternLayout(this.collectionPattern);
        this.applicationId = System.getProperty("APPLICATION_ID", (String)null);
        this.warnOrHigherWriteConcern = WriteConcern.SAFE;
        this.infoOrLowerWriteConcern = WriteConcern.NORMAL;
}

    public MongoLog4jAppender(boolean isActive) {
        super(isActive);
        this.collectionLayout = new PatternLayout(this.collectionPattern);
        this.applicationId = System.getProperty("APPLICATION_ID", (String)null);
        this.warnOrHigherWriteConcern = WriteConcern.SAFE;
        this.infoOrLowerWriteConcern = WriteConcern.NORMAL;
}

    public String getHost() {
        return this.host;
}

    public void setHost(String host) {
        this.host = host;
}

    public int getPort() {
        return this.port;
}

    public void setPort(int port) {
        this.port = port;
}

    public String getDatabase() {
        return this.database;
}

    public void setDatabase(String database) {
        this.database = database;
}

    public String getCollectionPattern() {
        return this.collectionPattern;
}

    public void setCollectionPattern(String collectionPattern) {
        this.collectionPattern = collectionPattern;
        this.collectionLayout = new PatternLayout(collectionPattern);
}

    public String getApplicationId() {
        return this.applicationId;
}

    public void setApplicationId(String applicationId) {
        this.applicationId = applicationId;
}

    public void setWarnOrHigherWriteConcern(String wc) {
        this.warnOrHigherWriteConcern = WriteConcern.valueOf(wc);
}

    public String getWarnOrHigherWriteConcern() {
        return this.warnOrHigherWriteConcern.toString();
}

    public String getInfoOrLowerWriteConcern() {
        return this.infoOrLowerWriteConcern.toString();
}

    public void setInfoOrLowerWriteConcern(String wc) {
        this.infoOrLowerWriteConcern = WriteConcern.valueOf(wc);
}

    protected void connectToMongo() throws UnknownHostException {
        this.mongo = new Mongo(this.host, this.port);
        this.db = this.mongo.getDB(this.database);
}

    protected void append(LoggingEvent event) {
        if(null == this.db) {
            try {
                this.connectToMongo();
} catch (UnknownHostException var9) {
                throw new RuntimeException(var9.getMessage(), var9);
}
        }

        BasicDBObject dbo = new BasicDBObject();
        if(null != this.applicationId) {
            dbo.put("applicationId", this.applicationId);
MDC.put("applicationId", this.applicationId);
}

        dbo.put("name", event.getLogger().getName());
dbo.put("level", event.getLevel().toString());
Calendar tstamp = Calendar.getInstance();
tstamp.setTimeInMillis(event.getTimeStamp());
dbo.put("timestamp", tstamp.getTime());
Map props = event.getProperties();
        if(null != props && props.size() > 0) {
            BasicDBObject traceback = new BasicDBObject();
Iterator now = props.entrySet().iterator();
            while(now.hasNext()) {
                Entry coll = (Entry)now.next();
traceback.put(coll.getKey().toString(), coll.getValue().toString());
}

            dbo.put("properties", traceback);
}

        String[] traceback1 = event.getThrowableStrRep();
        if(null != traceback1 && traceback1.length > 0) {
            BasicDBList now2 = new BasicDBList();
now2.addAll(Arrays.asList(traceback1));
dbo.put("traceback", now2);
}

        dbo.put("message", event.getRenderedMessage());
Calendar now1 = Calendar.getInstance();
MDC.put("year", Integer.valueOf(now1.get(1)));
MDC.put("month", String.format("%1$02d", new Object[]{Integer.valueOf(now1.get(2) + 1)}));
MDC.put("day", String.format("%1$02d", new Object[]{Integer.valueOf(now1.get(5))}));
MDC.put("hour", String.format("%1$02d", new Object[]{Integer.valueOf(now1.get(11))}));
String coll1 = this.collectionLayout.format(event);
MDC.remove("year");
MDC.remove("month");
MDC.remove("day");
MDC.remove("hour");
        if(null != this.applicationId) {
            MDC.remove("applicationId");
}

        WriteConcern wc;
        if(event.getLevel().isGreaterOrEqual(Level.WARN)) {
            wc = this.warnOrHigherWriteConcern;
} else {
            wc = this.infoOrLowerWriteConcern;
}

        this.db.getCollection(coll1).insert(dbo, wc);
}

    public void close() {
        if(this.mongo != null) {
            this.mongo.close();
}

    }

    public boolean requiresLayout() {
        return true;
}
}

 

场景二:项目中某项操作或执行记录,通过自定义Appender 写入文件或打印控制台等

 

1.log4j.properties 配置

 

 

log4j.logger.historyLog=INFO, history
log4j.additivity.historyLog= false
log4j.appender.history=com.xxx.HistoryLogAppender
log4j.appender.history.host = localhost
log4j.appender.history.port = 27017
log4j.appender.history.database = logs
log4j.appender.history.collectionPattern = %X{year}%X{month}
#log4j.appender.history.collectionPattern = sys_logs
log4j.appender.history.hs_name=hs_name

 其中 com.xxx.HistoryLogAppender 为项目中通过继承

 

 

extends AppenderSkeleton {

实现的 自定义 Appender

 

2.程序中应用

 

Logger cutsomLog = Logger.getLogger("historyLog");
cutsomLog.info("I am ready.");

 

 

分享到:
评论

相关推荐

    log4j日志驱动包

    #自定义Appender log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender log4j.appender.im.host = mail.cybercorlin.net log4j.appender.im.username = username log4j.appender.im.password = ...

    log4j使用实战

    log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender INFO是日志记录的最低等级,必须写,它和比它高的等级会进入日志,如WARN、ERROR、FATAL、OFF。 关于8个日志等级,参考:...

    log4j参考手册

    1 Log4J简介 3 2 Log4J实现 3 2.1 Log4J配置 3 2.2 Log4J的类图 4 2.3 日志级别 4 2.4 配置Logger组件 4 2.5 配置Appender组件 5 2.6 配置Layout组件 6 2.7 日志文件的名称 7 ...3.7 自定义Appender 10

    oohlalog_grails:用于 log4j Appender 的 OohLaLog Grails 插件

    Grails OohLaLog 插件添加了一个 log4j appender 来将流量转发到 oohlalog api 服务。 这允许其用户跨多个服务器聚合日志、设置警报、自定义计数器并实时监控他们的应用程序。 Log4J 附加程序 修改您的 Config....

    NagiosAppender:log4j 支持原生 nagios (nsca) 集成-开源

    该项目包含一个用于 log4j 的自定义 appender,适用于对使用 log4j 架构通过 Nagios nsca 服务器将消息推送到 Nagios 感兴趣的系统管理员和/或开发人员。 2.0.0 版支持异步消息传递、可调超时和用于重新传递支持的...

    java自定义日志输出文件(log4j日志文件输出多个自定义日志文件)

    打印日志的在程序中是必不可少的,如果需要将不同的日志打印到不同的地方,则需要定义不同的Appender,然后定义每一个Appender的日志级别、打印形式和日志的输出路径,下面看一个示例吧

    java日志框架视频教程

    自定义Logger章节四:JCL1. 快速入门2. 原理解析章节五:Slf4j1. 快速入门2. 绑定日志实现3. 桥接旧日志实现4. 原理解析章节六:Logback1. 快速入门2. 配置文件3. logback-access使用章节七:Log4j21. 快速入门2. ...

    应用分析监控平台 闪电狗.zip

    log4j配置:log4j.appender.MongoDB.layout.ConversionPattern={"timestamp":"%d","level":"%p","className":"%c","message":"%m","pid":"%V","ip":"%I",uuid:"%X{UUID}"} 如何监控tomcat访问日志 1.先配置将...

    jpivot学习总结.doc

    memberReaderClass 设定一个成员读取器,默认情况下 Hierarchy 都是从关系型数据库里读取的,如果你的数据不在 RDBMS 里面的话,你可以通过自定义一个 member reader 来表现一个 Hierarchy 。 3.5. Level 级别 , ...

    Logback用户手册中文版

    目录 ..........................................................................................................................I ...4. Appender ..........................................

Global site tag (gtag.js) - Google Analytics