log4net详细介绍

Laughing
2018-03-11 / 0 评论 / 1,158 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2021年04月27日,已超过1398天没有更新,若内容或图片失效,请留言反馈。

log4net介绍

log4net是一个功能著名的开源日志记录组件。利用log4net可以方便地将日志信息记录到文件、控制台、Windows事件日志和数据库(包括MS SQL Server, Access, Oracle9i,Oracle8i,DB2,SQLite)中。并且我们还可以记载控制要记载的日志级别,可以记载的日志类别包括:FATAL(致命错误)、ERROR(一般错误)、WARN(警告)、INFO(一般信息)、DEBUG(调试信息)。

log4net安装

这里不多过多介绍了,直接通过nuget安装即可。

log4net.config配置

<?xml version="1.0" encoding="utf-8" ?>  
<configuration>  
  <configSections>  
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>  
  </configSections>  
  <log4net>  
    <!--根配置-->  
    <root>  
      <!--日志级别:可选值: ERROR > WARN > INFO > DEBUG -->  
      <level value="ERROR"/>  
      <level value="WARN"/>  
      <level value="INFO"/>  
      <level value="DEBUG"/>  
      <appender-ref ref="ErrorLog" />  
      <appender-ref ref="WarnLog" />  
      <appender-ref ref="InfoLog" />  
      <appender-ref ref="DebugLog" />  
      <appender-ref ref="Sqlserver" />  
    </root>  
      
    <!-- 错误 Error.log-->  
    <appender name="ErrorLog" type="log4net.Appender.RollingFileAppender">  
      <!--目录路径,可以是相对路径或绝对路径-->  
      <param name="File" value="Log\Ide_Net_Cn_log"/>  
      <!--文件名,按日期生成文件夹-->  
      <param name="DatePattern" value="/yyyy-MM-dd/&quot;Error.log&quot;"/>  
      <!--追加到文件-->  
      <appendToFile value="true"/>  
      <!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]-->  
      <rollingStyle value="Composite"/>  
      <!--写到一个文件-->  
      <staticLogFileName value="false"/>  
      <!--单个文件大小。单位:KB|MB|GB-->  
      <maximumFileSize value="200MB"/>  
      <!--最多保留的文件数,设为"-1"则不限-->  
      <maxSizeRollBackups value="-1"/>  
      <!--日志格式-->  
      <layout type="log4net.Layout.PatternLayout">  
        <conversionPattern value="%message"/>  
      </layout>  
      <filter type="log4net.Filter.LevelRangeFilter">  
        <param name="LevelMin" value="ERROR" />  
        <param name="LevelMax" value="ERROR" />  
      </filter>  
    </appender>  
      
    <!-- 警告 Warn.log-->  
    <appender name="WarnLog" type="log4net.Appender.RollingFileAppender">  
      <!--目录路径,可以是相对路径或绝对路径-->  
      <param name="File" value="Log\Ide_Net_Cn_log"/>  
      <!--文件名,按日期生成文件夹-->  
      <param name="DatePattern" value="/yyyy-MM-dd/&quot;Warn.log&quot;"/>  
      <!--追加到文件-->  
      <appendToFile value="true"/>  
      <!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]-->  
      <rollingStyle value="Composite"/>  
      <!--写到一个文件-->  
      <staticLogFileName value="false"/>  
      <!--单个文件大小。单位:KB|MB|GB-->  
      <maximumFileSize value="200MB"/>  
      <!--最多保留的文件数,设为"-1"则不限-->  
      <maxSizeRollBackups value="-1"/>  
      <!--日志格式-->  
      <layout type="log4net.Layout.PatternLayout">  
        <conversionPattern value="%message"/>  
      </layout>  
      <filter type="log4net.Filter.LevelRangeFilter">  
        <param name="LevelMin" value="WARN" />  
        <param name="LevelMax" value="WARN" />  
      </filter>  
    </appender>  
  
    <!-- 信息 Info.log-->  
    <appender name="InfoLog" type="log4net.Appender.RollingFileAppender">  
      <!--目录路径,可以是相对路径或绝对路径-->  
      <param name="File" value="Log\Ide_Net_Cn_log"/>  
      <!--文件名,按日期生成文件夹-->  
      <param name="DatePattern" value="/yyyy-MM-dd/&quot;Info.log&quot;"/>  
      <!--追加到文件-->  
      <appendToFile value="true"/>  
      <!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]-->  
      <rollingStyle value="Composite"/>  
      <!--写到一个文件-->  
      <staticLogFileName value="false"/>  
      <!--单个文件大小。单位:KB|MB|GB-->  
      <maximumFileSize value="200MB"/>  
      <!--最多保留的文件数,设为"-1"则不限-->  
      <maxSizeRollBackups value="-1"/>  
      <!--日志格式-->  
      <layout type="log4net.Layout.PatternLayout">  
        <conversionPattern value="%message"/>  
      </layout>  
      <filter type="log4net.Filter.LevelRangeFilter">  
        <param name="LevelMin" value="INFO" />  
        <param name="LevelMax" value="INFO" />  
      </filter>  
    </appender>  
  
    <!-- 调试 Debug.log-->  
    <appender name="DebugLog" type="log4net.Appender.RollingFileAppender">  
      <!--目录路径,可以是相对路径或绝对路径-->  
      <param name="File" value="Log\Ide_Net_Cn_log"/>  
      <!--文件名,按日期生成文件夹-->  
      <param name="DatePattern" value="/yyyy-MM-dd/&quot;Debug.log&quot;"/>  
      <!--追加到文件-->  
      <appendToFile value="true"/>  
      <!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]-->  
      <rollingStyle value="Composite"/>  
      <!--写到一个文件-->  
      <staticLogFileName value="false"/>  
      <!--单个文件大小。单位:KB|MB|GB-->  
      <maximumFileSize value="200MB"/>  
      <!--最多保留的文件数,设为"-1"则不限-->  
      <maxSizeRollBackups value="-1"/>  
      <!--日志格式-->  
      <layout type="log4net.Layout.PatternLayout">  
        <conversionPattern value="%message"/>  
      </layout>  
      <filter type="log4net.Filter.LevelRangeFilter">  
        <param name="LevelMin" value="DEBUG" />  
        <param name="LevelMax" value="DEBUG" />  
      </filter>  
    </appender>  
  
    <!-- 调试 Sqlserver.log-->  
    <appender name="Sqlserver" type="log4net.Appender.ADONetAppender">  
      <!--日志缓存写入条数 设置为0时只要有一条就立刻写到数据库-->  
      <bufferSize value="0" />  
      <!--日志数据库连接串-->  
      <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />  
      <connectionString value="DATABASE=Ide_Net_Cn;SERVER=lisen.org;UID=sa;PWD=123456a?;Connect Timeout=30;" />  
      <!--日志数据库脚本-->  
      <commandText value="INSERT INTO LogDetails ([OperationTime],[Url],[Ip],[Host],[Browser],[UserName],[User],Content,ExceptionInfo,ExceptionSource,ExceptionRemark,Level) VALUES ( @OperationTime, @Url, @Ip, @Host, @Browser,@UserName,@User,@Content,@ExceptionInfo,@ExceptionSource,@ExceptionRemark,@Level)" />  
      <!--日志内码 -->  
      <!--<parameter>  
        <parameterName value="@ID" />  
        <dbType value="String" />  
        <size value="36" />  
        <layout type="Ide.Net.Cn.Util.Log.LogLayout" >  
          <conversionPattern value = "NEWID()"/>  
        </layout>  
      </parameter>-->  
  
      <!--操作时间-->  
      <parameter>  
        <parameterName value="@OperationTime" />  
        <dbType value="String" />  
        <size value="100" />  
        <layout type="Ide.Net.Cn.Util.Log.LogLayout" >  
          <conversionPattern value = "%property{OperationTime}"/>  
        </layout>  
      </parameter>  
  
      <!--url -->  
      <parameter>  
        <parameterName value="@Url" />  
        <dbType value="String" />  
        <size value="255" />  
        <layout type="Ide.Net.Cn.Util.Log.LogLayout" >  
          <conversionPattern value = "%property{Url}"/>  
        </layout>  
      </parameter>  
  
      <!--ip地址-->  
      <parameter>  
        <parameterName value="@Ip" />  
        <dbType value="String" />  
        <size value="255" />  
        <layout type="Ide.Net.Cn.Util.Log.LogLayout" >  
          <conversionPattern value = "%property{Ip}"/>  
        </layout>  
      </parameter>  
  
      <!--主机-->  
      <parameter>  
        <parameterName value="@Host" />  
        <dbType value="String" />  
        <size value="255" />  
        <layout type="Ide.Net.Cn.Util.Log.LogLayout" >  
          <conversionPattern value = "%property{Host}"/>  
        </layout>  
      </parameter>  
  
      <!--浏览器-->  
      <parameter>  
        <parameterName value="@Browser" />  
        <dbType value="String" />  
        <size value="100" />  
        <layout type="Ide.Net.Cn.Util.Log.LogLayout" >  
          <conversionPattern value = "%property{Browser}"/>  
        </layout>  
      </parameter>  
  
      <!--UserName -->  
      <parameter>  
        <parameterName value="@UserName" />  
        <dbType value="String" />  
        <size value="20" />  
        <layout type="Ide.Net.Cn.Util.Log.LogLayout" >  
          <conversionPattern value = "%property{UserName}"/>  
        </layout>  
      </parameter>  
  
      <!--用户内码-->  
      <parameter>  
        <parameterName value="@User" />  
        <dbType value="String" />  
        <size value="40" />  
        <layout type="Ide.Net.Cn.Util.Log.LogLayout" >  
          <conversionPattern value = "%property{User}"/>  
        </layout>  
      </parameter>  
  
      <!--日志内容-->  
      <parameter>  
        <parameterName value="@Content" />  
        <dbType value="String" />  
        <layout type="Ide.Net.Cn.Util.Log.LogLayout" >  
          <conversionPattern value = "%property{Content}"/>  
        </layout>  
      </parameter>  
  
      <!--异常信息-->  
      <parameter>  
        <parameterName value="@ExceptionInfo" />  
        <dbType value="String" />  
        <layout type="Ide.Net.Cn.Util.Log.LogLayout" >  
          <conversionPattern value = "%property{ExceptionInfo}"/>  
        </layout>  
      </parameter>  
  
      <!--异常来源-->  
      <parameter>  
        <parameterName value="@ExceptionSource" />  
        <dbType value="String" />  
        <layout type="Ide.Net.Cn.Util.Log.LogLayout" >  
          <conversionPattern value = "%property{ExceptionSource}"/>  
        </layout>  
      </parameter>  
  
      <!--异常信息备注-->  
      <parameter>  
        <parameterName value="@ExceptionRemark" />  
        <dbType value="String" />  
        <layout type="Ide.Net.Cn.Util.Log.LogLayout" >  
          <conversionPattern value = "%property{ExceptionRemark}"/>  
        </layout>  
      </parameter>  
  
      <!--异常等级-->  
      <parameter>  
        <parameterName value="@Level" />  
        <dbType value="String" />  
        <size value="1" />  
        <layout type="Ide.Net.Cn.Util.Log.LogLayout" >  
          <conversionPattern value = "%property{Level}"/>  
        </layout>  
      </parameter>  
    </appender>  
  
    <!--Oracle数据库-->  
    <appender name="OracleAppender" type="log4net.Appender.AdoNetAppender">  
      <!-- Oracle数据源-->  
      <connectionType value="Oracle.ManagedDataAccess.Client.OracleConnection, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />  
      <!-- Oracle连接字符串-->  
      <connectionString value="DATA SOURCE=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.3.206)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=orcl)));PASSWORD=watdb;PERSIST SECURITY INFO=True;USER ID=watdb;"/>  
      <commandText value="INSERT INTO SYS_LOG(Dates,Levels,Logger,Message,Exception,ClientUser,ClientIP,RequestUrl,Action)VALUES(:Dates,:Levels,:Logger,:Message,:Exception,:ClientUser,:ClientIP,:RequestUrl,:Action)"/>  
      <!--    
             设置缓存区大小    
             1表明有一条日志就要写入    
             如果10就表示日志到达10条时一起写入    
             -->  
      <bufferSize value="0"/>  
      <parameter>  
        <parameterName value=":Dates" />  
        <dbType value="DateTime" />  
        <layout type="log4net.Layout.RawTimeStampLayout"/>  
      </parameter>  
      <parameter>  
        <parameterName value=":Levels" />  
        <dbType value="String" />  
        <size value="50" />  
        <layout type="log4net.Layout.PatternLayout">  
          <conversionPattern value="%level" />  
        </layout>  
      </parameter>  
      <parameter>  
        <parameterName value=":Logger" />  
        <dbType value="String" />  
        <size value="200" />  
        <layout type="log4net.Layout.PatternLayout">  
          <conversionPattern value="%logger" />  
        </layout>  
      </parameter>  
      <parameter>  
        <parameterName value=":Message" />  
        <dbType value="String" />  
        <size value="4000" />  
        <layout type="log4net.Layout.PatternLayout">  
          <conversionPattern value="%message" />  
        </layout>  
      </parameter>  
      <parameter>  
        <parameterName value=":Exception" />  
        <dbType value="String" />  
        <size value="4000" />  
        <layout type="log4net.Layout.PatternLayout">  
          <conversionPattern value="%exception" />  
        </layout>  
      </parameter>  
      <!--DIY-->  
      <parameter>  
        <parameterName value=":ClientUser" />  
        <dbType value="String" />  
        <size value="100" />  
        <layout type="log4net.Layout.PatternLayout">  
          <conversionPattern value="%property{ClientUser}" />  
        </layout>  
      </parameter>  
      <parameter>  
        <parameterName value=":ClientIP" />  
        <dbType value="String" />  
        <size value="20" />  
        <layout type="log4net.Layout.PatternLayout">  
          <conversionPattern value="%property{ClientIP}" />  
        </layout>  
      </parameter>  
      <parameter>  
        <parameterName value=":RequestUrl" />  
        <dbType value="String" />  
        <size value="500" />  
        <layout type="log4net.Layout.PatternLayout">  
          <conversionPattern value="%property{RequestUrl}" />  
        </layout>  
      </parameter>  
      <parameter>  
        <parameterName value=":Action" />  
        <dbType value="String" />  
        <size value="20" />  
        <layout type="log4net.Layout.PatternLayout">  
          <conversionPattern value="%property{Action}" />  
        </layout>  
      </parameter>  
    </appender>  
      
    <!--Sqlite数据库-->  
    <appender name="SqliteAppender" type="log4net.Appender.AdoNetAppender">  
      <bufferSize value="0" />  
      <connectionType value="System.Data.SQLite.SQLiteConnection, System.Data.SQLite, Version=1.0.98.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />  
      <connectionString value="Data Source=|DataDirectory|test.db;Version=3;" />  
      <commandText value="INSERT INTO Log (Date, Level, Logger, ClientUser,ClientIP, RequestUrl,Action, Message, Exception) VALUES (@Date, @Level, @Logger,@ClientUser,@ClientIP, @RequestUrl,@Action, @Message, @Exception)" />  
      <parameter>  
        <parameterName value="@Date" />  
        <dbType value="DateTime" />  
        <layout type="log4net.Layout.RawTimeStampLayout" />  
      </parameter>  
      <parameter>  
        <parameterName value="@Level" />  
        <dbType value="String" />  
        <layout type="log4net.Layout.PatternLayout">  
          <conversionPattern value="%level" />  
        </layout>  
      </parameter>  
      <parameter>  
        <parameterName value="@Logger" />  
        <dbType value="String" />  
        <layout type="log4net.Layout.PatternLayout">  
          <conversionPattern value="%logger" />  
        </layout>  
      </parameter>  
      <parameter>  
        <parameterName value="@ClientUser" />  
        <dbType value="String" />  
        <layout type="log4net.Layout.PatternLayout">  
          <conversionPattern value="%property{ClientUser}" />  
        </layout>  
      </parameter>  
      <parameter>  
        <parameterName value="@ClientIP" />  
        <dbType value="String" />  
        <layout type="log4net.Layout.PatternLayout">  
          <conversionPattern value="%property{ClientIP}" />  
        </layout>  
      </parameter>  
      <parameter>  
        <parameterName value="@RequestUrl" />  
        <dbType value="String" />  
        <layout type="log4net.Layout.PatternLayout">  
          <conversionPattern value="%property{RequestUrl}" />  
        </layout>  
      </parameter>  
      <parameter>  
        <parameterName value="@Action" />  
        <dbType value="String" />  
        <layout type="log4net.Layout.PatternLayout">  
          <conversionPattern value="%property{Action}" />  
        </layout>  
      </parameter>  
      <parameter>  
        <parameterName value="@Message" />  
        <dbType value="String" />  
        <layout type="log4net.Layout.PatternLayout">  
          <conversionPattern value="%message" />  
        </layout>  
      </parameter>  
      <parameter>  
        <parameterName value="@Exception" />  
        <dbType value="String" />  
        <layout type="log4net.Layout.PatternLayout">  
          <conversionPattern value="%exception" />  
        </layout>  
      </parameter>  
    </appender>  
      
  </log4net>  
  <startup>  
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />  
  </startup>  
</configuration>  
<!--  
   调用实例  
   log4net.ILog log = log4net.LogManager.GetLogger("Filelog");  
   log.Info(Message);  
     
    %m(message):输出的日志消息,如ILog.Debug(…)输出的一条消息  
  
    %n(new line):换行  
  
    %d(datetime):输出当前语句运行的时刻  
  
    %r(run time):输出程序从运行到执行到当前语句时消耗的毫秒数  
  
    %t(thread id):当前语句所在的线程ID  
  
    %p(priority): 日志的当前优先级别,即DEBUG、INFO、WARN…等  
  
    %c(class):当前日志对象的名称  
      
    %L:输出语句所在的行号  
  
    %F:输出语句所在的文件名  
  
    %-数字:表示该项的最小长度,如果不够,则用空格填充  
  
    例如,转换模式为%r [%t]%-5p %c - %m%n 的 PatternLayout 将生成类似于以下内容的输出:  
  
    176 [main] INFO  org.foo.Bar - Located nearest gas station.  
    -->

定义实体类LogEntity.cs

/************************************************************************************* 
 * CLR版 本: 4.0.30319.42000 
 * 机器名称: LISEN0100 
 * 命名空间: Ide.Net.Cn.Util.Log 
 * 文件名称: LogEntity 
 * 创建时间: 2018/3/11 15:51:49 
 * 作    者: 木子网 
 * 个人博客: http://www.xiangcaowuyu.net 
 * 个人邮箱: lisen@lisen.org 
 * 文件说明:  
 * 修改时间:  
 * 修 改 人: 木子网 
 * 修改说明: 
 *************************************************************************************/  
using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
using System.Threading.Tasks;  
  
namespace Ide.Net.Cn.Util.Log  
{  
    public class LogEntity  
    {  
        #region 属性  
  
        /// <summary>  
        /// 操作时间  
        /// </summary>  
        public DateTime OperationTime { get; set; }  
  
        /// <summary>  
        /// Url地址  
        /// </summary>  
        public string Url { get; set; }  
  
        /// <summary>  
        /// 类名  
        /// </summary>  
        public string Class { get; set; }  
  
        /// <summary>  
        /// IP  
        /// </summary>  
        public string Ip { get; set; }  
  
        /// <summary>  
        /// 主机  
        /// </summary>  
        public string Host { get; set; }  
  
        /// <summary>  
        /// 浏览器  
        /// </summary>  
        public string Browser { get; set; }  
  
        /// <summary>  
        /// 操作人  
        /// </summary>  
        public string UserName { get; set; }  
  
        /// <summary>  
        /// 操作人编号或内码  
        /// </summary>  
        public string User { get; set; }  
  
        /// <summary>  
        /// 内容  
        /// </summary>  
        public string Content { get; set; }  
  
        /// <summary>  
        /// 异常信息  
        /// </summary>  
        public string ExceptionInfo { get; set; }  
  
        /// <summary>  
        /// 异常来源  
        /// </summary>  
        public string ExceptionSource { get; set; }  
  
        /// <summary>  
        /// 异常信息备注  
        /// </summary>  
        public string ExceptionRemark { get; set; }  
 
        #endregion  
 
        #region 构造函数  
 
        #endregion  
 
        #region 方法  
 
        #endregion  
    }  
}

定义文本格式化类LogFormat.cs,用于控制文本输出

/************************************************************************************* 
 * CLR版 本: 4.0.30319.42000 
 * 机器名称: LISEN0100 
 * 命名空间: Ide.Net.Cn.Util.Log 
 * 文件名称: LogFormat 
 * 创建时间: 2018/3/11 16:37:24 
 * 作    者: 木子网 
 * 个人博客: http://www.xiangcaowuyu.net 
 * 个人邮箱: lisen@lisen.org 
 * 文件说明: 格式化消息实体 
 * 修改时间:  
 * 修 改 人: 木子网 
 * 修改说明: 
 *************************************************************************************/  
using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
using System.Threading.Tasks;  
  
namespace Ide.Net.Cn.Util.Log  
{  
    public class LogFormat  
    {  
        #region 属性  
 
        #endregion  
 
        #region 构造函数  
 
        #endregion  
 
        #region 方法  
        /// <summary>  
        /// 生成错误  
        /// </summary>  
        /// <param name="logEntity">对象</param>  
        /// <returns></returns>  
        public static string ErrorFormat(LogEntity logEntity)  
        {  
            StringBuilder strInfo = new StringBuilder();  
            strInfo.Append("1. 错误: >> 操作时间: " + logEntity.OperationTime + "   操作人: " + logEntity.UserName + "   操作人编号: " + logEntity.User + " \r\n");  
            strInfo.Append("2. 地址: " + logEntity.Url + "    \r\n");  
            strInfo.Append("3. 类名: " + logEntity.Class + " \r\n");  
            strInfo.Append("4. Ip  : " + logEntity.Ip + "   主机: " + logEntity.Host + "   浏览器: " + logEntity.Browser + "    \r\n");  
            strInfo.Append("5. 内容: " + logEntity.Content + "\r\n");  
            strInfo.Append("-----------------------------------------------------------------------------------------------------------------------------\r\n");  
            return strInfo.ToString();  
        }  
        /// <summary>  
        /// 生成警告  
        /// </summary>  
        /// <param name="logEntity">对象</param>  
        /// <returns></returns>  
        public static string WarnFormat(LogEntity logEntity)  
        {  
            StringBuilder strInfo = new StringBuilder();  
            strInfo.Append("1. 警告: >> 操作时间: " + logEntity.OperationTime + "   操作人: " + logEntity.UserName + "   操作人编号: " + logEntity.User + " \r\n");  
            strInfo.Append("2. 地址: " + logEntity.Url + "    \r\n");  
            strInfo.Append("3. 类名: " + logEntity.Class + " \r\n");  
            strInfo.Append("4. Ip  : " + logEntity.Ip + "   主机: " + logEntity.Host + "   浏览器: " + logEntity.Browser + "    \r\n");  
            strInfo.Append("5. 内容: " + logEntity.Content + "\r\n");  
            strInfo.Append("-----------------------------------------------------------------------------------------------------------------------------\r\n");  
            return strInfo.ToString();  
        }  
        /// <summary>  
        /// 生成信息  
        /// </summary>  
        /// <param name="logEntity">对象</param>  
        /// <returns></returns>  
        public static string InfoFormat(LogEntity logEntity)  
        {  
            StringBuilder strInfo = new StringBuilder();  
            strInfo.Append("1. 信息: >> 操作时间: " + logEntity.OperationTime + "   操作人: " + logEntity.UserName + "   操作人编号: " + logEntity.User + " \r\n");  
            strInfo.Append("2. 地址: " + logEntity.Url + "    \r\n");  
            strInfo.Append("3. 类名: " + logEntity.Class + " \r\n");  
            strInfo.Append("4. Ip  : " + logEntity.Ip + "   主机: " + logEntity.Host + "   浏览器: " + logEntity.Browser + "    \r\n");  
            strInfo.Append("5. 内容: " + logEntity.Content + "\r\n");  
            strInfo.Append("-----------------------------------------------------------------------------------------------------------------------------\r\n");  
            return strInfo.ToString();  
        }  
        /// <summary>  
        /// 生成调试  
        /// </summary>  
        /// <param name="logEntity">对象</param>  
        /// <returns></returns>  
        public static string DebugFormat(LogEntity logEntity)  
        {  
            StringBuilder strInfo = new StringBuilder();  
            strInfo.Append("1. 调试: >> 操作时间: " + logEntity.OperationTime + "   操作人: " + logEntity.UserName + "   操作人编号: " + logEntity.User + " \r\n");  
            strInfo.Append("2. 地址: " + logEntity.Url + "    \r\n");  
            strInfo.Append("3. 类名: " + logEntity.Class + " \r\n");  
            strInfo.Append("4. Ip  : " + logEntity.Ip + "   主机: " + logEntity.Host + "   浏览器: " + logEntity.Browser + "    \r\n");  
            strInfo.Append("5. 内容: " + logEntity.Content + "\r\n");  
            strInfo.Append("-----------------------------------------------------------------------------------------------------------------------------\r\n");  
            return strInfo.ToString();  
        }  
        /// <summary>  
        /// 生成异常信息  
        /// </summary>  
        /// <param name="logEntity">对象</param>  
        /// <returns></returns>  
        public static string ExceptionFormat(LogEntity logEntity)  
        {  
            StringBuilder strInfo = new StringBuilder();  
            strInfo.Append("1. 调试: >> 操作时间: " + logEntity.OperationTime + "   操作人: " + logEntity.UserName + "   操作人编号: " + logEntity.User + " \r\n");  
            strInfo.Append("2. 地址: " + logEntity.Url + "    \r\n");  
            strInfo.Append("3. 类名: " + logEntity.Class + " \r\n");  
            strInfo.Append("4. 主机: " + logEntity.Host + "   Ip  : " + logEntity.Ip + "   浏览器: " + logEntity.Browser + "    \r\n");  
            strInfo.Append("5. 异常: " + logEntity.ExceptionInfo + "\r\n");  
            //strInfo.Append("6. 来源: " + logEntity.ExceptionSource + "\r\n");  
            //strInfo.Append("7. 实例: " + logEntity.ExceptionRemark + "\r\n");  
            strInfo.Append("-----------------------------------------------------------------------------------------------------------------------------\r\n");  
            return strInfo.ToString();  
        }  
        #endregion  
    }  
}

定义工厂类LogFactory.cs,返回log类型

/************************************************************************************* 
 * CLR版 本: 4.0.30319.42000 
 * 机器名称: LISEN0100 
 * 命名空间: Ide.Net.Cn.Util.Log 
 * 文件名称: LogFactory 
 * 创建时间: 2018/3/11 15:27:20 
 * 作    者: 木子网 
 * 个人博客: http://www.xiangcaowuyu.net 
 * 个人邮箱: lisen@lisen.org 
 * 文件说明: 日志工厂类,产生错误、警告、信息、调试类 
 * 修改时间:  
 * 修 改 人: 木子网 
 * 修改说明: 
 *************************************************************************************/  
using log4net;  
using System;  
using System.Collections.Generic;  
using System.IO;  
using System.Linq;  
using System.Text;  
using System.Threading.Tasks;  
using System.Web;  
  
namespace Ide.Net.Cn.Util.Log  
{  
    public class LogFactory  
    {  
        #region 属性  
 
        #endregion  
 
        #region 构造函数  
  
        /// <summary>  
        /// 构造函数  
        /// </summary>  
        static LogFactory()  
        {  
            FileInfo fileInfo = new FileInfo(HttpContext.Current.Server.MapPath("~/XmlConfig/log4net.config"));  
            log4net.Config.XmlConfigurator.ConfigureAndWatch(fileInfo);  
        }  
 
        #endregion  
 
        #region 方法  
        public static ILog GetLogger(LogLevel logLevel)  
        {  
            ILog log = null;  
            switch (logLevel)  
            {  
                case LogLevel.Error:  
                    log = LogManager.GetLogger("ErrorLog");  
                    break;  
                case LogLevel.Warning:  
                    log = LogManager.GetLogger("WarnLog");  
                    break;  
                case LogLevel.Info:  
                    log = LogManager.GetLogger("InfoLog");  
                    break;  
                case LogLevel.Debug:  
                    log = LogManager.GetLogger("DebugLog");  
                    break;  
            }  
            return log;  
        }  
  
        public static ILog ErrorLog()  
        {  
            return LogManager.GetLogger("ErrorLog");  
        }  
  
        public static ILog WarnLog()  
        {  
            return LogManager.GetLogger("WarnLog");  
        }  
  
        public static ILog InfoLog()  
        {  
            return LogManager.GetLogger("InfoLog");  
        }  
  
        public static ILog DebugLog()  
        {  
            return LogManager.GetLogger("DebugLog");  
        }  
  
        public static ILog SqlLog()  
        {  
            return LogManager.GetLogger("Sqlserver");  
        }  
        #endregion  
  
    }  
}

定义公共类log.cs,用于输出日志

/************************************************************************************* 
 * CLR版 本: 4.0.30319.42000 
 * 机器名称: LISEN0100 
 * 命名空间: Ide.Net.Cn.Util.Log 
 * 文件名称: Log 
 * 创建时间: 2018/3/11 15:04:03 
 * 作    者: 木子网 
 * 个人博客: http://www.xiangcaowuyu.net 
 * 个人邮箱: lisen@lisen.org 
 * 文件说明: 日志文件类 
 * 修改时间:  
 * 修 改 人: 木子网 
 * 修改说明: 
 *************************************************************************************/  
using log4net;  
using System;  
using System.Collections.Generic;  
using System.Configuration;  
using System.Linq;  
using System.Text;  
using System.Threading.Tasks;  
  
namespace Ide.Net.Cn.Util.Log  
{  
    public class Log  
    {  
        #region 字段属性  
        private ILog log;  
        private bool IsLog = true;  
        #endregion  
 
        #region 构造函数  
        public Log(ILog log)  
        {  
            this.log = log;  
            IsLog = ConfigurationManager.AppSettings["IsLog"].ToLower() == "true" ? true : false;  
        }  
        #endregion  
 
        #region 方法  
  
        /// <summary>  
        /// 写入错误日志  
        /// </summary>  
        /// <param name="errorMsg">错误消息</param>  
        public void Error(LogEntity errorMsg)  
        {  
            if (IsLog)  
            {  
                log.Error(LogFormat.ErrorFormat(errorMsg));  
            }  
        }  
  
        /// <summary>  
        /// 写入警告日志  
        /// </summary>  
        /// <param name="warnMsg">警告消息</param>  
        public void Warn(LogEntity warnMsg)  
        {  
            if (IsLog)  
            {  
                log.Warn(LogFormat.WarnFormat(warnMsg));  
            }  
        }  
  
        /// <summary>  
        /// 写入警告日志  
        /// </summary>  
        /// <param name="warnMsg">警告消息</param>  
        public void Warn(LogEntity warnMsg, Exception exception)  
        {  
            if (IsLog)  
            {  
                log.Warn(LogFormat.WarnFormat(warnMsg), exception);  
            }  
        }  
  
        /// <summary>  
        /// 写入信息日志  
        /// </summary>  
        /// <param name="infoMsg">信息消息</param>  
        public void Info(LogEntity infoMsg)  
        {  
            if (IsLog)  
            {  
                log.Info(LogFormat.InfoFormat(infoMsg));  
            }  
        }  
  
        /// <summary>  
        /// 写入调试日志  
        /// </summary>  
        /// <param name="debugMsg">调试消息</param>  
        public void Debug(LogEntity debugMsg)  
        {  
            if (IsLog)  
            {  
                log.Debug(LogFormat.DebugFormat(debugMsg));  
            }  
        }  
 
        #endregion  
    }  
}

使用

定义一个aspx页面,窗体载入后测试日志文件

using Ide.Net.Cn.Util.Log;  
using log4net;  
using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Web;  
using System.Web.UI;  
using System.Web.UI.WebControls;  
  
namespace Ide.Net.Cn.Web  
{  
    public partial class _Default : Page  
    {  
        protected void Page_Load(object sender, EventArgs e)  
        {  
            if (!IsPostBack)  
            {  
                //ILog log = LogFactory.ErrorLog();//文本日志  
                ILog log = LogFactory.SqlLog();//数据库日志  
                Log logger = new Log(log);  
                LogEntity logEntity = new LogEntity  
                {  
                    OperationTime = DateTime.Now,  
                    Url = "www.xiangcaowuyu.net"  
                };  
                try  
                {  
                    logger.Warn(logEntity);  
                }  
                catch (Exception ex)  
                {  
                    logger.Warn(logEntity, ex);  
                }  
            }  
        }  
    }  
}

数据库表结构

USE [Ide_Net_Cn]  
GO  
  
/****** Object:  Table [dbo].[LogDetails]    Script Date: 03/11/2018 19:13:45 ******/  
SET ANSI_NULLS ON  
GO  
  
SET QUOTED_IDENTIFIER ON  
GO  
  
SET ANSI_PADDING ON  
GO  
  
CREATE TABLE [dbo].[LogDetails](  
    [ID] [varchar](36) NOT NULL,  
    [OperationTime] [datetime] NULL,  
    [Url] [varchar](255) NULL,  
    [Ip] [nvarchar](255) NULL,  
    [Host] [nvarchar](255) NULL,  
    [Browser] [nvarchar](100) NULL,  
    [UserName] [nvarchar](20) NULL,  
    [User] [nvarchar](40) NULL,  
    [Content] [nvarchar](max) NULL,  
    [ExceptionInfo] [nvarchar](max) NULL,  
    [ExceptionSource] [nvarchar](max) NULL,  
    [ExceptionRemark] [nvarchar](max) NULL,  
    [Level] [char](1) NULL,  
PRIMARY KEY CLUSTERED   
(  
    [ID] ASC  
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY],  
 CONSTRAINT [LogDetails_Code] UNIQUE NONCLUSTERED   
(  
    [ID] ASC  
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]  
) ON [PRIMARY]  
  
GO  
  
SET ANSI_PADDING OFF  
GO  
  
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'浏览器型号+版本号' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'LogDetails', @level2type=N'COLUMN',@level2name=N'Browser'  
GO  
  
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'1-error;  
2-warn;  
3-info;  
4-debug' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'LogDetails', @level2type=N'COLUMN',@level2name=N'Level'  
GO  
  
ALTER TABLE [dbo].[LogDetails] ADD  DEFAULT (newid()) FOR [ID]  
GO  
  
ALTER TABLE [dbo].[LogDetails] ADD  DEFAULT (NULL) FOR [ExceptionSource]  
GO  
1

评论 (0)

取消
  1. 头像
    啊啊啊
    MacOS · Safari

    谢谢哦

    回复
  2. 头像
    234234234
    Windows 10 · QQ Browser

    不错不错

    回复