注册博客员也满长时间了,这算是一个开篇文章把.

最近项目使用到log4net来记录日志,当然二话不说先到cnblogs上查看一下各位高手关于log4net的教程和心得
主要参看了我想要在程序运行时动态的设定log日志的文件名(例如以日期来作文件名),该怎么处理才能实现
刚好项目也需要动态的更改log的文件名,就尝试着去跟踪一下log4net的写日志的过程,看看它是如果写日志的.
在跟踪的工程中发现log4net.Repository.Hierarchy.Logger类下面有Appenders属性,就是返回当前所有的append
集合,刚好通过调试跟踪发现

动态修改log4net组件的日志文件名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动态修改log4net组件的日志文件名<?xml version="1.0" encoding="utf-8" ?> 
 2动态修改log4net组件的日志文件名<configuration> 
 3动态修改log4net组件的日志文件名    <!--如果不用App.config作配置文件,则configSections节不是必须的。--> 
 4动态修改log4net组件的日志文件名    <configSections> 
 5动态修改log4net组件的日志文件名        <!--“type”属性的完整格式为:配置节处理器类名,程序集名称,Version=程序集版本号,Culture=区域信息,PublicKeyToken=公钥--> 
 6动态修改log4net组件的日志文件名        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" /> 
 7动态修改log4net组件的日志文件名    </configSections> 
 8动态修改log4net组件的日志文件名    <log4net> 
 9动态修改log4net组件的日志文件名        <!--日志记录器logger,可以有多个--> 
10动态修改log4net组件的日志文件名        <logger name="AppLogger"> 
11动态修改log4net组件的日志文件名            <level value="ALL" /> 
12动态修改log4net组件的日志文件名            <appender-ref ref="RollingLogFileAppender" /> 
13动态修改log4net组件的日志文件名            <appender-ref ref="ConsoleAppender" /> 
14动态修改log4net组件的日志文件名        </logger> 
15动态修改log4net组件的日志文件名        <logger name="Form1"> 
16动态修改log4net组件的日志文件名            <level value="DEBUG" /> 
17动态修改log4net组件的日志文件名            <appender-ref ref="LogFileAppender" /> 
18动态修改log4net组件的日志文件名        </logger> 
19动态修改log4net组件的日志文件名        <!--所有logger的基,root的设置在所有logger中都起作用。 
20动态修改log4net组件的日志文件名        当在root和logger中重复设定相同的appender时,你会发现同一日志信息将被记录两次。--> 
21动态修改log4net组件的日志文件名        <!--<root> 
22动态修改log4net组件的日志文件名            <level value="WARN" /> 
23动态修改log4net组件的日志文件名            <appender-ref ref="LogFileAppender" /> 
24动态修改log4net组件的日志文件名            <appender-ref ref="ConsoleAppender" /> 
25动态修改log4net组件的日志文件名        </root>--> 
26动态修改log4net组件的日志文件名        <!--一个appender可以由多个logger共用,当然一个logger可以指定多个appender。--> 
27动态修改log4net组件的日志文件名        <appender name="LogFileAppender" type="log4net.Appender.FileAppender"> 
28动态修改log4net组件的日志文件名            <param name="File" value="App.log" /> 
29动态修改log4net组件的日志文件名            <param name="AppendToFile" value="true" /> 
30动态修改log4net组件的日志文件名            <layout type="log4net.Layout.PatternLayout">              
31动态修改log4net组件的日志文件名                <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] %X{auth} - %m%n" /> 
32动态修改log4net组件的日志文件名            </layout> 
33动态修改log4net组件的日志文件名            <filter type="log4net.Filter.LevelRangeFilter"> 
34动态修改log4net组件的日志文件名                <param name="LevelMin" value="ALL" /> 
35动态修改log4net组件的日志文件名                <param name="LevelMax" value="FATAL" /> 
36动态修改log4net组件的日志文件名            </filter> 
37动态修改log4net组件的日志文件名        </appender>
38动态修改log4net组件的日志文件名        <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
39动态修改log4net组件的日志文件名            <file value="log/logfile1.log" />
40动态修改log4net组件的日志文件名            <appendToFile value="true" />
41动态修改log4net组件的日志文件名            <rollingStyle value="Date" />
42动态修改log4net组件的日志文件名            <datePattern value="yyyyMMdd" />
43动态修改log4net组件的日志文件名            <encoding value="utf-8"/>
44动态修改log4net组件的日志文件名            <layout type="log4net.Layout.PatternLayout">                
45动态修改log4net组件的日志文件名                <conversionPattern value="%d [%r] [%-5level]: - %message%newline" />
46动态修改log4net组件的日志文件名            </layout>
47动态修改log4net组件的日志文件名        </appender> 
48动态修改log4net组件的日志文件名        <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> 
49动态修改log4net组件的日志文件名            <layout type="log4net.Layout.PatternLayout"> 
50动态修改log4net组件的日志文件名                <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] %X{auth} - %m%n" /> 
51动态修改log4net组件的日志文件名            </layout> 
52动态修改log4net组件的日志文件名        </appender> 
53动态修改log4net组件的日志文件名    </log4net> 
54动态修改log4net组件的日志文件名</configuration> 

相关文章:

  • 2021-10-27
  • 2021-12-11
  • 2022-01-13
  • 2022-01-06
  • 2021-06-22
  • 2021-12-21
  • 2022-03-01
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-06-22
  • 2021-05-18
  • 2022-02-12
相关资源
相似解决方案