最近项目使用到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路径的函数

 1  private   void  ChangeLog4netLogFileName(log4net.ILog iLog, string  fileName)
 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,让我们测试一下

private   void  TestChangeLog4netLogFileName()
        {
             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函数

 1  private   void  ChangeLog4netLogFileName(log4net.ILog iLog, string  fileName)
 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下来的)

 1  <? 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组件的日志文件名的更多相关文章

  1. JavaScript动态修改html组件form的action属性

    用javaScript动态修改html组件form的action属性,可以在提交时再决定处理表单的页面. <%--JavaScript部分--%><script language=& ...

  2. 动态指定log4net日志文件名称

    如果是希望日志文件按常见的日期格式动态命名,没什么好说的,直接修改app.config <param name="DatePattern" value="yyyyM ...

  3. springboot中动态修改logback日志级别

    springboot中动态修改logback日志级别 在spring boot中使用logback日志时,项目运行中,想要修改日志级别. 代码如下: import org.slf4j.Logger; ...

  4. springboot中动态修改log4j2日志级别

    springboot中动态修改log4j2日志级别 在spring boot中使用log4j2日志时,项目运行中,想要修改日志级别. 1.pom.xml依赖: <dependency> & ...

  5. log4net记录系统错误日志到文本文件用法详解

    log4net是一个完全免费开源的插件,可以去官网下载源码. 一般系统操作日志不会用log4net,自己写代码存入数据库更方便合理,但是系统部署后运行在客户环境,难免会发生系统bug.崩溃.断网等无法 ...

  6. 使用form-create动态生成vue组件

    使用form-create动态生成vue自定义组件和嵌套表单组件 [github] | [说明文档] 示例 let rule = [ { type:'row', children:[ { type:' ...

  7. log4net 动态设定日志文件名

    参考文章: http://blog.csdn.net/haoxiaozigang1/article/details/16343303 通过这个篇文章的方法,只能修改文件的路径,文件名并没有修改 参考文 ...

  8. 性能秒杀log4net的NLogger日志组件(附测试代码与NLogger源码)

    NLogger特性: 一:不依赖于第三方插件和支持.net2.0 二:支持多线程高并发 三:读写双缓冲对列 四:自定义日志缓冲大小 五:支持即时触发刷盘机制 六:先按日期再按文件大小滚动Rolling ...

  9. SpringBoot系列十一:SpringBoot整合Restful架构(使用 RestTemplate 模版实现 Rest 服务调用、Swagger 集成、动态修改日志级别)

    声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.概念:SpringBoot整合Restful架构 2.背景 Spring 与 Restful 整合才是微架构的核心,虽然在整 ...

随机推荐

  1. a标签根据js返回值判断页面是否跳转

    a标签再跳转之前先判断是否符合条件,符合可以跳转,不符合不可以跳转. 自己遇到的问题是:在js方法中根据条件就return结果,但是不行. 原因是:在js方法中return后不会结束整个js方法(ac ...

  2. windows phone 生产二维码和解码本地二维码图片

    前面模仿着写了一个手机扫描二维码和条形码的例子,zxing(下载)的Silverlight库实现的,当时还纳闷有windows phone的库为什么不用,其实都是一样的,,,要改的就是获取摄像头获取的 ...

  3. jQuery中模拟用户操作

    有时为了节省不想手动操作网页,但又想看到用户操作时的效果,可以用到jQuery提供的trigger方法.见下图代码 在不点击按钮时仍然想弹出this.value 我们只需要在后面加上.trigger( ...

  4. [PHP] chr和ord函数实现字符串和ASCII码互转

    chr和ord函数是用来字符串和ASCII码互转的.  ASCII码是计算机所能显示字符的编码,它的取值范围是0-255,其中包括标点.字母.数字.汉字等.在编程过程中,经常把指定的字符转化为ASCI ...

  5. 即时Web通信总结

    即时Web通信在一些对数据实时性要求特别严格的应用中十分重要,如监控系统.报价系统.股票交易系统和即时在线聊天应用等,由于http协议设计当初是为了服务器端响应客户端的请求而设计的,只能在客户端主动发 ...

  6. Linux是一门真正的黑客高手艺术

    黑客这个词从诞生到现在,从来就没有解释为“高级入侵者”.“病毒制造者”或者“QQ盗号者”过.我至今不清楚在中国是谁先把黑客和这些无聊的词汇联系在了一起,导致如此多的人被误导.但有一点是肯定的,不负责任 ...

  7. Challenge Checkio(python)—初尝python练习网站

    最近在找点python语言练习的网站,发现这个网站不错 http://www.checkio.org/ 页面设计的也比较漂亮,比较适合学习python的语法知识.不过注册这个网站 开始就得解决一个py ...

  8. Vijos P1063 迎春舞会之交谊舞 DP

    题目链接:https://vijos.org/p/1063 题意:有n(n <= 100)行,每行有2*i-1个可显字符'#'与'-',组成一个倒三角形,问由'-'组成的最大三角形的'-'的个数 ...

  9. mysql 导出导入数据库中所有数据

    导出数据库所有数据 >mysqldump -uroot -proot -all hzgajzyz>e:/hzgajzyz.sql 导入数据库所有数据 >source e:/hzgaj ...

  10. I2C总线模拟(郭天祥视屏)

    电路图 思路 1.向EEPROM中通过I2C总线写入一个字节 2.通过I2C总线读出写入的字节 3.如果写入和读出成功点亮发光二极管 程序 #include <REGX51.H> #def ...