C# Serilog日志框架

介绍

在.NET使用日志框架第一时间会想到NLog或是Log4Net,Serilog 是这几年快速崛起的Log框架之一,Serilog是以Structured logging 为基础进行设计,透过logging API 可以轻松的记录应用程式中对象属性,方便快速进行logging 内容进行查询与分析,并将其纪录内容透过json (可指定) 的方式输出。在过去的几年中,结构化日志已经大受欢迎。而Serilog是 .NET 中最著名的结构化日志类库 ,我们提供了这份的精简指南来帮助你快速了解并运用它。

//以下为常用记录日志方法 等级最高的是Fatal

log.Information("info");
log.Debug("debug");
log.Warning("warning");
log.Error("err");
log.Fatal("fatal");

无论是core或framework ,配置基本相同,就是声明一个(如下代码)

Log.Logger = new LoggerConfiguration() .CreateLogger();

当然上面的代码配置根本是不够的,你想个性化设置日志输出到什么地方,需要引用一些serilog的接收器。Serilog的输出对象称之为Sink(水槽,也就是接收器),nuget中搜索 关键词serilog.sinks, 会发现有一堆组件。

常见的接收器

Console 输出到控制台
Debug 输出到VS的Debug窗口
Trace 输出到VS的控制台
File 输出到文件
Rolling File
MongoDB 输出到MongoDB
LiteDB 输出到文件数据库LiteDB
SQLite 输出到文件数据库SQLite
SignalR 输出为SignalR服务
HTTP 输出到REST服务 

下面介绍下CS架构和BS架构使用方法

1.首先安装Nuget包

Install-Package Serilog
安装 Serilog和Serilog.Sinks.File
也可以
C# Serilog日志框架_第1张图片
C# Serilog日志框架_第2张图片

2.CS架构以winform 为例

using Serilog;
构造函数中写

	//以下表示在程序运行目录 以天为单位生成日志文件(也可以以小时等为单位)
 Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Debug()
    .WriteTo.File("logs\\log.txt", rollingInterval: RollingInterval.Day)
    .CreateLogger();

	//异步输出日志     需要在包控制台安装Serilog.Sinks.Async包
	//Log.Logger = new LoggerConfiguration()
      //    .WriteTo.Async(a => a.File("logs\\log.txt", rollingInterval: RollingInterval.Day))//输出到程序跟目录
      // //.WriteTo.Async(a => a.File("D:\\logs\\log.txt", rollingInterval: RollingInterval.Day))//输出到指定目录
        //  .CreateLogger();
          //  Log.Information("log");
            //Log.CloseAndFlush();


//不同级别日志输出到不同文件夹下
/*string LogFilePath(string LogEvent) => $@"{AppContext.BaseDirectory}00_Logs\{LogEvent}\log.log";
            string SerilogOutputTemplate = "{NewLine}{NewLine}Date:{Timestamp:yyyy-MM-dd HH:mm:ss.fff}{NewLine}LogLevel:{Level}{NewLine}Message:{Message}{NewLine}{Exception}" + new string('-', 50);
            Log.Logger = new LoggerConfiguration()
.Enrich.FromLogContext()
.WriteTo.Console()
.MinimumLevel.Debug() // 所有Sink的最小记录级别
.WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(p => p.Level == LogEventLevel.Debug).WriteTo.File(LogFilePath("Debug"), rollingInterval: RollingInterval.Day, outputTemplate: SerilogOutputTemplate))
.WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(p => p.Level == LogEventLevel.Information).WriteTo.File(LogFilePath("Information"), rollingInterval: RollingInterval.Day, outputTemplate: SerilogOutputTemplate))
.WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(p => p.Level == LogEventLevel.Warning).WriteTo.File(LogFilePath("Warning"), rollingInterval: RollingInterval.Day, outputTemplate: SerilogOutputTemplate))
.WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(p => p.Level == LogEventLevel.Error).WriteTo.File(LogFilePath("Error"), rollingInterval: RollingInterval.Day, outputTemplate: SerilogOutputTemplate))
.WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(p => p.Level == LogEventLevel.Fatal).WriteTo.File(LogFilePath("Fatal"), rollingInterval: RollingInterval.Day, outputTemplate: SerilogOutputTemplate))
.CreateLogger(); 
*/

C# Serilog日志框架_第3张图片

2.输出日志方法

 Log.Information("Information");
            Log.Debug("debug");
            Log.Error("error");

C# Serilog日志框架_第4张图片

3.每一天会生成每天的日志文件

C# Serilog日志框架_第5张图片

4.BS架构以net core为例

using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Serilog;
using Serilog.Core;
using Serilog.Events;

namespace BoYuanCore.Web
{
    public class Program
    {
    public static int Main(string[] args)
        {
            //CreateHostBuilder(args).Build().Run();


            Log.Logger = new LoggerConfiguration()
               .MinimumLevel.Debug()//最小的输出单位是Debug级别的
               .MinimumLevel.Override("Microsoft", LogEventLevel.Information)//将Microsoft前缀的日志的最小输出级别改成Information
               .Enrich.FromLogContext()
               .WriteTo.File(@"./logs/log.txt", rollingInterval: RollingInterval.Day).CreateLogger();

            try
            {
                Log.Information("Starting web host");
                CreateHostBuilder(args).Build().Run();
                return 0;
            }
            catch (Exception ex)
            {
                Log.Fatal(ex, "Host terminated unexpectedly");
                return 1;
            }
            finally
            {
                Log.CloseAndFlush();
            }
        }
    }
}

4.1输出日志方法

using Serilog;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Http.Headers;
using System.Threading.Tasks;
 
namespace PublicTest.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class TestController : ControllerBase
    { 
        [HttpGet]
        public ActionResult Getqwe()
        {
        Log.Information("123");
        Log.Error("error");
        }
     }
}

你可能感兴趣的:(.net,core,C#,WinForm,Serilog)