在上一篇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="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=""Logs_"yyyyMMdd-HHmm".log"" /> 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=""Logs_"yyyyMMdd-HHmm".log"" /> 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>
多次運行應用程序,生成的日志文件如下所示: