登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

璀璨星空&旖旎花園gegei.com

★╰→流星劃過夜空,不僅是為了帶來祝福,同時也是為了追求幸福!

 
 
 

日志

 
 

动态修改log4net组件的日志文件名  

2007-08-17 09:13:25|  分类: 程序编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

最近项目使用到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> 

  评论这张
 
阅读(1342)| 评论(0)

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018