注册博客员也满长时间了,这算是一个开篇文章把.
最近项目使用到log4net来记录日志,当然二话不说先到cnblogs上查看一下各位高手关于log4net的教程和心得
主要参看了摩诘的Log4Net使用指南 (确实是非常好的log4net的入门指南),在此篇文章的评论中@所罗门有个
问题可能摩诘比较忙没有时间去是实验和解答,问题如下:
如果我在配置文件里不设定Appender的File,即删除了<param name="File" value="log-file.txt" /> 一行信息,
我想要在程序运行时动态的设定log日志的文件名(例如以日期来作文件名),该怎么处理才能实现
刚好项目也需要动态的更改log的文件名,就尝试着去跟踪一下log4net的写日志的过程,看看它是如果写日志的.
在跟踪的工程中发现log4net.Repository.Hierarchy.Logger类下面有Appenders属性,就是返回当前所有的append
集合,刚好通过调试跟踪发现
![](/Images/OutliningIndicators/None.gif)
类型,所以想当然的有以下修改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,让我们测试一下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 }
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在初始化的时候就{
string fileName = @"c:\chang.log";
log4net.ILog iLog = log4net.LogManager.GetLogger("AppLogger");
ChangeLog4netLogFileName(iLog, fileName);
iLog.Info("Test:info");
}
固定了文件名,后期对文件名的修改是不起作用的.继续跟踪代码,发现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文件如愿的出现.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 }
第一次写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>
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/None.gif)
4
![](/Images/OutliningIndicators/None.gif)
5
![](/Images/OutliningIndicators/None.gif)
6
![](/Images/OutliningIndicators/None.gif)
7
![](/Images/OutliningIndicators/None.gif)
8
![](/Images/OutliningIndicators/None.gif)
9
![](/Images/OutliningIndicators/None.gif)
10
![](/Images/OutliningIndicators/None.gif)
11
![](/Images/OutliningIndicators/None.gif)
12
![](/Images/OutliningIndicators/None.gif)
13
![](/Images/OutliningIndicators/None.gif)
14
![](/Images/OutliningIndicators/None.gif)
15
![](/Images/OutliningIndicators/None.gif)
16
![](/Images/OutliningIndicators/None.gif)
17
![](/Images/OutliningIndicators/None.gif)
18
![](/Images/OutliningIndicators/None.gif)
19
![](/Images/OutliningIndicators/None.gif)
20
![](/Images/OutliningIndicators/None.gif)
21
![](/Images/OutliningIndicators/None.gif)
22
![](/Images/OutliningIndicators/None.gif)
23
![](/Images/OutliningIndicators/None.gif)
24
![](/Images/OutliningIndicators/None.gif)
25
![](/Images/OutliningIndicators/None.gif)
26
![](/Images/OutliningIndicators/None.gif)
27
![](/Images/OutliningIndicators/None.gif)
28
![](/Images/OutliningIndicators/None.gif)
29
![](/Images/OutliningIndicators/None.gif)
30
![](/Images/OutliningIndicators/None.gif)
31
![](/Images/OutliningIndicators/None.gif)
32
![](/Images/OutliningIndicators/None.gif)
33
![](/Images/OutliningIndicators/None.gif)
34
![](/Images/OutliningIndicators/None.gif)
35
![](/Images/OutliningIndicators/None.gif)
36
![](/Images/OutliningIndicators/None.gif)
37
![](/Images/OutliningIndicators/None.gif)
38
![](/Images/OutliningIndicators/None.gif)
39
![](/Images/OutliningIndicators/None.gif)
40
![](/Images/OutliningIndicators/None.gif)
41
![](/Images/OutliningIndicators/None.gif)
42
![](/Images/OutliningIndicators/None.gif)
43
![](/Images/OutliningIndicators/None.gif)
44
![](/Images/OutliningIndicators/None.gif)
45
![](/Images/OutliningIndicators/None.gif)
46
![](/Images/OutliningIndicators/None.gif)
47
![](/Images/OutliningIndicators/None.gif)
48
![](/Images/OutliningIndicators/None.gif)
49
![](/Images/OutliningIndicators/None.gif)
50
![](/Images/OutliningIndicators/None.gif)
51
![](/Images/OutliningIndicators/None.gif)
52
![](/Images/OutliningIndicators/None.gif)
53
![](/Images/OutliningIndicators/None.gif)
54
![](/Images/OutliningIndicators/None.gif)