动态修改log4net组件的日志文件名
最近项目使用到log4net来记录日志,当然二话不说先到cnblogs上查看一下各位高手关于log4net的教程和心得
主要参看了摩诘 的Log4Net使用指南 (确实是非常好的log4net的入门指南),在此篇文章的评论中@所罗门 有个
问题可能摩诘比较忙没有时间去是实验和解答,问题如下:
如果我在配置文件里不设定Appender的File,即删除了<param name="File" value="log-file.txt" /> 一行信息,
我想要在程序运行时动态的设定log日志的文件名(例如以日期来作文件名),该怎么处理才能实现
刚好项目也需要动态的更改log的文件名,就尝试着去跟踪一下log4net的写日志的过程,看看它是如果写日志的.
在跟踪的工程中发现log4net.Repository.Hierarchy.Logger类下面有Appenders属性,就是返回当前所有的append
集合,刚好通过调试跟踪发现
log4net.ILog log = log4net.LogManager.GetLogger( " AppLogger " );创建的log是一个log4net.Core.LogImpl类型,而此类型中有个Logger属性刚刚好是log4net.Repository.Hierarchy.Logger
类型,所以想当然的有以下修改log路径的函数
2 {
3 log4net.Core.LogImpl logImpl = iLog as log4net.Core.LogImpl;
4 if (logImpl != null )
5 {
6 log4net.Appender.AppenderCollection ac = ((log4net.Repository.Hierarchy.Logger)logImpl.Logger).Appenders;
7 for ( int i = 0 ;i < ac.Count;i ++ )
8 { // 这里我只对RollingFileAppender类型做修改
9 log4net.Appender.RollingFileAppender rfa = ac[i] as log4net.Appender.RollingFileAppender;
10 if (rfa != null )
11 {
12 rfa.File = fileName;
13 if ( ! System.IO.File.Exists(fileName))
14 {
15 System.IO.File.Create(fileName);
16 }
17 }
18 }
19 }
20 }
ok,让我们测试一下
{
string fileName = @" c:/chang.log " ;
log4net.ILog iLog = log4net.LogManager.GetLogger( " AppLogger " );
ChangeLog4netLogFileName(iLog, fileName);
iLog.Info( " Test:info " );
}
运行,哦C盘根目录下并没有要预期一样没有出现chang.log文件.why?猜想RollingFileAppender在初始化的时候就
固定了文件名,后期对文件名的修改是不起作用的.继续跟踪代码,发现RollingFileAppender在记录日志时直接使用
初始化时就实例化的一个QuietTextWriter类型的私有变量m_qtw(直接继承于基类TextWriterAppender),继续跟踪发现
基类(TextWriterAppender)提供了Writer属性来修改m_qtw的值,所有修改一下上面的ChangeLog4netLogFileName函数
2 {
3 log4net.Core.LogImpl logImpl = iLog as log4net.Core.LogImpl;
4 if (logImpl != null )
5 {
6 log4net.Appender.AppenderCollection ac = ((log4net.Repository.Hierarchy.Logger)logImpl.Logger).Appenders;
7 for ( int i = 0 ;i < ac.Count;i ++ )
8 { // 这里我只对RollingFileAppender类型做修改
9 log4net.Appender.RollingFileAppender rfa = ac[i] as log4net.Appender.RollingFileAppender;
10 if (rfa != null )
11 {
12 rfa.File = fileName;
13 if ( ! System.IO.File.Exists(fileName))
14 {
15 System.IO.File.Create(fileName);
16 }
17 // 更新Writer属性
18 rfa.Writer = new System.IO.StreamWriter(rfa.File,rfa.AppendToFile,rfa.Encoding);
19 }
20 }
21 }
22 }
在运行上面的测试代码,ok,chang.log文件如愿的出现.
第一次写blogs,罗里罗嗦一大段,希望不会挑战你的耐心^_^
最后附上log4net的配置(也直接从cnblogs上的某位大侠上面copy下来的)
<? xml version="1.0" encoding="utf-8" ?> 2
< configuration > 3
<!-- 如果不用App.config作配置文件,则configSections节不是必须的。 --> 4
< configSections > 5
<!-- “type”属性的完整格式为:配置节处理器类名,程序集名称,Version=程序集版本号,Culture=区域信息,PublicKeyToken=公钥 --> 6
< section name ="log4net" type ="log4net.Config.Log4NetConfigurationSectionHandler,log4net" /> 7
</ configSections > 8
< log4net > 9
<!-- 日志记录器logger,可以有多个 --> 10
< logger name ="AppLogger" > 11
< level value ="ALL" /> 12
< appender-ref ref ="RollingLogFileAppender" /> 13
< appender-ref ref ="ConsoleAppender" /> 14
</ logger > 15
< logger name ="Form1" > 16
< level value ="DEBUG" /> 17
< appender-ref ref ="LogFileAppender" /> 18
</ logger > 19
<!-- 所有logger的基,root的设置在所有logger中都起作用。 20
当在root和logger中重复设定相同的appender时,你会发现同一日志信息将被记录两次。 --> 21
<!-- <root> 22
<level value="WARN" /> 23
<appender-ref ref="LogFileAppender" /> 24
<appender-ref ref="ConsoleAppender" /> 25
</root> --> 26
<!-- 一个appender可以由多个logger共用,当然一个logger可以指定多个appender。 --> 27
< appender name ="LogFileAppender" type ="log4net.Appender.FileAppender" > 28
< param name ="File" value ="App.log" /> 29
< param name ="AppendToFile" value ="true" /> 30
< layout type ="log4net.Layout.PatternLayout" > 31
< param name ="ConversionPattern" value ="%d [%t] %-5p %c [%x] %X{auth} - %m%n" /> 32
</ layout > 33
< filter type ="log4net.Filter.LevelRangeFilter" > 34
< param name ="LevelMin" value ="ALL" /> 35
< param name ="LevelMax" value ="FATAL" /> 36
</ filter > 37
</ appender > 38
< appender name ="RollingLogFileAppender" type ="log4net.Appender.RollingFileAppender" > 39
< file value ="log/logfile1.log" /> 40
< appendToFile value ="true" /> 41
< rollingStyle value ="Date" /> 42
< datePattern value ="yyyyMMdd" /> 43
< encoding value ="utf-8" /> 44
< layout type ="log4net.Layout.PatternLayout" > 45
< conversionPattern value ="%d [%r] [%-5level]: - %message%newline" /> 46
</ layout > 47
</ appender > 48
< appender name ="ConsoleAppender" type ="log4net.Appender.ConsoleAppender" > 49
< layout type ="log4net.Layout.PatternLayout" > 50
< param name ="ConversionPattern" value ="%d [%t] %-5p %c [%x] %X{auth} - %m%n" /> 51
</ layout > 52
</ appender > 53
</ log4net > 54
</ configuration > 动态修改log4net组件的日志文件名的更多相关文章
- JavaScript动态修改html组件form的action属性
用javaScript动态修改html组件form的action属性,可以在提交时再决定处理表单的页面. <%--JavaScript部分--%><script language=& ...
- 动态指定log4net日志文件名称
如果是希望日志文件按常见的日期格式动态命名,没什么好说的,直接修改app.config <param name="DatePattern" value="yyyyM ...
- springboot中动态修改logback日志级别
springboot中动态修改logback日志级别 在spring boot中使用logback日志时,项目运行中,想要修改日志级别. 代码如下: import org.slf4j.Logger; ...
- springboot中动态修改log4j2日志级别
springboot中动态修改log4j2日志级别 在spring boot中使用log4j2日志时,项目运行中,想要修改日志级别. 1.pom.xml依赖: <dependency> & ...
- log4net记录系统错误日志到文本文件用法详解
log4net是一个完全免费开源的插件,可以去官网下载源码. 一般系统操作日志不会用log4net,自己写代码存入数据库更方便合理,但是系统部署后运行在客户环境,难免会发生系统bug.崩溃.断网等无法 ...
- 使用form-create动态生成vue组件
使用form-create动态生成vue自定义组件和嵌套表单组件 [github] | [说明文档] 示例 let rule = [ { type:'row', children:[ { type:' ...
- log4net 动态设定日志文件名
参考文章: http://blog.csdn.net/haoxiaozigang1/article/details/16343303 通过这个篇文章的方法,只能修改文件的路径,文件名并没有修改 参考文 ...
- 性能秒杀log4net的NLogger日志组件(附测试代码与NLogger源码)
NLogger特性: 一:不依赖于第三方插件和支持.net2.0 二:支持多线程高并发 三:读写双缓冲对列 四:自定义日志缓冲大小 五:支持即时触发刷盘机制 六:先按日期再按文件大小滚动Rolling ...
- SpringBoot系列十一:SpringBoot整合Restful架构(使用 RestTemplate 模版实现 Rest 服务调用、Swagger 集成、动态修改日志级别)
声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.概念:SpringBoot整合Restful架构 2.背景 Spring 与 Restful 整合才是微架构的核心,虽然在整 ...
随机推荐
- 空对象模式(Null Object Pattern)
空对象模式:用一个空对象来取代null实例的检查,空对象实现一个不做任何动作的关系.(消除如if(Object == null) 这样的检查null实例代码) 例子: public abstract ...
- Head First 设计模式系列之一----模板模式(java版)
开篇序言:四人帮的设计模式对于我这个菜鸟看着打瞌睡,后面果断买了一本head first的,感觉还可以像看报纸似的,花了一个寒假的晚上看了大半,确实内容也挺吸引人的,讲的很风趣.否则我也不可能,大过年 ...
- Vsftpd -- 验证方式
vsftpd程序提供的FTP服务可选认证方式,分别为匿名访问.本地用户和虚拟用户: 匿名访问:任何人无需验证口令即可登入FTP服务端. 本地用户:使用FTP服务器中的用户.密码信息. 虚拟用户:创建独 ...
- http数据包解析碰到gzip压缩格式的解压
其中在做http数据包临控时碰到gzip压缩格式,在网友发布的一些技术文章基础上,经过一段时间的研究.调试,终于解析成功.现将核心代码公布于此,希望能够和大家一起共同学习交流.注:以下代码需要依赖zl ...
- 51nod贪心算法入门-----任务分配问题
任务执行顺序 有N个任务需要执行,第i个任务计算时占R[i]个空间,而后会释放一部分,最后储存计算结果需要占据O[i]个空间(O[i] < R[i]). 分析: 可以抽象成,从一个整数开始,每次 ...
- 通过I2C总线向EEPROM中写入数据,记录开机次数
没买板子之前,用protues画过电路图,实现了通过i2c总线向EEPROM中写入和读出数据. 今天,在自己买的板子上面写关于i2c总线的程序,有个地方忘了延时,调程序的时候很蛋疼.下面说说我对I2c ...
- Python编程规范及性能优化(转载)
转载地址:http://codeweblog.com/python编程规范及性能优化/
- vs git .ignore
## Ignore Visual Studio temporary files, build results, and## files generated by popular Visual Stud ...
- 纯JavaScript实现一些小功能
题目链接:http://wenku.baidu.com/link?url=7Gbarr5q9X6h1QFRVAsHmfPp1xXagG209mvrJqBogseb4WLeRqbVKwxQieoh8SL ...
- 在Unity中高效工作(上)
原地址:http://www.unity蛮牛.com/thread-19974-1-1.html 编的话:感谢做编程的IT朋友,帮我翻译文章,我又稍稍做了些修改.给点儿掌声哩.欢迎大家多多评论呦. 我 ...