Java程序运行时,动态修改Logger的appender。 背景 在程序运行的时候,有的时候需要动态修改Logger的级别,增加、删除、修改Logger的Appender。 */ FileAppender appender = new FileAppender(); appender.setEncoder(encoder); appender.setFile("/home/bash/workspace/temp/test.log"); appender.setName("TestFile"); appender.setAppend(false); appender.setContext(lc); /*这里启动encoder和appender。 ("这里时一条所有appender都可以输出的数据。")
Logback将执行日志事件输出的组件称为Appender,实现的Appender必须继承 ch.qos.logback.core.Appender 接口 接口如下: package appender的父类。 SiftingAppender是通过创建内置的Appender来完成这些功能的,通过使用<sift> <appender></appender> </sift>。 SiftingAppender负责管理这些子Appender的生命周期。SiftingAppender会自动关闭和移除过期的appender。 appender,不过appender的销毁并不是实时的,而是等待几秒后,防止还有未处理的日志丢失。
.* = false : 表示当前logger不需要打到父层级所指定的appender,只打到当前的appender; 默认true:表示当前logger将打印日志到当前的appender 及所有的父层级所指定的appender ? 2、将日志信息封装成 LoggingEvent 对象并传入 Appender。 3、在 Appender 中调用 Filter 对日志信息进行过滤,调用 Layout 对日志信息进行格式化,然后输出。 图示: ? 实现自定义log4j Appender 明白了log4j的结构关系实现自定义的log4j appender就迎刃而解了 继承log4j公共的基类:AppenderSkeleton 打印日志核心方法
来生成对应的回滚日志文件,具体由com.lewis这个logger来使用该appender进行拼接日志信息。 在用户登录时,调用上边的方法来动态生成domain appender;假如有10个domainId,就会生成10个domain appender。 由于这10个domain appender都被add到同一个logger里了,如果不通过ThreadContextMapFilter来控制,就会造成每个User的日志信息都会被输入到所有domain appender 在加载配置文件后拼接domain appender 需要注意的是,必须在读取配置文件后才能去动态生成appender或者其他的日志对象,否则会被原本的配置文件覆盖掉。 参考链接 运行时添加log4j2的appender log4j2如何动态的创建logger和appender log4j2 不使用配置文件,动态生成logger对象 log4j2的MDC应用配置 警告
前面写了个cassandra-appender,一个基于cassandra的logback插件。 所以,cassandra-appender核心功能就是对logback消息的存写部分了。同样,基于ES的logback-appender核心部分就是对ES的存写过程了。 ref="cassandraLogger" /> <appender-ref ref="elasticLogger" /> <appender-ref ref="STDOUT 首先,不同level可以使用不同的appender。cassandraLogger,elasticLogger是我们自定义的appender。 loggerContext.stop()一次性关闭所有appender,包括它们连接的数据库。也可以用elasticAppender.stop()来关闭独立的appender。
#用户身份标识,必选参数 log4j.appender.loghubAppender.accessKeyId=自己的的SecretId log4j.appender.loghubAppender.accessKeySecret =自己的的SecretKey #设置log字段的格式,必选参数 log4j.appender.loghubAppender.layout=org.apache.log4j.PatternLayout log4j.appender.loghubAppender.layout.ConversionPattern log4j.appender.loghubAppender.maxBlockMs=0 #执行日志发送任务的线程池大小,默认为可用处理器个数。 log4j.appender.loghubAppender.retries=10 #该参数越大能让您追溯更多的信息,但同时也会消耗更多的内存。 log4j.appender.loghubAppender.maxRetryBackoffMs=50000 #设置时间格式,可选参数 log4j.appender.loghubAppender.timeFormat
logback是一套开发架构,任何定制的appender可以很方便地整合入logback。那么我们就尝试开发一套基于cassandra的logback-appender。 好了,以上运作流程都包括在logback的功能里了,跟消息的存储appender没什么关系。下面我们就开始自制一套基于cassandra的appender。 上面提过,logback是一套开放的框架,任何按照logback要求开发的appender都可以很方便的整合入logback的功能中去。 > <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <! > <root level="debug"> <appender-ref ref="cassandraLogger" /> <appender-ref ref="STDOUT
文件名 说明 LogbackMain 应用main启动类 LogPrint 业务类(需要打印日志的类) HandleAppender logback中自定义的appender处理类 MyPolicy 自定义处理策略 if (this.layout == null) { this.addStatus(new ErrorStatus("No layout set for the appender } 以上使用一个定时线程池固定频率模拟业务系统打印日志,触发日志定制化处理功能 MyPolicy类说明 该类比较简单,不再说明 详细可查阅 Github代码 logback.xml配置说明 <appender --additivity=true,表示将日志输出出来,false则不会输出日志,但是appender仍可接收到输出的日志message--> <logger name="myLogger" level --指定自定义的appender来处理--> <appender-ref ref="myLog"/> </logger> 需要注意的点都已在xml注释中说明,此处不再赘述 运行情况
log4j.properties 文件的一个appender X的语法分享: # 根日志记录器(logger)的级别定义为DEBUG并连接附加器命名为X log4j.rootLogger = DEBUG, X # 附加器(appender)X是定义为org.apache.log4j.FileAppender并写入到一个名为“log.out”位于日志log目录下 log4j.appender.X=org.apache.log4j.FileAppender log4j.appender.X.File=${log}/log.out # 定义的布局模式是 %m%n,这意味着每打印日志消息之后,将加上一个换行符 log4j.appender.X.layout=org.apache.log4j.PatternLayout log4j.appender.X.layout.conversionPattern
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n #common log appender # log4j.appender.logfile log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n #error log appender # log4j.appender.errorfile =ERROR log4j.appender.errorfile.append=true log4j.appender.errorfile.encoding=GB18030 log4j.appender.errorfile.layout #sql log appender # log4j.appender.sqllog=org.apache.log4j.DailyRollingFileAppender log4j.appender.sqllog.File log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n #common log appender # log4j.appender.logfile
log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender log4j.appender.LF5_APPENDER.MaxNumberOfRecords =FATAL log4j.appender.MAIL.BufferSize=10 log4j.appender.MAIL.From=web@www.wuset.com log4j.appender.MAIL.SMTPHost log4j.appender.DATABASE.user=root log4j.appender.DATABASE.password= log4j.appender.DATABASE.sql =org.apache.log4j.xml.XMLLayout #自定义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.stdout.layout=org.apache.log4j.TTCCLayout 4、目的地 配置日志信息输出目的地Appender,其语法为 log4j.appender.appenderName ## log4j.appender.A2.MaxFileSize=500KB ### 文件大小## log4j.appender.A2.MaxBackupIndex=1 log4j.appender.A2 ######################## # Log Factor 5 Appender ######################## #log4j.appender.LF5_APPENDER =org.apache.log4j.lf5.LF5Appender #log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000 ############# ###### #自定义Appender ################### #log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender
---------- log4j.appender.appender1.File=c:/demolog4j.htm --------------终端输出的样式----------------- log4j.appender.appender1 log4j.appender.appender1=org.apache.log4j.ConsoleAppender log4j.appender.appender2=org.apache.log4j.ConsoleAppender log4j.appender.appender1=org.apache.log4j.ConsoleAppender log4j.appender.appender1.layout=org.apache.log4j.PatternLayout =debug,appender1,appender2 log4j.appender.appender1=org.apache.log4j.ConsoleAppender log4j.appender.appender1 HH:mm:ss:SSS}][%c] %m%n log4j.appender.appender2=org.apache.log4j.FileAppender log4j.appender.appender2
2.配置日志信息输出目的地Appender,其语法为: log4j.appender.appenderName = fully.qualified.name.of.appender.class log4j.appender.appenderName.option1 log4j.appender.appenderName=appender的类型 这样子就指定了输入的目的地了 3.配置日志信息的格式(布局),其语法为: log4j.appender.appenderName.layout .LF5Appender log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000 # 发送日志到指定邮件 log4j.appender.mail=org.apache.log4j.net.SMTPAppender log4j.appender.mail.Threshold=FATAL log4j.appender.mail.BufferSize=10 log4j.appender.mail.From = xxx log4j.appender.database.user=root log4j.appender.database.password= log4j.appender.database.sql=INSERT
appender.transport.strategy.fileIndex = nomax appender.transport.strategy.action.type = Delete appender.transport.strategy.action.basepath # 将日志输出到 Console 中 appender.rolling.type = Console appender.rolling.name = rolling appender.rolling.layout.type appender.transport.strategy.fileIndex = nomax appender.transport.strategy.action.type = Delete appender.transport.strategy.action.basepath # appender.rolling.layout.type = PatternLayout appender.discovery.layout.type_name = server appender.discovery.filePattern appender.discovery.strategy.fileIndex = nomax appender.discovery.strategy.action.type = Delete appender.discovery.strategy.action.basepath
appender.transport.strategy.fileIndex = nomax appender.transport.strategy.action.type = Delete appender.transport.strategy.action.basepath # 将日志输出到 Console 中 appender.rolling.type = Console appender.rolling.name = rolling appender.rolling.layout.type appender.transport.strategy.fileIndex = nomax appender.transport.strategy.action.type = Delete appender.transport.strategy.action.basepath # appender.rolling.layout.type = PatternLayout appender.discovery.layout.type_name = server appender.discovery.filePattern appender.discovery.strategy.fileIndex = nomax appender.discovery.strategy.action.type = Delete appender.discovery.strategy.action.basepath
可以通过添加如下的appender内容,按天输出到不同的文件中去,同时还需要为log4j.rootCategory添加名为file的appender,这样root日志就可以输出到logs/all.log log4j.appender.file.file=logs/all.log log4j.appender.file.DatePattern='.' 通过定义输出到logs/my.log的appender,并对com.niugang包下的日志级别设定为DEBUG级别、appender设置为输出到logs/my.log的名为ngfile的appender log4j.appender.errorfile.file=logs/error.log log4j.appender.errorfile.DatePattern='.' log4j.appender.file.file=d:/springbootlog/logs/all.log log4j.appender.file.DatePattern='.'
log4j.appender.SOCKET.RemoteHost=localhost log4j.appender.SOCKET.Port=5001 log4j.appender.SOCKET.LocationInfo ######################## log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender log4j.appender.LF5 log4j.appender.A5.BufferSize=5 log4j.appender.A5.To=chunjie@yeqiangwei.com log4j.appender.A5.From =FATAL, A8 # APPENDER A8 log4j.appender.A8=org.apache.log4j.nt.NTEventLogAppender log4j.appender.A8 log4j.appender.A5.From=error@yeqiangwei.com log4j.appender.A5.Subject=ErrorLog log4j.appender.A5.
(指定输出到邮件) log4j.appender.MAIL.Threshold=FATAL log4j.appender.MAIL.BufferSize=10 log4j.appender.MAIL.From ## log4j.appender.A2.MaxFileSize=500KB ### 文件大小## log4j.appender.A2.MaxBackupIndex=1 log4j.appender.A2 _APPENDER=org.apache.log4j.lf5.LF5Appender #log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000 ####################### # Log Factor 5 Appender ######################## #log4j.appender.LF5_APPENDER =org.apache.log4j.lf5.LF5Appender #log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000 ##############
appender; if (appenderList ! appender; for (int i = 0; i < size; i++) { appender = appenderList.elementAt (i); if (name.equals(appender.getName())) { return appender; } } return null; } public boolean isAttached(Appender appender appender) { if (appender == null || appenderList == null) { return;