首页 > 代码库 > Log4net入门(回滚日志文件篇)

Log4net入门(回滚日志文件篇)

  在上一篇Log4net(日志文件篇)中,我们使用“log4net.Appender.FileAppender”将日志信息输出到一个单一的文件中,随着应用程序的持续使用,该日志文件会越来越庞大,进而影响系统的性能。因此,有必要对日志文件按某种条件进行切分,要切分日志文件,我们可以使用“log4net.Appender.RollingFileAppender”输出源,使用该输出源我们可以按照文件大小或者日期对日志文件进行切分,下面我们分别描述之。

一、按文件大小切分日志文件

  想要按文件大小切分日志文件只需要在Log4net.config配置文件中添加一个appender节点,然后在root节点中添加一个对新添加的appender节点的引用即可。Log4net.config的配置信息如下所示:

 1 <?xml version="1.0" encoding="utf-8" ?>
 2 <configuration>
 3   <configSections>
 4     <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
 5   </configSections>
 6 
 7   <log4net>
 8     <!-- 将日志输出到控制台 -->
 9     <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
10       <layout type="log4net.Layout.PatternLayout">
11         <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
12       </layout>
13     </appender>
14 
15     <!-- 将日志写到文件中 -->
16     <appender name="FileAppender" type="log4net.Appender.FileAppender">
17       <!-- 日志文件存放位置,可以为绝对路径也可以为相对路径-->
18       <file value="Logs/FileAppender.log" />
19       <!-- 将日志信息追加到已有的日志文件中-->
20       <appendToFile value="true" />
21       <!-- 最小锁定模式,以允许多个进程可以写入同一个文件 -->
22       <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
23 
24       <layout type="log4net.Layout.PatternLayout">
25         <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
26       </layout>
27     </appender>
28 
29     <!-- 将日志以回滚文件的形式写到文件中 -->
30     <!-- 按文件大小切分日志文件 -->
31     <appender name="RollingFileAppenderBySize" type="log4net.Appender.RollingFileAppender">
32       <!-- 日志文件存放位置,可以为绝对路径也可以为相对路径-->
33       <file value="Logs/RollingFileAppenderBySize.log" />
34       <!-- 将日志信息追加到已有的日志文件中-->
35       <appendToFile value="true" />
36       <!-- 最小锁定模式,以允许多个进程可以写入同一个文件 -->
37       <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
38       <!-- 指定按文件大小切分日志文件 -->
39       <rollingStyle value="Size" />
40       <!-- 指定备份日志文件的最大切分数量,如果超过指定切分文件个数,日志将进行覆写 -->
41       <maxSizeRollBackups value="5" />
42       <!-- 指定每个切分日志文件的大小 -->
43       <maximumFileSize value="1KB" />
44       <!-- 指定每个切分文件具有相同的名字 -->
45       <!-- 日志文件进行切分后,每个日志文件的名字分别为:RollingFileAppenderBySize.log, RollingFileAppenderBySize.log.1, ..., RollingFileAppenderBySize.log.5 -->
46       <staticLogFileName value="true" />
47 
48       <layout type="log4net.Layout.PatternLayout">
49         <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
50       </layout>
51     </appender>
52 
53     <root>
54       <!-- 控制级别,由低到高:ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF -->
55       <!-- 比如定义级别为INFO,则INFO级别向下的级别,比如DEBUG日志将不会被记录 -->
56       <!-- 如果没有定义LEVEL的值,则缺省为DEBUG -->
57       <level value="ALL" />
58       <!-- 将日志输出到控制台 -->
59       <appender-ref ref="ConsoleAppender" />
60       <!-- 将日志写到文件中 -->
61       <appender-ref ref="FileAppender" />
62       <!-- 按文件大小切分日志文件 -->
63       <appender-ref ref="RollingFileAppenderBySize" />
64     </root>
65   </log4net>
66 </configuration>

  将上述配置文件保存,然后多次运行程序,生成的日志文件如下所示:

技术分享

   大家可能已经注意到了,一共有6个日志文件,其中有5个是备份文件,也就是说,如果我们设置“<maxSizeRollBackups value="http://www.mamicode.com/5" />”,那么意思是我们将备份文件的数量设置为5。

二、按日期切分日志文件

  想要按日期切分日志文件只需要在Log4net.config配置文件中添加一个appender节点,然后在root节点中添加一个对新添加的appender节点的引用即可。Log4net.config的配置信息如下所示:

 1 <?xml version="1.0" encoding="utf-8" ?>
 2 <configuration>
 3   <configSections>
 4     <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
 5   </configSections>
 6 
 7   <log4net>
 8     <!-- 将日志输出到控制台 -->
 9     <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
10       <layout type="log4net.Layout.PatternLayout">
11         <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
12       </layout>
13     </appender>
14 
15     <!-- 将日志写到文件中 -->
16     <appender name="FileAppender" type="log4net.Appender.FileAppender">
17       <!-- 日志文件存放位置,可以为绝对路径也可以为相对路径-->
18       <file value="Logs/FileAppender.log" />
19       <!-- 将日志信息追加到已有的日志文件中-->
20       <appendToFile value="true" />
21       <!-- 最小锁定模式,以允许多个进程可以写入同一个文件 -->
22       <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
23 
24       <layout type="log4net.Layout.PatternLayout">
25         <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
26       </layout>
27     </appender>
28 
29     <!-- 将日志以回滚文件的形式写到文件中 -->
30     <!-- 按文件大小切分日志文件 -->
31     <appender name="RollingFileAppenderBySize" type="log4net.Appender.RollingFileAppender">
32       <!-- 日志文件存放位置,可以为绝对路径也可以为相对路径-->
33       <file value="Logs/RollingFileAppenderBySize.log" />
34       <!-- 将日志信息追加到已有的日志文件中-->
35       <appendToFile value="true" />
36       <!-- 最小锁定模式,以允许多个进程可以写入同一个文件 -->
37       <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
38       <!-- 指定按文件大小切分日志文件 -->
39       <rollingStyle value="Size" />
40       <!-- 指定备份日志文件的最大切分数量,如果超过指定切分文件个数,日志将进行覆写 -->
41       <maxSizeRollBackups value="5" />
42       <!-- 指定每个切分日志文件的大小 -->
43       <maximumFileSize value="1KB" />
44       <!-- 指定每个切分文件具有相同的名字 -->
45       <!-- 日志文件进行切分后,每个日志文件的名字分别为:RollingFileAppenderBySize.log, RollingFileAppenderBySize.log.1, ..., RollingFileAppenderBySize.log.5 -->
46       <staticLogFileName value="true" />
47 
48       <layout type="log4net.Layout.PatternLayout">
49         <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
50       </layout>
51     </appender>
52 
53     <!-- 按日期切分日志文件 -->
54     <appender name="RollingFileAppenderByDate" type="log4net.Appender.RollingFileAppender">
55       <!-- 日志文件存放位置,可以为绝对路径也可以为相对路径-->
56       <file value="Logs/RollingFileAppenderByDate.log" />
57       <!-- 将日志信息追加到已有的日志文件中-->
58       <appendToFile value="true" />
59       <!-- 最小锁定模式,以允许多个进程可以写入同一个文件 -->
60       <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
61       <!-- 指定按日期切分日志文件 -->
62       <rollingStyle value="Date" />
63       <!-- 每分钟切分一个日志文件 -->
64       <!-- 每天切分一个日志文件的写法为:"yyyyMMdd" -->
65       <datePattern value="yyyyMMdd-HHmm" />
66       <!-- 指定每个切分文件具有相同的名字 -->
67       <staticLogFileName value="true" />
68 
69       <layout type="log4net.Layout.PatternLayout">
70         <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
71       </layout>
72     </appender>
73 
74     <root>
75       <!-- 控制级别,由低到高:ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF -->
76       <!-- 比如定义级别为INFO,则INFO级别向下的级别,比如DEBUG日志将不会被记录 -->
77       <!-- 如果没有定义LEVEL的值,则缺省为DEBUG -->
78       <level value="ALL" />
79       <!-- 将日志输出到控制台 -->
80       <appender-ref ref="ConsoleAppender" />
81       <!-- 将日志写到文件中 -->
82       <appender-ref ref="FileAppender" />
83       <!-- 按文件大小切分日志文件 -->
84       <appender-ref ref="RollingFileAppenderBySize" />
85       <!-- 按日期切分日志文件 -->
86       <appender-ref ref="RollingFileAppenderByDate" />
87     </root>
88   </log4net>
89 </configuration>

  每隔一分钟运行一次应用程序,生成的日志文件如下所示:

技术分享

 三、按日期切分日志文件,并以日期作为日志文件名

  如果我们想以日期切分日志文件,并且以日期作为日志文件名,我们可以在Log4net.config配置文件中添加一个appender节点,然后在root节点中添加一个对新添加的appender节点的引用即可。Log4net.config的配置信息如下所示:

  1 <?xml version="1.0" encoding="utf-8" ?>
  2 <configuration>
  3   <configSections>
  4     <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  5   </configSections>
  6 
  7   <log4net>
  8     <!-- 将日志输出到控制台 -->
  9     <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
 10       <layout type="log4net.Layout.PatternLayout">
 11         <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
 12       </layout>
 13     </appender>
 14 
 15     <!-- 将日志写到文件中 -->
 16     <appender name="FileAppender" type="log4net.Appender.FileAppender">
 17       <!-- 日志文件存放位置,可以为绝对路径也可以为相对路径-->
 18       <file value="Logs/FileAppender.log" />
 19       <!-- 将日志信息追加到已有的日志文件中-->
 20       <appendToFile value="true" />
 21       <!-- 最小锁定模式,以允许多个进程可以写入同一个文件 -->
 22       <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
 23 
 24       <layout type="log4net.Layout.PatternLayout">
 25         <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
 26       </layout>
 27     </appender>
 28 
 29     <!-- 将日志以回滚文件的形式写到文件中 -->
 30     <!-- 按文件大小切分日志文件 -->
 31     <appender name="RollingFileAppenderBySize" type="log4net.Appender.RollingFileAppender">
 32       <!-- 日志文件存放位置,可以为绝对路径也可以为相对路径-->
 33       <file value="Logs/RollingFileAppenderBySize.log" />
 34       <!-- 将日志信息追加到已有的日志文件中-->
 35       <appendToFile value="true" />
 36       <!-- 最小锁定模式,以允许多个进程可以写入同一个文件 -->
 37       <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
 38       <!-- 指定按文件大小切分日志文件 -->
 39       <rollingStyle value="Size" />
 40       <!-- 指定备份日志文件的最大切分数量,如果超过指定切分文件个数,日志将进行覆写 -->
 41       <maxSizeRollBackups value="5" />
 42       <!-- 指定每个切分日志文件的大小 -->
 43       <maximumFileSize value="1KB" />
 44       <!-- 指定每个切分文件具有相同的名字 -->
 45       <!-- 日志文件进行切分后,每个日志文件的名字分别为:RollingFileAppenderBySize.log, RollingFileAppenderBySize.log.1, ..., RollingFileAppenderBySize.log.5 -->
 46       <staticLogFileName value="true" />
 47 
 48 
 49       <layout type="log4net.Layout.PatternLayout">
 50         <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
 51       </layout>
 52     </appender>
 53 
 54     <!-- 按日期切分日志文件 -->
 55     <appender name="RollingFileAppenderByDate" type="log4net.Appender.RollingFileAppender">
 56       <!-- 日志文件存放位置,可以为绝对路径也可以为相对路径 -->
 57       <file value="Logs/RollingFileAppenderByDate.log" />
 58       <!-- 将日志信息追加到已有的日志文件中-->
 59       <appendToFile value="true" />
 60       <!-- 最小锁定模式,以允许多个进程可以写入同一个文件 -->
 61       <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
 62       <!-- 指定按日期切分日志文件 -->
 63       <rollingStyle value="Date" />
 64       <!-- 每分钟切分一个日志文件 -->
 65       <!-- 每天切分一个日志文件的写法为:"yyyyMMdd" -->
 66       <datePattern value="yyyyMMdd-HHmm" />
 67       <!-- 指定每个切分文件具有相同的名字 -->
 68       <staticLogFileName value="true" />
 69 
 70       <layout type="log4net.Layout.PatternLayout">
 71         <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
 72       </layout>
 73     </appender>
 74 
 75     <!-- 按日期切分日志文件,并将日期作为日志文件的名字 -->
 76     <appender name="RollingFileAppenderNameByDate" type="log4net.Appender.RollingFileAppender">
 77       <!-- 日志文件存放位置,可以为绝对路径也可以为相对路径 -->
 78       <file value="Logs/" />
 79       <!-- 将日志信息追加到已有的日志文件中-->
 80       <appendToFile value="true" />
 81       <!-- 最小锁定模式,以允许多个进程可以写入同一个文件 -->
 82       <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
 83       <!-- 指定按日期切分日志文件 -->
 84       <rollingStyle value="Date" />
 85       <!-- 日志文件的命名规则 -->
 86       <datePattern value="&quot;Logs_&quot;yyyyMMdd-HHmm&quot;.log&quot;" />
 87       <!-- 当将日期作为日志文件的名字时,必须将staticLogFileName的值设置为false -->
 88       <staticLogFileName value="false" />
 89 
 90       <layout type="log4net.Layout.PatternLayout">
 91         <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
 92       </layout>
 93     </appender>
 94 
 95     <root>
 96       <!-- 控制级别,由低到高:ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF -->
 97       <!-- 比如定义级别为INFO,则INFO级别向下的级别,比如DEBUG日志将不会被记录 -->
 98       <!-- 如果没有定义LEVEL的值,则缺省为DEBUG -->
 99       <level value="ALL" />
100       <!-- 将日志输出到控制台 -->
101       <appender-ref ref="ConsoleAppender" />
102       <!-- 将日志写到文件中 -->
103       <appender-ref ref="FileAppender" />
104       <!-- 按文件大小切分日志文件 -->
105       <appender-ref ref="RollingFileAppenderBySize" />
106       <!-- 按日期切分日志文件 -->
107       <appender-ref ref="RollingFileAppenderByDate" />
108       <!-- 按日期切分日志文件,并将日期作为日志文件的名字 -->
109       <appender-ref ref="RollingFileAppenderNameByDate" />
110     </root>
111   </log4net>
112 </configuration>

   多次运行应用程序,生成的日志如下所示:

技术分享

四、既按大小又按日期切分日志文件

  如果想既按大小又按日期切分日志文件,只需要将“rollingStyle”的值设置为“Composite”即可,具体配置文件如下所示:

  1 <?xml version="1.0" encoding="utf-8" ?>
  2 <configuration>
  3   <configSections>
  4     <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  5   </configSections>
  6 
  7   <log4net>
  8     <!-- 将日志输出到控制台 -->
  9     <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
 10       <layout type="log4net.Layout.PatternLayout">
 11         <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
 12       </layout>
 13     </appender>
 14 
 15     <!-- 将日志写到文件中 -->
 16     <appender name="FileAppender" type="log4net.Appender.FileAppender">
 17       <!-- 日志文件存放位置,可以为绝对路径也可以为相对路径 -->
 18       <file value="Logs/FileAppender.log" />
 19       <!-- 将日志信息追加到已有的日志文件中-->
 20       <appendToFile value="true" />
 21       <!-- 最小锁定模式,以允许多个进程可以写入同一个文件 -->
 22       <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
 23 
 24       <layout type="log4net.Layout.PatternLayout">
 25         <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
 26       </layout>
 27     </appender>
 28 
 29     <!-- 将日志以回滚文件的形式写到文件中 -->
 30     <!-- 按文件大小切分日志文件 -->
 31     <appender name="RollingFileAppenderBySize" type="log4net.Appender.RollingFileAppender">
 32       <!-- 日志文件存放位置,可以为绝对路径也可以为相对路径 -->
 33       <file value="Logs/RollingFileAppenderBySize.log" />
 34       <!-- 将日志信息追加到已有的日志文件中-->
 35       <appendToFile value="true" />
 36       <!-- 最小锁定模式,以允许多个进程可以写入同一个文件 -->
 37       <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
 38       <!-- 指定按文件大小切分日志文件 -->
 39       <rollingStyle value="Size" />
 40       <!-- 指定备份日志文件的最大切分数量,如果超过指定切分文件个数,日志将进行覆写 -->
 41       <maxSizeRollBackups value="5" />
 42       <!-- 指定每个切分日志文件的大小 -->
 43       <maximumFileSize value="1KB" />
 44       <!-- 指定每个切分文件具有相同的名字 -->
 45       <!-- 日志文件进行切分后,每个日志文件的名字分别为:RollingFileAppenderBySize.log, RollingFileAppenderBySize.log.1, ..., RollingFileAppenderBySize.log.5 -->
 46       <staticLogFileName value="true" />
 47 
 48       <layout type="log4net.Layout.PatternLayout">
 49         <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
 50       </layout>
 51     </appender>
 52 
 53     <!-- 按日期切分日志文件 -->
 54     <appender name="RollingFileAppenderByDate" type="log4net.Appender.RollingFileAppender">
 55       <!-- 日志文件存放位置,可以为绝对路径也可以为相对路径 -->
 56       <file value="Logs/RollingFileAppenderByDate.log" />
 57       <!-- 将日志信息追加到已有的日志文件中-->
 58       <appendToFile value="true" />
 59       <!-- 最小锁定模式,以允许多个进程可以写入同一个文件 -->
 60       <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
 61       <!-- 指定按日期切分日志文件 -->
 62       <rollingStyle value="Date" />
 63       <!-- 每分钟切分一个日志文件 -->
 64       <!-- 每天切分一个日志文件的写法为:"yyyyMMdd" -->
 65       <datePattern value="yyyyMMdd-HHmm" />
 66       <!-- 指定每个切分文件具有相同的名字 -->
 67       <staticLogFileName value="true" />
 68 
 69       <layout type="log4net.Layout.PatternLayout">
 70         <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
 71       </layout>
 72     </appender>
 73 
 74     <!-- 按日期切分日志文件,并将日期作为日志文件的名字 -->
 75     <appender name="RollingFileAppenderNameByDate" type="log4net.Appender.RollingFileAppender">
 76       <!-- 日志文件存放位置,可以为绝对路径也可以为相对路径 -->
 77       <file value="Logs/" />
 78       <!-- 将日志信息追加到已有的日志文件中-->
 79       <appendToFile value="true" />
 80       <!-- 最小锁定模式,以允许多个进程可以写入同一个文件 -->
 81       <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
 82       <!-- 指定按日期切分日志文件 -->
 83       <rollingStyle value="Date" />
 84       <!-- 日志文件的命名规则 -->
 85       <datePattern value="&quot;Logs_&quot;yyyyMMdd-HHmm&quot;.log&quot;" />
 86       <!-- 当将日期作为日志文件的名字时,必须将staticLogFileName的值设置为false -->
 87       <staticLogFileName value="false" />
 88 
 89       <layout type="log4net.Layout.PatternLayout">
 90         <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
 91       </layout>
 92     </appender>
 93 
 94     <!-- 既按大小又按日期切分日志文件 -->
 95     <appender name="RollingFileAppenderBySizeAndDate" type="log4net.Appender.RollingFileAppender">
 96       <!-- 日志文件存放位置,可以为绝对路径也可以为相对路径 -->
 97       <file value="Logs/RollingFileAppenderBySizeAndDate.log" />
 98       <!-- 将日志信息追加到已有的日志文件中-->
 99       <appendToFile value="true" />
100       <!-- 最小锁定模式,以允许多个进程可以写入同一个文件 -->
101       <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
102       <!-- 指定既按大小又按日期切分日志文件 -->
103       <rollingStyle value="Composite" />
104       <!-- 指定备份日志文件的最大切分数量,如果超过指定切分文件个数,日志将进行覆写 -->
105       <maxSizeRollBackups value="5" />
106       <!-- 指定每个切分日志文件的大小 -->
107       <maximumFileSize value="1KB" />
108       <!-- 每分钟切分一个日志文件 -->
109       <!-- 每天切分一个日志文件的写法为:"yyyyMMdd" -->
110       <datePattern value="yyyyMMdd-HHmm" />
111       <!-- 指定每个切分文件具有相同的名字 -->
112       <staticLogFileName value="true" />
113 
114       <layout type="log4net.Layout.PatternLayout">
115         <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
116       </layout>
117     </appender>
118 
119     <root>
120       <!-- 控制级别,由低到高:ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF -->
121       <!-- 比如定义级别为INFO,则INFO级别向下的级别,比如DEBUG日志将不会被记录 -->
122       <!-- 如果没有定义LEVEL的值,则缺省为DEBUG -->
123       <level value="ALL" />
124       <!-- 将日志输出到控制台 -->
125       <appender-ref ref="ConsoleAppender" />
126       <!-- 将日志写到文件中 -->
127       <appender-ref ref="FileAppender" />
128       <!-- 按文件大小切分日志文件 -->
129       <appender-ref ref="RollingFileAppenderBySize" />
130       <!-- 按日期切分日志文件 -->
131       <appender-ref ref="RollingFileAppenderByDate" />
132       <!-- 按日期切分日志文件,并将日期作为日志文件的名字 -->
133       <appender-ref ref="RollingFileAppenderNameByDate" />
134       <!-- 既按大小又按日期切分日志文件 -->
135       <appender-ref ref="RollingFileAppenderBySizeAndDate" />
136     </root>
137   </log4net>
138 </configuration>

  多次运行应用程序,生成的日志文件如下所示:

技术分享

Log4net入门(回滚日志文件篇)