使用log4net写自定义日志

在使用log4net写Web服务器端日志的时候,通常需要一些自定义的参数,比如请求的url,method,以及用户名等等,而log4net中默认的Log接口只提供了很少的参数。
    在网上找的其他的解决方案,都是要重写很多地方,而且经常都是不全,让人很难理解,我反正是看不懂。。。
    对俺们这些整天玩黑科技的人来说,自然要用一些不那么正常的方式来解决问题。

在这里,黑科技的意思是指绕过API或者直接修改API,其中带有一定的危险性的代码。

简单研究了一下log4net的源码(使用ILSpy反编译,野路子必备神器),发现,ILog接口的实现是log4net.Core.LogImpl,LogImpl中的Log实际方法使用了一个ILogger类型的属性Logger,这个ILogger的实现是在log4net.Repository.Hierarchy.Logger中。

在Logger类中,有一个方法,是Log,这个Log方法有两个版本,一个有三个参数,包含日志的多种参数,另一个,则是重点,它有一个参数,log4net.Core.LoggingEvent类型的参数。这里就到了关键点了。LoggingEvent中,有一个Properties属性,这个属性的内部包含了一个Hashtable。而直接使用this[key]索引器中的设置可以添加其他Key的元素。

接下来就是如何将这些预存到Properties中的数据取出来了。

log4net的基本配置:

 1 <configuration>
 2     <configSections>
 3         <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
 4     <configSections>
 5       <log4net>
 6     <appender name="ADONetAppender" type="log4net.Appender.ADONetAppender">
 7       <bufferSize value="1"/>
 8       <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
 9       <connectionString value="data source=.;initial catalog=LogDatabase;persist security info=True;user id=sa;password=******;App=Application.Logger"/>
10       <commandText value="INSERT INTO Log ([Date],[Level],[Url],[UserName],[Method],[Message],[Exception]) VALUES (@log_date, @log_level, @url,@username, @method, @message, @exception)"/>
11       <parameter>
12         <parameterName value="@log_date"/>
13         <dbType value="DateTime"/>
14         <layout type="log4net.Layout.RawTimeStampLayout"/>
15       </parameter>
16       <parameter>
17         <parameterName value="@log_level"/>
18         <dbType value="String"/>
19         <size value="50"/>
20         <layout type="log4net.Layout.PatternLayout">
21           <conversionPattern value="%level"/>
22         </layout>
23       </parameter>
24       <parameter>
25         <parameterName value="@url"/>
26         <dbType value="String"/>
27         <size value="255"/>
28         <layout type="log4net.Layout.PatternLayout">
29           <conversionPattern value="%property{Url}"/>
30         </layout>
31       </parameter>
32       <parameter>
33         <parameterName value="@username"/>
34         <dbType value="String"/>
35         <size value="50"/>
36         <layout type="log4net.Layout.PatternLayout">
37           <conversionPattern value="%property{UserName}"/>
38         </layout>
39       </parameter>
40       <parameter>
41         <parameterName value="@method"/>
42         <dbType value="String"/>
43         <size value="50"/>
44         <layout type="log4net.Layout.PatternLayout">
45           <conversionPattern value="%property{Method}"/>
46         </layout>
47       </parameter>
48       <parameter>
49         <parameterName value="@message"/>
50         <dbType value="String"/>
51         <size value="4000"/>
52         <layout type="log4net.Layout.PatternLayout">
53           <conversionPattern value="%message"/>
54         </layout>
55       </parameter>
56       <parameter>
57         <parameterName value="@exception"/>
58         <dbType value="String"/>
59         <size value="2000"/>
60         <layout type="log4net.Layout.ExceptionLayout"/>
61       </parameter>
62     </appender>
63     <root>
64       <level value="INFO"/>
65       <appender-ref ref="ADONetAppender"/>
66     </root>
67   </log4net>
68 </configuration>

这里的%property{Method}会将Method这个Key中的数据赋值到这里。

数据库的数据表定义为:

 1 CREATE TABLE [dbo].[Log]
 2 (
 3     [Id] INT NOT NULL PRIMARY KEY Identity,
 4     [Date] DATETIME NULL,
 5     [Level] VARCHAR(50) NULL,
 6     [Url] VARCHAR(255) NULL,
 7     [UserName] VARCHAR(50) NULL,
 8     [Method] VARCHAR(50) NULL,
 9     [Message] VARCHAR(4000) NULL,
10     [Exception] VARCHAR(2000) NULL,
11 )

接下来就是程序中的代码了,在这里,我就不实现那么些类了,就写了一个WebLog静态类。

 1 using log4net;
 2 using log4net.Core;
 3 using System;
 4
 5 namespace UI.Web.Log
 6 {
 7     public static class WebLogger
 8     {
 9         static ILog log = LogManager.GetLogger(typeof(WebLogger));
10
11         static void Log(string url, string userName, string method, string message, Level level, Exception exception = null)
12         {
13             if (level == null)
14                 level = Level.Debug;
15             var loggingEvent = new LoggingEvent(typeof(WebLogger), log.Logger.Repository, "WebLogger", level, message, exception);
16             loggingEvent.Properties["Url"] = url;
17             loggingEvent.Properties["UserName"] = userName;
18             loggingEvent.Properties["Method"] = method;
19             log.Logger.Log(loggingEvent);
20         }
21
22         public static void Debug(string url, string userName, string method, string message, Exception exception = null)
23         {
24             Log(url, userName, method, message, Level.Debug, exception);
25         }
26
27         public static void Info(string url, string userName, string method, string message, Exception exception = null)
28         {
29             Log(url, userName, method, message, Level.Info, exception);
30         }
31
32         public static void Warn(string url, string userName, string method, string message, Exception exception)
33         {
34             Log(url, userName, method, message, Level.Warn, exception);
35         }
36
37         public static void Error(string url, string userName, string method, string message, Exception exception)
38         {
39             Log(url, userName, method, message, Level.Error, exception);
40         }
41
42         public static void Fatal(string url, string userName, string method, string message, Exception exception)
43         {
44             Log(url, userName, method, message, Level.Fatal, exception);
45         }
46     }
47 }

在这里,就是将数据添加到loggingEvent对象中。

这样,就可以将自定义的数据填充到数据库中了。

时间: 2024-08-28 16:09:47

使用log4net写自定义日志的相关文章

Log4net 写文件日志与数据库日志

一.数据库日志表结构 [sql] view plaincopy CREATE TABLE [dbo].[WebLog_Msg]( [LogID] [int] IDENTITY(1,1) NOT NULL, [Date] [datetime] NOT NULL, [Thread] [nvarchar](255) NULL, [Level] [nvarchar](50) NULL, [Logger] [nvarchar](255) NULL, [Message] [nvarchar](2000) N

YII2 自定义日志路径

YII 提供的日志写入方法: 1.Yii::getLogger()->log($message, $level, $category = 'application') 2.Yii::trace($message, $category = 'application'); 3.Yii::error($message, $category = 'application');4.Yii::warning($message, $category = 'application');5.Yii::info($

log4net修改数据库连接字符串和写自定义信息

最近项目需要用log4net来写日志,因为整个平台式在sharepoint上,我们需要记录具体是哪个子站点发生的日志,因此需要再原来的log表里面添加一个自定义信息列.由于平台的安全性要求,我们需要对连接字符串加密.连接字符串的信息是在AdoNetAppender读取的,所以我们要扩展该类.而自定义消息我们需要扩展PatternLayout类.其实有关log4net的介绍网上已经很多了,如log4net.dll使用 具体的代码如下: #region Log helper public class

(二)使用log4net写入数据库自定义日志

1.配置项目环境 1.1 本文只显示需要修改配置的操作,初次引入log4net环境的请参考上文. 1.2 安装mysql-connector-net.msi环境,下载地址.并手动生成数据库日志信息表. 2.配置log4net.config 2.1 修改log4net.config <?xml version="1.0" encoding="utf-8" ?> <configuration> <log4net> <!-- My

【Z13区】《Log4net写出适合自己的日志类》第一篇

我想先知道为什么要用log4net写日志类 1.上来就是干,先实践后理论 a.创建控制台应用

NLog 自定义日志内容,写日志到数据库;修改Nlog.config不起作用的原因

NLog的安装请百度,我安装的是3.2.NLog可以向文件,数据库,邮件等写日志,想了解请百度,这里讲怎么写入数据库,及常常会遇到的问题: 1.layout render NLog内置了很多日志内容格式,样子就是${longdate}之类的,详见:https://github.com/NLog/NLog/wiki/Layout-Renderers 2.如果我们要自定义日志: <target xsi:type="Database" name="LogOnlog"

也用 Log4Net 之将日志记录到数据库的配置 (一)

也用 Log4Net  之将日志记录到数据库的配置 (一) 前段时间我一直想做一个通用一点的日志记录系统,可以便于不同的业务组调用进行日志记录及分析.本来打算着自己下手写一个,后面发现各业务组可能会需要不同的记录方式,比如利用数据库来记录,用txt的文件形式来记录,当然,这些都是最常用的记录方式.而且不同的业务组都希望有自己的记录数据表,不希望和其他业务组的数据混在一起.于是我先前设想的架构方式也就付之一炬了,因为不够灵活,而且实现难度大.周期长.恰在此时想起了之前做项目的时候用的 Log4Ne

也用 Log4Net 之将日志记录到数据库的后台实现 (二)

 大家下午好,昨天讲了配置,今天我们讲讲后台实现,在完成了后台实现后,我们才能真正意义上的解决把自定义属性字段值录入到数据库中. 在开写之前我先着重强调一下,“日志”的概念非常广泛,有错误日志.操作日志.访问日志.事件日志等等.我们并不提倡把所有的日志都记录到数据库,因为这样做没有必要.同时如果日志数据表与业务表同在一个数据库的话,频繁的记录日志的操作会影响性能(Log4Net提供了缓存机制,可以在缓存日志数据达到设定值,比如200条时,Log4Net会批量将数据录入到数据库中.即便是这么好的机

Log4Net 之将日志记录到数据库的配置 (一)

前段时间我一直想做一个通用一点的日志记录系统,可以便于不同的业务组调用进行日志记录及分析.本来打算着自己下手写一个,后面发现各业务组可能会需要不同的记录方式,比如利用数据库来记录,用txt的文件形式来记录,当然,这些都是最常用的记录方式.而且不同的业务组都希望有自己的记录数据表,不希望和其他业务组的数据混在一起.于是我先前设想的架构方式也就付之一炬了,因为不够灵活,而且实现难度大.周期长.恰在此时想起了之前做项目的时候用的 Log4Net 的开源日志框架,于是又从新Google了一下,发现,真棒