.net使用log4net日志框架(记录到数据库)

27 篇文章 5 订阅
19 篇文章 0 订阅

记录下log4net日志框架在项目中的使用:

1.通过Nuget安装Log4net程序包

 

2.添加配置文件,配置日志记录的格式等信息

log4net.config配置信息如下:

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

<log4net>

  <!--type表示用什么类型记录日志 ADONetAppender代表用数据库记录-->
  <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
    <!--日志缓存写入条数 如果为0则立刻写入数据库-->
    <bufferSize value="0"/>

    <!--日志数据库连接串-->
    <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />

    <!--数据库连接字符串-->
    <connectionString value="Data Source=.;Initial Catalog=stuDb;User ID=sa;password=123456"/>

    <!--日志数据库脚本-->
    <commandText value="insert into LogDetails (LogDate,LogLevel,Thread,Logger,LogMessage) values (@log_date,@log_level,@thread,@logger,@message)"/>

    <!--日志时间 RawTimeStampLayout是log4net提供的参数-->
    <parameter>
      <parameterName value="@log_date"/>
      <dbType value="DateTime"/>
      <layout type="log4net.Layout.RawTimeStampLayout"/>
    </parameter>

    <!--日志级别-->
    <parameter>
      <parameterName value="@log_level"/>
      <dbType value="String"/>
      <size value="20"/>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%p" />
      </layout>
    </parameter>

    <!--线程ID-->
    <parameter>
      <parameterName value="@thread"/>
      <dbType value="String"/>
      <size value="100"/>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%thread" />
      </layout>
    </parameter>

    <!--日志名称-->
    <parameter>
      <parameterName value="@logger"/>
      <dbType value="String"/>
      <size value="500"/>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%logger" />
      </layout>
    </parameter>

    <!--日志内容-->
    <parameter>
      <parameterName value="@message"/>
      <dbType value="String"/>
      <size value="3000"/>
      <layout type="Log4NetToSqlServer.Utility.CustomLayout">
        <conversionPattern value="%property{Message}" />
      </layout>
    </parameter>

  </appender>


  <root>
    <appender-ref ref="AdoNetAppender" />
  </root>


</log4net>



配置信息中,日志数据库连接串的参数配置,比如版本号和公钥,可以去对应的程序集中查看。查看方法:

 

日志内容字段,@message参数的值是自定义的,指的是要记录的日志内容,参数值从调用的地方传入。(Log4NetToSqlServer.Utility.CustomLayout类是需要自己创建的,具体代码在下面第三步中)

其他字段都是直接从log4net封装好的log4net.Layout.PatternLayout类中获取。

 

记得要将新建的log4net.config文件设置为始终复制,这一步很关键,如果不设置,程序在运行时会找不到这个配置文件。 

上面配置文件中使用的是SqlServer数据库,其他数据库的配置可以参考:http://logging.apache.org/log4net/release/config-examples.html

 

3.封装自定义字段传值所需要的方法

首先在项目中创建Utility文件夹,用于存放相关帮助类的代码。

接下来要创建下面四个类:

CustomLayout.cs

  public class CustomLayout : PatternLayout
    {
        //构造函数 把指定的需要写入数据库的字段添加进来
        public CustomLayout()
        {
            this.AddConverter("property", typeof(LogInfoPatternConverter));
        }
    }

LogContent.cs

 public class LogContent
    {
        public LogContent(string message)
        {
            Message = message;
        }

        /// <summary>
        /// 日志描述信息
        /// </summary>
        public string Message { get; set; }
    }

LogHelper.cs

 public class LogHelper
    {
        public static readonly ILog ilog = LogManager.GetLogger("TestDataBase.Log");

        public static void Info(LogContent content)
        {
            ilog.Info(content);
        }

        public static void Error(LogContent content, Exception ex)
        {
            ilog.Error(content, ex);
        }

        public static void Warn(LogContent content)
        {
            ilog.Warn(content);
        }

        public static void Fatal(LogContent content)
        {
            ilog.Fatal(content);
        }

        public static void Debug(LogContent content)
        {
            ilog.Debug(content);
        }


    }

LogInfoPatternConverter.cs

 public class LogInfoPatternConverter : PatternLayoutConverter
    {
        protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
        {
            if (Option != null)
            {
                //写入指定键的值
                WriteObject(writer, loggingEvent.Repository, LookupProperty(Option, loggingEvent));
            }
            else
            {
                WriteDictionary(writer, loggingEvent.Repository, loggingEvent.GetProperties());
            }
        }

        /// <summary>
        /// 通过反射获取传入的日志对象的某个属性值
        /// </summary>
        /// <returns></returns>
        private object LookupProperty(string property, LoggingEvent loggingEvent)
        {
            object propertyValue = string.Empty;
            PropertyInfo propertyInfo = loggingEvent.MessageObject.GetType().GetProperty(property);
            if (propertyInfo != null)
            {
                propertyValue = propertyInfo.GetValue(loggingEvent.MessageObject, null);
            }
            return propertyValue;
        }

    }

上面代码实现了对log4net.config配置文件中@message字段的参数传递功能。

如果要加其他自定义参数字段,可以直接在LogContent.cs中添加字段即可,比如要记录‘操作人姓名’,可以修改代码为:

同时需要在log4net.config中修改sql语句和增加对应的配置节点:


 

4.编辑项目中Properties文件夹中的Assemblyinfo.cs(AssemblyInfo.cs是在创建项目时自动生成的,主要用来设定生成的有关程序集的常规信息dll文件的一些参数)

在 Assemblyinfo.cs的最下面,添加如下代码:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Configs\\log4net.config", Watch = true)]

作用是通过反射,全局注册配置,指定读取log4net的配置文件。 

 

5.在数据库中新增日志表:

create table LogDetails(
	logID int identity(1,1) not null,
	LogDate datetime not null,
	LogLevel nvarchar(20) not null,
	Thread nvarchar(20) not null,
	Logger nvarchar(20) not null,
	LogMessage nvarchar(3000) not null,
	constraint PK_LogDetails primary key NONCLUSTERED  (
	   logID asc
	)
)

 

6.写不同等级的日志

 

启动程序,可以看到数据库中日志表记录了相关日志信息。

 

除了往数据库记录日志外,也可以把日志记录在文本中,可以参考:https://blog.csdn.net/liangmengbk/article/details/117187410

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值