Serilog

一、简介

       Serilog,Microsoft .NET 的结构化日志记录库,Checkout.com .NET 首选日志记录库。支持各种日志记录目的地(接收器)包从标准控制台和基于文件的接收器到日志服务,如Datadog。

二、包

       常用的Nuget安装包如下:

  1. Serilog :主包
  2. Serilog.AspNetCore : Core环境下使用包   
  3. Serilog.Formatting.Compact :用于日志输出到控制台
  4. Serilog.Sinks.MySQL :用于日志输出到Mysql数据库
  5. Serilog.Sinks.MSSqlServer :用于日志输出到SqlSer数据库
  6. Serilog.Sinks.RollingFile:用于日志输出到文件  
  7. Serilog.Sinks.Async :异步

三、简单使用

        示例环境:.NET 6 ,MySql

        3.1、Program.cs配置                

//Serilog 配置
Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Override("Microsoft", LogEventLevel.Warning) // 排除Microsoft的日志
    .Enrich.FromLogContext() // 注册日志上下文
    .WriteTo.Console(new CompactJsonFormatter()) // 输出到控制台
    .WriteTo.MySQL(connectionString: builder.Configuration.GetConnectionString("DbConnectionString"), tableName: "Logs") // 输出到数据库
    .WriteTo.Logger(configure => configure // 输出到文件
                .MinimumLevel.Debug()
                .WriteTo.File(  //单个日志文件,总日志,所有日志存到这里面
                    $"logs\\log.txt",
                    rollingInterval: RollingInterval.Day,
                    outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Message:lj}{NewLine}{Exception}")
                .WriteTo.RollingFile( //每天生成一个新的日志,按天来存日志
                    "logs\\{Date}-log.txt", //定输出到滚动日志文件中,每天会创建一个新的日志,按天来存日志
                    retainedFileCountLimit: 7,
                    outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Message:lj}{NewLine}{Exception}"
                ))
    .CreateLogger();

//向主机注册Serilog
builder.Host.UseSerilog();
View Code

       3.2、控制器使用

[ApiController]
[Route("[controller]")]
public class TestController : ControllerBase
{
    #region DI

    private readonly ILogger<TestController> _logger;

    public TestController(ILogger<TestController> logger)
    {
        _logger = logger;
    }

    #endregion

    #region Func

    [HttpGet]
    public object Get()
    {
        // 记录日志
        _logger.LogInformation($"测试测试");
        _logger.LogDebug("测试Debug信息");
        _logger.LogError("测试Error信息");
        _logger.LogWarning("测试Warning信息");
        _logger.LogCritical("测试Critical信息");
        return "";
    } 

    #endregion
}
View Code

      3.3、appsettings.json数据库连接私服串配置,如果使用数据库记录日志的话。

"ConnectionStrings": {
  "DbConnectionString": "Data Source=48.114.198.199;Database=efcore;AllowLoadLocalInfile=true;User ID=root;Password=root;allowPublicKeyRetrieval=true;pooling=true;CharSet=utf8;port=3306;sslmode=none;"
}

     3.4、数据库结果

            logs表会自动创建

   3.5、文件结果    

             注意:默认消息级别是Warn,所以debug消息类是不可见的。

             logs文件夹下会有两个日志文件,一个是总日志文件,一个是按天创建记录的滚动日志文件

 

四、扩展使用

        示例环境:.NET 6 ,MySql

        4.1、appsettings.json配置Seriog

"Serilog": {
  "MinimumLevel": {
    "Default": "Debug", //最小日志记录级别
    "Override": { //系统日志最小记录级别
      "Default": "Warning",
      "System": "Warning",
      "Microsoft": "Warning"
    }
  },
  "WriteTo": [
    { "Name": "Console" }, //输出到控制台
    {
      "Name": "Async", //异步写入日志
      "Args": {
        "configure": [
          {
            "Name": "File", //输出文件
            "Args": {
              "path": "log/log.txt",
              "outputTemplate": "{NewLine}Date:{Timestamp:yyyy-MM-dd HH:mm:ss.fff}{NewLine}LogLevel:{Level}{NewLine}Class:{SourceContext}{NewLine}Message:{Message}{NewLine}{Exception}",
              "rollingInterval": "3" //日志文件生成精度:1:年  2:月 3:日 4:小时
            }
          }
        ]
      }
    }
  ]
}
View Code

       4.2、Program.cs配置

builder.Host.UseSerilog((context, logger) =>
{
    logger.ReadFrom.Configuration(context.Configuration);
    logger.Enrich.FromLogContext();
});

      4.3、控制器配置

[ApiController]
[Route("[controller]")]
public class TestController : ControllerBase
{
    #region DI

    private readonly ILogger<TestController> _logger;

    public TestController(ILogger<TestController> logger)
    {
        _logger = logger;
    }

    #endregion

    #region Func

    [HttpGet]
    public object Get()
    {
        // 记录日志
        //_logger.LogInformation($"测试测试");
        _logger.LogDebug("测试Debug信息");
        _logger.LogError("测试Error信息");
        _logger.LogWarning("测试Warning信息");
        //_logger.LogCritical("测试Critical信息");
        return "";
    } 

    #endregion
}
View Code

       4.4、结果

 五、配合使用seq

        5.1、下载

                 下载地址:https://datalust.co/download/all

                  百度网盘下载:链接: https://pan.baidu.com/s/1GF9JvopRrXvltCXRPr-rzw 提取码: 9y6g

                 开发版个人免费,商业版多账号需要收费,占用5341端口

                 安装过程略过。

       5.2、.NET Core 使用Serilog

                引用nuget包,Serilog的包分的比较细,根据不同的日志存储介质有不同的包,使用Seq需

                引用 Serilog.Sinks.Seq

     5.3、声明log对象,WriteTo代表将日志存储进哪里,可以同时配置多大存储介质。

#region Serilog配置3
builder.Host.UseSerilog((context, logger) =>
{
    logger.ReadFrom.Configuration(context.Configuration);
    logger.Enrich.FromLogContext();
    logger.WriteTo.Seq("http://localhost:5341/");//日志存储到Seq。用WriteTo可以同时配置很多存储介质
});
#endregion
View Code

     5.4、打印日志。

Serilog是一种结构化日志组件,已Json的形式存储日志,在代码中通过{@对象名}可直接将对象作为json对象输出。

var duixiang = new
            {
                name = "这是个对象",
                people = 666
            };
            int i=0;
            try
            {
                double s = 1 / i;
            }
            catch (Exception ex)
            {
                Log.Verbose(ex, "Something went wrong");
                //throw;
            }
            Log.Debug("Hello, world!" + DateTime.Now.ToString());
            Log.Information("Hello, world!{@ca}", duixiang);
            Log.Debug("Hello, world!");
            Log.Error("Hello, world!");
            Log.Warning("Hello, world!");
View Code

    5.5、浏览器输出

             浏览器访问http://localhost:5341,可以看到日志已经输出   

 

    

             Seq有很好的检索和分组管理功能

     

 

            自定义Tab,详细的等各位自己发掘了

 

 

posted on 2024-04-22 11:12  木乃伊人  阅读(55)  评论(0编辑  收藏  举报

导航