扩展.net日志框架Serilog的WriteTo

Posted bdmh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了扩展.net日志框架Serilog的WriteTo相关的知识,希望对你有一定的参考价值。

Serilog作为日志框架,是一个不错的选择,ASP.net Core提供了很多关于Serilog的NuGet包,可以让你把日志输出到文件、控制台、数据库等。对于入库的日志,NuGet包提供的操作比较有限,有的甚至无法自定义字段,所以使用起来就不是那么友好了。

所以我们需要对WriteTo进行扩展,写入我们自己的数据库表,自己的字段,采集我们需要的信息等等。

这里需要用到.Net的类扩展功能。看看WriteTo是什么类型。

public LoggerSinkConfiguration WriteTo 
	get;
	internal set;

下面我们就要对LoggerSinkConfiguration类进行扩展。WriteTo.mysql、WriteTo.MSSqlServer都是这个原理。

首选定义一个用来具体实现写写数据库的类,需要实现ILogEventSink接口。

using System;
using Serilog.Core;
using Serilog.Events;
using System.Threading.Tasks;

namespace MY.Extentions

    public class DBLogEvent : ILogEventSink
    
//imp是数据库操作的对象,自己实现就好了,就是执行sql
        private IDBImp imp;
        public DBLogEvent()
        
            imp = DBHelper.GetInstance().GetDBImp();
        
//实现ILogEventSink的方法,异步执行写操作
        public void Emit(LogEvent logEvent)
        
            Task task = new Task(() =>
            
                WriteLog(logEvent);
            );
            task.Start();
        

        /// <summary>
        /// 写入数据库
        /// </summary>
        /// <param name="logEvent">从这里读取时间戳和传入的日志信息</param>
        private void WriteLog(LogEvent logEvent)
        
//只接受Information级别的
            if (logEvent.Level != LogEventLevel.Information)
                return;
            string st = logEvent.Timestamp.ToString("yyyy-MM-dd HH:mm:ss");
            string sql = string.Format("insert into Logs(Identifer,Content,LogTime,Params) values('0','1','2','3')"
                , "111111111", st, log, "id:001,name:老万");
            imp.ExecSql(sql, null);
        
    

上面操作就是把一些信息,写入到Logs数据表,这个表是我们自己建立的。

然后我们写扩展类。

using System;
using Serilog;
using Serilog.Configuration;
using Serilog.Core;

namespace MY.Extentions

    /// <summary>
    /// 日志WriteTo扩展,写入自己的数据库
    /// </summary>
    public static class LoggerConfigurationDBExtensions
    
        public static LoggerConfiguration ToDB(this LoggerSinkConfiguration configer)
        
//这里创建DBLogEvent对象,并返回
            ILogEventSink val = new DBLogEvent();
            return configer.Sink(val, Serilog.Events.LogEventLevel.Debug, null);
        
    

初始化时就可以这样用。

            LoggerConfiguration configuration = new LoggerConfiguration()
                .MinimumLevel.Debug()//最小的输出单位是Debug级别的
                .MinimumLevel.Override("Microsoft", LogEventLevel.Information)//将Microsoft前缀的日志的最小输出级别改成Information
                .Enrich.FromLogContext()
                .WriteTo.RollingFile("logs/Date.log", shared: true, restrictedToMinimumLevel: LogEventLevel.Debug,
                    outputTemplate: "Timestamp:yyyy-MM-dd HH:mm:ss.fff [Level] MessageNewLineException")
//这个就是我们扩展的方法了
                .WriteTo.ToDB();

这样,只要你通过Serilog进行日志操作时,都会执行ToDB方法,写入信息到你自己的数据库。

以上是关于扩展.net日志框架Serilog的WriteTo的主要内容,如果未能解决你的问题,请参考以下文章

Serilog 不会将日志写入文件

Serilog.Sinks.MSSqlServer WriteTo 不插入数据库(虽然 AuditTo 工作正常)

使用Serilog将程序结束时创建的日志文件通过电子邮件发送出去

Serilog简介

Serilog - 多个日志文件

在 Net 6 中使用 WebApplicationBuilder 配置 Serilog