我們在Log4net入門(回滾日志篇)中詳細講述了如何將日志信息輸出到日志文件中,在這一篇中,我們將講述如何將日志文件寫入SQL Server數據庫,以方便我們分析統計日志信息。
首先,我們在SQL Server中創建一個名為“Management”的數據庫,然後在該數據庫中創建一個名為“Log”的表,該表結構如下所示:
1 CREATE TABLE [dbo].[Log]( 2 [Id] [int] IDENTITY(1,1) NOT NULL, 3 [Date] [datetime] NOT NULL, 4 [Thread] [varchar](255) NOT NULL, 5 [Level] [varchar](50) NOT NULL, 6 [Logger] [varchar](255) NOT NULL, 7 [Message] [varchar](4000) NOT NULL, 8 [Exception] [varchar](2000) NULL, 9 CONSTRAINT [PK_Log] PRIMARY KEY CLUSTERED 10 ( 11 [Id] ASC 12 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 13 ) ON [PRIMARY]
其次,我們在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 <!-- 按日期切分日志文件,並將日期作為日志文件的名字 --> 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 <!-- 將日志利用ADO.NET記錄到數據庫中 --> 120 <appender name="AdoNetAppender_SQLServer" type="log4net.Appender.AdoNetAppender"> 121 <!-- 緩沖區大小 --> 122 <bufferSize value="1" /> 123 <!-- 引用信息 --> 124 <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/> 125 <!-- 連接到SQL Server的數據庫連接字符串 --> 126 <connectionString value="Data Source=(local); Initial Catalog=Management; User ID=sa; Password=123456;" /> 127 <!-- 插入Log表的SQL語句 --> 128 <commandText value="INSERT INTO dbo.Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" /> 129 130 <parameter> 131 <parameterName value="@log_date" /> 132 <dbType value="DateTime" /> 133 <layout type="log4net.Layout.RawTimeStampLayout" /> 134 </parameter> 135 136 <parameter> 137 <parameterName value="@thread" /> 138 <dbType value="String" /> 139 <size value="255" /> 140 <layout type="log4net.Layout.PatternLayout"> 141 <conversionPattern value="%thread" /> 142 </layout> 143 </parameter> 144 145 <parameter> 146 <parameterName value="@log_level" /> 147 <dbType value="String" /> 148 <size value="50" /> 149 <layout type="log4net.Layout.PatternLayout"> 150 <conversionPattern value="%level" /> 151 </layout> 152 </parameter> 153 154 <parameter> 155 <parameterName value="@logger" /> 156 <dbType value="String" /> 157 <size value="255" /> 158 <layout type="log4net.Layout.PatternLayout"> 159 <conversionPattern value="%logger" /> 160 </layout> 161 </parameter> 162 163 <parameter> 164 <parameterName value="@message" /> 165 <dbType value="String" /> 166 <size value="4000" /> 167 <layout type="log4net.Layout.PatternLayout"> 168 <conversionPattern value="%message" /> 169 </layout> 170 </parameter> 171 172 <parameter> 173 <parameterName value="@exception" /> 174 <dbType value="String" /> 175 <size value="2000" /> 176 <layout type="log4net.Layout.ExceptionLayout" /> 177 </parameter> 178 </appender> 179 180 <root> 181 <!-- 控制級別,由低到高:ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF --> 182 <!-- 比如定義級別為INFO,則INFO級別向下的級別,比如DEBUG日志將不會被記錄 --> 183 <!-- 如果沒有定義LEVEL的值,則缺省為DEBUG --> 184 <level value="ALL" /> 185 <!-- 將日志輸出到控制台 --> 186 <appender-ref ref="ConsoleAppender" /> 187 <!-- 將日志寫到文件中 --> 188 <appender-ref ref="FileAppender" /> 189 <!-- 按文件大小切分日志文件 --> 190 <appender-ref ref="RollingFileAppenderBySize" /> 191 <!-- 按日期切分日志文件 --> 192 <appender-ref ref="RollingFileAppenderByDate" /> 193 <!-- 按日期切分日志文件,並將日期作為日志文件的名字 --> 194 <appender-ref ref="RollingFileAppenderNameByDate" /> 195 <!-- 既按大小又按日期切分日志文件 --> 196 <appender-ref ref="RollingFileAppenderBySizeAndDate" /> 197 <!-- 將日志利用ADO.NET記錄到數據庫中 --> 198 <appender-ref ref="AdoNetAppender_SQLServer" /> 199 </root> 200 </log4net> 201 </configuration>
至此,關於Log4net的基本用法就講述完畢,上述內容的代碼可以到以下地址下載:Download
參考文章:
1、Apache log4net Config Examples
2、Apache log4netTM SDK
3、Log4net Tutorial