log4Net简介

使用log4Net可以将系统听日志保存到DB、日志文件、邮箱中等,本文介绍这三种三方式。
生产关系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);
            }

        }
    }
  
}


猜你喜欢

转载自new-fighter.iteye.com/blog/1896585