Log4net 数据库存储(四)
1.新建一个空的ASP.Net 空项目,然后添加Default.aspx窗体
2.添加配置文件:log4net.config
1 <?xml version="1.0" encoding="utf-8"?> 2 <configuration> 3 4 <system.web> 5 <compilation debug="true" targetFramework="4.0" /> 6 </system.web> 7 8 <configSections> 9 <!--添加配置节点--> 10 <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> 11 </configSections> 12 13 <log4net> 14 <!--定义输出到数据库--> 15 <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender"> 16 <!--日志缓存写入条数--> 17 <!--bufferSize表示批处理的日志事件,可以避免每次日志事件都访问数据库,原本是<bufferSize value="100" />一百条才插入--> 18 <bufferSize value="1" /> 19 <!--日志数据库连接串--> 20 <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 21 <connectionString value="DATABASE=log4netDB;SERVER=DESKTOP-F0T373H\WZH;UID=sa;PWD=18855162320;Connect Timeout=15;" /> 22 <!--日志数据库脚本--> 23 <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[UserID],[UserName],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger,@UserId,@UserName, @message, @exception)" /> 24 <!--日志时间LogDate --> 25 <parameter> 26 <parameterName value="@log_date" /> 27 <dbType value="DateTime" /> 28 <layout type="log4net.Layout.RawTimeStampLayout" /> 29 </parameter> 30 <parameter> 31 <parameterName value="@thread" /> 32 <dbType value="String" /> 33 <size value="255" /> 34 <layout type="log4net.Layout.PatternLayout"> 35 <conversionPattern value="%thread" /> 36 </layout> 37 </parameter> 38 <!--日志类型LogLevel --> 39 <parameter> 40 <parameterName value="@log_level" /> 41 <dbType value="String" /> 42 <size value="50" /> 43 <layout type="log4net.Layout.PatternLayout"> 44 <conversionPattern value="%level" /> 45 </layout> 46 </parameter> 47 <!--日志对象LogLogger --> 48 <parameter> 49 <parameterName value="@logger" /> 50 <dbType value="String" /> 51 <size value="255" /> 52 <layout type="log4net.Layout.PatternLayout"> 53 <conversionPattern value="%logger" /> 54 </layout> 55 </parameter> 56 <!--自定义UserId --> 57 <parameter> 58 <parameterName value="@UserId" /> 59 <dbType value="String" /> 60 <size value="20" /> 61 <layout type="log4net保存到数据库中.MyLayout"> 62 <conversionPattern value="%Property{UserID}" /> 63 </layout> 64 </parameter> 65 <!--自定义UserName --> 66 <parameter> 67 <parameterName value="@UserName" /> 68 <dbType value="String" /> 69 <size value="50" /> 70 <layout type="log4net保存到数据库中.MyLayout"> 71 <conversionPattern value="%Property{UserName}" /> 72 </layout> 73 </parameter> 74 <!--日志信息Message --> 75 <!--<parameter> 76 <parameterName value="@message" /> 77 <dbType value="String" /> 78 <size value="4000" /> 79 <layout type="log4net.Layout.PatternLayout"> 80 <conversionPattern value="%message" /> 81 </layout> 82 </parameter>--> 83 <!--自定义Message --> 84 <parameter> 85 <parameterName value="@Message" /> 86 <dbType value="String" /> 87 <size value="200" /> 88 <layout type="log4net保存到数据库中.MyLayout"> 89 <conversionPattern value="%Property{Message}" /> 90 </layout> 91 </parameter> 92 <!--异常信息Exception --> 93 <parameter> 94 <parameterName value="@exception" /> 95 <dbType value="String" /> 96 <size value="2000" /> 97 <layout type="log4net.Layout.ExceptionLayout" /> 98 </parameter> 99 </appender> 100 <root> 101 <!--配置可输出日志级别--> 102 <level value="all"/> 103 <!--应用配置--> 104 <appender-ref ref="AdoNetAppender"/> 105 </root> 106 </log4net> 107 108 </configuration>
3.在项目中的Properties中AssemblyInfo.cs的末尾添加
1 [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
4.添加实体类:LogEntity.cs
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 6 namespace log4net保存到数据库中 7 { 8 public class LogEntity 9 { 10 public string UserID { get; set; } 11 public string UserName { get; set; } 12 13 public string Message { get; set; } 14 } 15 }
5.添加扩展类:MyPatternConverter.cs , MyLayout.cs 来扩展PatternLayout
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using log4net.Layout.Pattern; 6 using System.Reflection; 7 8 namespace log4net保存到数据库中 9 { 10 public class MyPatternConverter:PatternLayoutConverter 11 { 12 protected override void Convert(System.IO.TextWriter writer, log4net.Core.LoggingEvent loggingEvent) 13 { 14 if (Option != null) 15 WriteObject(writer, loggingEvent.Repository, LookupProperty(Option, loggingEvent)); 16 else 17 WriteDictionary(writer, loggingEvent.Repository, loggingEvent.GetProperties()); 18 } 19 20 //通过反射获取传入的日志对象的某个属性的值 21 private object LookupProperty(string property,log4net.Core.LoggingEvent loggingEvent) 22 { 23 object propertyvalue = string.Empty; 24 PropertyInfo propertyInfo = loggingEvent.MessageObject.GetType().GetProperty(property); 25 26 if (propertyInfo != null) 27 propertyvalue = propertyInfo.GetValue(loggingEvent.MessageObject, null); 28 return propertyvalue; 29 } 30 } 31 }
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using log4net.Layout; 6 7 namespace log4net保存到数据库中 8 { 9 public class MyLayout:PatternLayout 10 { 11 public MyLayout() 12 { 13 this.AddConverter("Property", typeof(MyPatternConverter)); 14 } 15 } 16 }
6.添加使用类:LogHelper.cs
1 using System; 2 using System.Diagnostics; 3 using System.IO; 4 5 using log4net; 6 7 namespace log4net保存到数据库中 8 { 9 public class LogHelper 10 { 11 /// <summary> 12 /// LoggerName 13 /// </summary> 14 public static string LoggerName = string.Empty; 15 /// <summary> 16 /// 用户ID 17 /// </summary> 18 public static string UserID = string.Empty; 19 /// <summary> 20 /// 用户名称 21 /// </summary> 22 public static string UserName = string.Empty; 23 24 private static ILog iLog; 25 private static LogEntity logEntity; 26 27 /// <summary> 28 /// 接口 29 /// </summary> 30 private static ILog log 31 { 32 get 33 { 34 35 if (iLog == null) 36 { 37 iLog = log4net.LogManager.GetLogger(LoggerName); 38 } 39 else 40 { 41 if (iLog.Logger.Name != LoggerName) 42 { 43 iLog = log4net.LogManager.GetLogger(LoggerName); 44 } 45 } 46 47 return iLog; 48 } 49 } 50 51 /// <summary> 52 /// 构造消息实体 53 /// </summary> 54 /// <param name="message"></param> 55 /// <returns></returns> 56 private static LogEntity BuildMessageMode(string message) 57 { 58 if (logEntity == null) 59 { 60 logEntity = new LogEntity(); 61 logEntity.UserID = UserID; 62 logEntity.UserName = UserName; 63 logEntity.Message = message; 64 } 65 else 66 logEntity.Message = message; 67 68 return logEntity; 69 } 70 71 /// <summary> 72 /// 调试 73 /// </summary> 74 /// <param name="message">消息</param> 75 public static void Debug(string message) 76 { 77 if (log.IsDebugEnabled) 78 log.Debug(BuildMessageMode(message)); 79 } 80 81 /// <summary> 82 /// 调试 83 /// </summary> 84 /// <param name="message">消息</param> 85 /// <param name="exception">异常</param> 86 public static void Debug(string message, Exception ex) 87 { 88 if (log.IsDebugEnabled) 89 log.Debug(BuildMessageMode(message), ex); 90 } 91 92 /// <summary> 93 /// 信息 94 /// </summary> 95 /// <param name="message">消息</param> 96 public static void Info(string message) 97 { 98 if (log.IsInfoEnabled) 99 log.Info(BuildMessageMode(message)); 100 } 101 102 /// <summary> 103 /// 信息 104 /// </summary> 105 /// <param name="message">消息</param> 106 /// <param name="exception">异常</param> 107 public static void Info(string message, Exception ex) 108 { 109 if (log.IsInfoEnabled) 110 log.Info(BuildMessageMode(message), ex); 111 } 112 113 /// <summary> 114 /// 一般错误 115 /// </summary> 116 /// <param name="message">消息</param> 117 public static void Error(string message) 118 { 119 if (log.IsErrorEnabled) 120 log.Error(BuildMessageMode(message)); 121 } 122 123 /// <summary> 124 /// 一般错误 125 /// </summary> 126 /// <param name="message">消息</param> 127 /// <param name="exception">异常</param> 128 public static void Error(string message, Exception exception) 129 { 130 if (log.IsErrorEnabled) 131 log.Error(BuildMessageMode(message), exception); 132 } 133 134 /// <summary> 135 /// 警告 136 /// </summary> 137 /// <param name="message">消息</param> 138 public static void Warn(string message) 139 { 140 if (log.IsWarnEnabled) 141 log.Warn(BuildMessageMode(message)); 142 } 143 144 /// <summary> 145 /// 警告 146 /// </summary> 147 /// <param name="message">消息</param> 148 /// <param name="exception">异常</param> 149 public static void Warn(string message, Exception ex) 150 { 151 if (log.IsWarnEnabled) 152 log.Warn(BuildMessageMode(message), ex); 153 } 154 155 /// <summary> 156 /// 严重 157 /// </summary> 158 /// <param name="message">消息</param> 159 public static void Fatal(string message) 160 { 161 if (log.IsFatalEnabled) 162 log.Fatal(BuildMessageMode(message)); 163 } 164 165 /// <summary> 166 /// 严重 167 /// </summary> 168 /// <param name="message">消息</param> 169 /// <param name="exception">异常</param> 170 public static void Fatal(string message, Exception ex) 171 { 172 if (log.IsFatalEnabled) 173 log.Fatal(BuildMessageMode(message), ex); 174 } 175 } 176 }
7.在Default.aspx.cs中使用:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Web.UI; 6 using System.Web.UI.WebControls; 7 using log4net; 8 9 namespace log4net保存到数据库中 10 { 11 public partial class Default : System.Web.UI.Page 12 { 13 protected void Page_Load(object sender, EventArgs e) 14 { 15 LogHelper.LoggerName = typeof(Default).ToString(); 16 LogHelper.UserID = "12345"; 17 LogHelper.UserName = "me"; 18 int i = 0; 19 try 20 { 21 22 int b = 3 / i; 23 } 24 catch (Exception ex) 25 { 26 LogHelper.Error(ex.Message, ex); 27 } 28 LogHelper.Fatal("Fatal",new Exception("异常信息")); 29 LogHelper.Info("Info"); 30 LogHelper.Warn("Warn"); 31 LogHelper.Debug("Debug"); 32 } 33 } 34 }
8.配置数据库SQL Server2012:创建数据库log4netDB
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 [UserID] [varchar] (20) NOT NULL, 8 [UserName] [varchar] (50) NOT NULL, 9 [Message] [varchar] (4000) NOT NULL, 10 [Exception] [varchar] (2000) NULL 11 )
9.运行
10.帮助文档:
http://www.cnblogs.com/izreo/p/5651139.html
http://www.cnblogs.com/jiajinyi/p/5884930.html