C# 使用Log4net记录文件日志和数据库日志使用方法(附源代码)

做项目总是需要记录日志的比如bug、调试信息等等,这样不管是为以后修改bug还是检查程序都是有非常大的帮助的。简单点的项目一般都是自己直接写一个日志工具类,然后直接通过IO来写日志文件或者直接将错误信息存到数据库中。大项目的话自己这套就不太好了,不管是安全方面还是效率方面都存在者很多问题。这里我像大家介绍一个第三方工具:Log4net。

最开始使用是Log4j,这个是Java上的开源日志工具,凭着功能强大、使用简单、易用性强等等优点深的广大开发者的喜爱。也正因为Log4j在Java上的优秀表现,所以才移植到Net平台上。

1、下载Log4net

官方下载: 点击下载 

2、Log4net获取DLL文件

下载完成以后解压文件并打开:bin—> net —-> 这里我们可以看到不同版本的.NET FramerWork(下图)。

C# 使用Log4net记录文件日志和数据库日志使用方法(附源代码)

3、在项目上添加DLL文件引用

根据你项目.NET FramerWork版本来引用(下图)。

C# 使用Log4net记录文件日志和数据库日志使用方法(附源代码)

4、设置Web.config

<?xml version="1.0" encoding="utf-8"?>

<!--
  有关如何配置 ASP.NET 应用程序的详细信息,请访问
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->

<configuration>
  <configSections>
    <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
  </configSections>

  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>

  <log4net>
    <!--定义输出到文件中-->
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <!--定义文件存放位置-->
      <file value="log\\"/>
      <appendToFile value="true"/>
      <rollingStyle value="Date"/>
      <datePattern value="yyyy\\yyyyMM\\yyyyMMdd'.txt'"/>
      <staticLogFileName value="false"/>
      <param name="MaxSizeRollBackups" value="1000"/>
      <layout type="log4net.Layout.PatternLayout">
        <!--输出格式-->
        <conversionPattern value="%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别:%-5level %n出错类:%logger property: [%property{NDC}] - %n错误描述:%message%newline"/>
      </layout>
    </appender>

   <!--定义输出到SQL Server数据库中-->
    <!--  
    在SQL Server中创建表的SQL语句  
    CREATE TABLE [dbo].[Log] (  
    [Id] [int] IDENTITY (1, 1) NOT NULL,  
    [Date] [datetime] NOT NULL,  
    [Thread] [varchar] (255) NOT NULL,  
    [Level] [varchar] (50) NOT NULL,  
    [Logger] [varchar] (255) NOT NULL,  
    [Message] [varchar] (4000) NOT NULL,  
    [Exception] [varchar] (2000) NULL  
);  
    -->

    <appender name="AdoNetAppenderSQLServer" type="log4net.Appender.AdoNetAppender">
      <bufferSize value="1" />
      <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      <connectionString value="Data Source=Sc-201503031243\SQLEXPRESS;Initial Catalog=RoleDemo;Persist Security Info=True;User ID=sa;Password=123;" />
      <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
      <parameter>
        <parameterName value="@log_date" />
        <dbType value="DateTime" />
        <layout type="log4net.Layout.RawTimeStampLayout" />
      </parameter>
      <parameter>
        <parameterName value="@thread" />
        <dbType value="String" />
        <size value="255" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%thread" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@log_level" />
        <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="255" />
        <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="2000" />
        <layout type="log4net.Layout.ExceptionLayout" />
      </parameter>
    </appender>

    <root>
      <level value="ALL" />
      <!--文件形式记录日志-->
     <appender-ref ref="RollingLogFileAppender"/>-->
      <!--SQL Server数据库形式记录日志-->
      <appender-ref ref="AdoNetAppenderSQLServer"/>
    </root>
    
  </log4net>

</configuration>

上面是我完整的配置文件,其中以下部分需要修改或注意:

  • 在configSections节点下面添加以下节点
    <section name=”log4net” type=”System.Configuration.IgnoreSectionHandler”/>
  • 上面的配置文件实现了2中记录方式:文件日志和数据库日志,具体上面的注释中已经有说明。 
  • 对于上面的参数详细介绍请查看这里:http://blog.csdn.net/zhoufoxcn/article/details/6029021

 5、编写Log4net帮助类

下面是我完整的帮助类代码。

using log4net;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;


//注意下面的语句一定要加上,指定log4net使用.config文件来读取配置信息  
//如果是WinForm(假定程序为MyDemo.exe,则需要一个MyDemo.exe.config文件)  
//如果是WebForm,则从web.config中读取相关信息  
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
namespace WebApplication1
{
    public class LogHelper
    {
        /// <summary>
        /// 调用Log4net写日志,日志等级为 :错误(Error)
        /// </summary>
        /// <param name="logContent">日志内容</param>
        public static void WriteLog(string logContent)
        {
            WriteLog(null, logContent, Log4NetLevel.Error);
        }

        /// <summary>
        /// 调用Log4net写日志
        /// </summary>
        /// <param name="logContent">日志内容</param>
        /// <param name="log4Level">记录日志等级,枚举</param>
        public static void WriteLog(string logContent, Log4NetLevel log4Level)
        {
            WriteLog(null, logContent, log4Level);
        }

        /// <summary>
        /// 调用Log4net写日志
        /// </summary>
        /// <param name="type">类的类型,指定日志中错误的具体类。例如:typeof(Index),Index是类名,如果为空表示不指定类</param>
        /// <param name="logContent">日志内容</param>
        /// <param name="log4Level">记录日志等级,枚举</param>
        public static void WriteLog(Type type, string logContent, Log4NetLevel log4Level)
        {
            ILog log = type == null ? LogManager.GetLogger("") : LogManager.GetLogger(type);
          
            switch (log4Level)
            {
                case Log4NetLevel.Warn:
                    log.Warn(logContent);
                    break;
                case Log4NetLevel.Debug:
                    log.Debug(logContent);
                    break;
                case Log4NetLevel.Info:
                    log.Info(logContent);
                    break;
                case Log4NetLevel.Fatal:
                    log.Fatal(logContent);
                    break;
                case Log4NetLevel.Error:
                    log.Error(logContent);
                    break;
            }
        }

    }


    /// <summary>
    /// log4net 日志等级类型枚举
    /// </summary>
    public enum Log4NetLevel
    {
        [Description("警告信息")]
        Warn = 1,
        [Description("调试信息")]
        Debug = 2,
        [Description("一般信息")]
        Info = 3,
        [Description("严重错误")]
        Fatal = 4,
        [Description("错误日志")]
        Error = 5
    }


}

6、编写测试代码

 //简单写日志
  LogHelper.WriteLog("简单写日志");

  //写Debug日志
  LogHelper.WriteLog("写Debug日志", Log4NetLevel.Debug);

  //带有类型和日志等级的日志,Index 是类名
  LogHelper.WriteLog(typeof(Index), "带有类型和日志等级的日志", Log4NetLevel.Info);

注意添加引用:

using log4net;

7、测试结果

下面是测试结果 (下图) — 文件日志

运行以上代码以后,我们在项目的根目录下面就会有个log文件夹,

C# 使用Log4net记录文件日志和数据库日志使用方法(附源代码)

下面是测试结果 (下图) — 数据库日志

C# 使用Log4net记录文件日志和数据库日志使用方法(附源代码)

8、源代码下载

百度网盘下载:下载地址 

提取码:45kr

发布者:IT柚子,转转请注明出处:https://ityouzi.com/archives/csharp-log4net-file-db.html

(26)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
IT柚子的头像IT柚子
上一篇 2019年3月30日 下午8:44
下一篇 2019年3月30日 下午8:50

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注