自定义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.");
相关推荐
#自定义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.appender.CONSOLE=org.apache.log4j.ConsoleAppender INFO是日志记录的最低等级,必须写,它和比它高的等级会进入日志,如WARN、ERROR、FATAL、OFF。 关于8个日志等级,参考:...
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
Grails OohLaLog 插件添加了一个 log4j appender 来将流量转发到 oohlalog api 服务。 这允许其用户跨多个服务器聚合日志、设置警报、自定义计数器并实时监控他们的应用程序。 Log4J 附加程序 修改您的 Config....
该项目包含一个用于 log4j 的自定义 appender,适用于对使用 log4j 架构通过 Nagios nsca 服务器将消息推送到 Nagios 感兴趣的系统管理员和/或开发人员。 2.0.0 版支持异步消息传递、可调超时和用于重新传递支持的...
打印日志的在程序中是必不可少的,如果需要将不同的日志打印到不同的地方,则需要定义不同的Appender,然后定义每一个Appender的日志级别、打印形式和日志的输出路径,下面看一个示例吧
自定义Logger章节四:JCL1. 快速入门2. 原理解析章节五:Slf4j1. 快速入门2. 绑定日志实现3. 桥接旧日志实现4. 原理解析章节六:Logback1. 快速入门2. 配置文件3. logback-access使用章节七:Log4j21. 快速入门2. ...
log4j配置:log4j.appender.MongoDB.layout.ConversionPattern={"timestamp":"%d","level":"%p","className":"%c","message":"%m","pid":"%V","ip":"%I",uuid:"%X{UUID}"} 如何监控tomcat访问日志 1.先配置将...
memberReaderClass 设定一个成员读取器,默认情况下 Hierarchy 都是从关系型数据库里读取的,如果你的数据不在 RDBMS 里面的话,你可以通过自定义一个 member reader 来表现一个 Hierarchy 。 3.5. Level 级别 , ...
目录 ..........................................................................................................................I ...4. Appender ..........................................