Log4net入门(SQL篇)

  我们在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="&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     <!-- 将日志利用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

posted @ 2016-12-14 14:35  编码之道  阅读(...)  评论(... 编辑 收藏