生产关系log4Net的配置文件结构中下;
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="HR.Class.Log" type="HR.Class.Log.Config.HR.Class.LogConfigurationSectionHandler,HR.Class.Log" /> </configSections> <HR.Class.Log> <!--HRAdoNet:将日志写入数据库表--> <appender name="HRAdoNet" type="HR.Class.Log.Appender.ADONetAppender"> <param name="BufferSize" value="50" /><!-- 当日志达到50条时进行一次写库操作--> <!--写入数据库的分段大小--> <param name="ConnectionType" value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <param name="ConnectionString" value="Server=localhost;Database=AuditSystem;User ID=sa;Password=system;Trusted_Connection=False" /> <param name="CommandType" value="StoredProcedure" /> <param name="CommandText" value="sp_HR_Log" /> <!--spLog_Create:存储过程名称--> <param name="Parameter"> <param name="ParameterName" value="@log_date" /> <param name="DbType" value="DateTime" /> <param name="Layout" type="HR.Class.Log.Layout.RawTimeStampLayout" /> </param> <param name="Parameter"> <param name="ParameterName" value="@thread" /> <param name="DbType" value="String" /> <param name="Size" value="255" /> <param name="Layout" type="HR.Class.Log.Layout.PatternLayout"> <param name="ConversionPattern" value="%t" /> </param> </param> <param name="Parameter"> <param name="ParameterName" value="@log_level" /> <param name="DbType" value="String" /> <param name="Size" value="50" /> <param name="Layout" type="HR.Class.Log.Layout.PatternLayout"> <param name="ConversionPattern" value="%p" /> </param> </param> <param name="Parameter"> <param name="ParameterName" value="@logger" /> <param name="DbType" value="String" /> <param name="Size" value="255" /> <param name="Layout" type="HR.Class.Log.Layout.PatternLayout"> <param name="ConversionPattern" value="%c" /> </param> </param> <param name="Parameter"> <param name="ParameterName" value="@message" /> <param name="DbType" value="String" /> <param name="Size" value="4000" /> <param name="Layout" type="HR.Class.Log.Layout.PatternLayout"> <param name="ConversionPattern" value="%m" /> </param> </param> <param name="Parameter"> <param name="ParameterName" value="@exception" /> <param name="DbType" value="String" /> <param name="Size" value="2000" /> <param name="Layout" type="HR.Class.Log.Layout.ExceptionLayout" /> </param> </appender> <!--HRSMTPAppender:将日志发送邮件--> <appender name="HRSMTPAppender" type="HR.Class.Log.Appender.SMTPAppender"> <authentication value="Basic" /> <To value="[email protected]"/> <From value="[email protected]" /> <Subject value="财务数据审计分析系统:日志" /> <SmtpHost value="smtp.163.com" /> <Username value="[email protected]" /> <Password value="sgj13002945392" /> <param name="BufferSize" value="10" /> <param name="Lossy" value="true" /> <evaluator type="HR.Class.Log.Core.LevelEvaluator"> <param name="Threshold" value="Fatal" /> </evaluator> <layout type="HR.Class.Log.Layout.PatternLayout"> <param name="ConversionPattern" value="%newline%date [%thread] %-5level %logger [%property{NDC}] - %message%newline%newline%newline" /> </layout> </appender> <!--LocalFileAppender:将日志写入本地文件--> <appender name="LocalFileAppender" type="HR.Class.Log.Appender.RollingFileAppender"> <param name="File" value="System\SystemLog.Log" /> <param name="AppendToFile" value="true" /> <param name="MaxSizeRollBackups" value="10" /> <param name="MaximumFileSize" value="5MB" /> <param name="RollingStyle" value="Size" /> <param name="StaticLogFileName" value="true" /> <layout type="HR.Class.Log.Layout.PatternLayout"> <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" /> </layout> </appender> <root> <level value="ALL" /> <appender-ref ref="HRAdoNet" /> <appender-ref ref="HRSMTPAppender" /> <appender-ref ref="LocalFileAppender" /> </root> </HR.Class.Log> </configuration>
Log4Net把日志保存到数据库和发Email的例子
通过Log4Net把日志保存到数据库和发送Email通知的例子,本例子运行在SQL SERVER上
1. 建立数据库的表和存储过程 CREATE TABLE [dbo].[LogTest] ( [LogID] [int] IDENTITY (1, 1) NOT NULL , [LogDate] [datetime] NOT NULL , [LogThread] [varchar] (255) COLLATE Chinese_PRC_CI_AS NULL , [LogLevel] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL , [Logger] [varchar] (255) COLLATE Chinese_PRC_CI_AS NULL , [LogMessage] [varchar] (4000) COLLATE Chinese_PRC_CI_AS NULL , [LogException] [varchar] (2000) COLLATE Chinese_PRC_CI_AS NULL ) ON [PRIMARY] GO CREATE PROCEDURE dbo.spLog_Create @log_date datetime, @thread varchar(255), @log_level varchar(50), @logger varchar(255), @message varchar(4000), @exception varchar(2000) as INSERT INTO LogTest ( LogDate, LogThread, LogLevel, Logger, LogMessage, LogException ) VALUES ( @log_date, @thread, @log_level, @logger, @message, @exception ) GO 2. Log4Net的配置 在Web.Config或App.Config文件的内容 <?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="Xipu.Com.Log" type="Xipu.Com.Log.Config.Xipu.Com.LogConfigurationSectionHandler,Xipu.Com.Log" /> </configSections> <Xipu.Com.Log> <appender name="MyADO" type="Xipu.Com.Log.Appender.ADONetAppender"> <param name="BufferSize" value="100" /> <param name="ConnectionType" value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <param name="ConnectionString" value="Server=localhost;Database=Test;User ID=sa;Password=sa;Trusted_Connection=False" /> <param name="CommandType" value="StoredProcedure" /> <param name="CommandText" value="spLog_Create" /> <param name="Parameter"> <param name="ParameterName" value="@log_date" /> <param name="DbType" value="DateTime" /> <param name="Layout" type="Xipu.Com.Log.Layout.RawTimeStampLayout" /> </param> <param name="Parameter"> <param name="ParameterName" value="@thread" /> <param name="DbType" value="String" /> <param name="Size" value="255" /> <param name="Layout" type="Xipu.Com.Log.Layout.PatternLayout"> <param name="ConversionPattern" value="%t" /> </param> </param> <param name="Parameter"> <param name="ParameterName" value="@log_level" /> <param name="DbType" value="String" /> <param name="Size" value="50" /> <param name="Layout" type="Xipu.Com.Log.Layout.PatternLayout"> <param name="ConversionPattern" value="%p" /> </param> </param> <param name="Parameter"> <param name="ParameterName" value="@logger" /> <param name="DbType" value="String" /> <param name="Size" value="255" /> <param name="Layout" type="Xipu.Com.Log.Layout.PatternLayout"> <param name="ConversionPattern" value="%c" /> </param> </param> <param name="Parameter"> <param name="ParameterName" value="@message" /> <param name="DbType" value="String" /> <param name="Size" value="4000" /> <param name="Layout" type="Xipu.Com.Log.Layout.PatternLayout"> <param name="ConversionPattern" value="%m" /> </param> </param> <param name="Parameter"> <param name="ParameterName" value="@exception" /> <param name="DbType" value="String" /> <param name="Size" value="2000" /> <param name="Layout" type="Xipu.Com.Log.Layout.ExceptionLayout" /> </param> </appender> <appender name="SMTPAppender" type="Xipu.Com.Log.Appender.SMTPAppender"> <BufferSize value="1" /> <param name="To" value="[email protected]"/> <param name="From" value="[email protected]" /> <Subject value="Xipu.Com.Log Error Message" /> <SMTPHost value="mail.cdce.cn" /> <Username value="dengzebo" /> <Password value="ILOVEYOU" /> <param name="LocationInfo" value="false" /> <param name="BufferSize" value="5" /> <!--说明: "BufferSize"设置日志缓存,存储到512后一起一个Email发送,如不设此项,每记一个日志,发一条Email--> <!-- <param name="Lossy" value="true" /> <evaluator type="Xipu.Com.Log.spi.LevelEvaluator"> <param name="Threshold" value="WARN" /> </evaluator> --> <layout type="Xipu.Com.Log.Layout.PatternLayout"> <param name="ConversionPattern" value="%n%d [%t] %-5p %c [%x] - %m%n%n%n" /> </layout> </appender> <root> <level value="ALL" /> <appender-ref ref="MyADO" /> <appender-ref ref="SMTPAppender" /> </root> </Xipu.Com.Log> </configuration> 3. 在AssemblyInfo.cs文件中加入以下行: [assembly: Xipu.Com.Log.Config.XmlConfigurator(ConfigFile = "App.config", ConfigFileExtension = "config", Watch = true)] 4. 编写测试代码: Xipu.Com.Log.ILog log = Xipu.Com.Log.LogManager.GetLogger("MyLoggerTest"); try { log.Info("这是hansong的LOG INFO测试!"); log.Debug("这是hansong的LOG DEBUG测试!"); throw new Exception("这是hansong的LOG ERROR测试!"); } catch (Exception er) { log.Error("错误日志", er); }5.其它文档资料
上述配置好后,即可封闭成组件。首先要在将要封闭成的组件中引用log4Net.dll文件
组件代码如下:
注意:要在这个封闭的项目下的AssemblyInfo.cs文件中加下:
[assembly:HR.Class.Log.Config.XmlConfigurator(ConfigFile="App.config",ConfigFileExtension="config",Watch=true)]
namespace HR.Class.Log.WriteLog { /// <summary> /// 当出现错误时,必须指定日志的类型,一般应用于系统出现错误后, /// 如在Catch中用它,无论错误是普通的还是致命的 /// </summary> public enum ErrorLogType { /// <summary> /// 致命的错误 /// </summary> FatalLog, /// <summary> /// 错误的错误 /// </summary> ErrorLog } /// <summary> /// 当需要提示时,必须指定日志的类型,一般应用于当系统提示用户怎样操作, /// 哪怕是警告类操作,都应该用此类型 /// </summary> public enum NoramlLogType { /// <summary> /// 普通操作日志 /// </summary> InfoLog, /// <summary> /// 警告日志 /// </summary> WarnLog, /// <summary> /// 调试日志 /// </summary> DebugLog } public static class WriteLog { public static void Write(string ModuleClassName, string FunctionName, string ErrorString, Exception Ex, HR.Class.Log.WriteLog.ErrorLogType LogType) { try { HR.Class.Log.ILog log = HR.Class.Log.LogManager.GetLogger("[" + ModuleClassName + "].[" + FunctionName + "]"); if (LogType == HR.Class.Log.WriteLog.ErrorLogType.ErrorLog) { log.Error(ErrorString, Ex); } else if (LogType == HR.Class.Log.WriteLog.ErrorLogType.FatalLog) { log.Fatal(ErrorString, Ex); } } catch(Exception ET) { HR.Class.Log.ILog log = HR.Class.Log.LogManager.GetLogger("[HR.Class.Log.WriteLog].[Write]:ErrorLogType"); log.Error("写入日志时出错" + "[" + ModuleClassName + "].[" + FunctionName + "]", ET); } } public static void Write(string ModuleClassName, string FunctionName, string Infostring, HR.Class.Log.WriteLog.NoramlLogType LogType) { try { HR.Class.Log.ILog log = HR.Class.Log.LogManager.GetLogger("[" + ModuleClassName + "].[" + FunctionName + "]"); if (LogType == HR.Class.Log.WriteLog.NoramlLogType.InfoLog) { log.Info(Infostring); } else if (LogType == HR.Class.Log.WriteLog.NoramlLogType.WarnLog) { log.Warn(Infostring); } else if (LogType == HR.Class.Log.WriteLog.NoramlLogType.DebugLog) { log.Debug(Infostring); } } catch (Exception ex) { HR.Class.Log.ILog log = HR.Class.Log.LogManager.GetLogger("[HR.Class.Log.WriteLog].[Write]:ErrorLogType"); log.Error("写入日志时出错" + "[" + ModuleClassName + "].[" + FunctionName + "]", ex); } } } }