惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

L
LINUX DO - 热门话题
Stack Overflow Blog
Stack Overflow Blog
B
Blog
WordPress大学
WordPress大学
Project Zero
Project Zero
P
Palo Alto Networks Blog
阮一峰的网络日志
阮一峰的网络日志
博客园 - 司徒正美
有赞技术团队
有赞技术团队
S
SegmentFault 最新的问题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
小众软件
小众软件
T
Tailwind CSS Blog
Forbes - Security
Forbes - Security
F
Full Disclosure
SecWiki News
SecWiki News
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Hacker News: Ask HN
Hacker News: Ask HN
C
Check Point Blog
Microsoft Security Blog
Microsoft Security Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
F
Fortinet All Blogs
Cisco Talos Blog
Cisco Talos Blog
G
Google Developers Blog
J
Java Code Geeks
Google DeepMind News
Google DeepMind News
人人都是产品经理
人人都是产品经理
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Recorded Future
Recorded Future
O
OpenAI News
Spread Privacy
Spread Privacy
MongoDB | Blog
MongoDB | Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
C
Cybersecurity and Infrastructure Security Agency CISA
S
Securelist
V
Vulnerabilities – Threatpost
Y
Y Combinator Blog
IT之家
IT之家
U
Unit 42
腾讯CDC
S
Security Affairs
C
Cisco Blogs
Schneier on Security
Schneier on Security
The Last Watchdog
The Last Watchdog
B
Blog RSS Feed
宝玉的分享
宝玉的分享
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
S
Security @ Cisco Blogs
Cyberwarzone
Cyberwarzone
T
The Blog of Author Tim Ferriss

博客园 - 木乃伊人

VS Code 搭建LangChain开发环境 VSCode Unable to import XXX 问题解决记录 大模型应用开发-聊天机器人-保存聊天记录 try-catch中的throw和throw ex的区别 TDD Google Chrome 默认非安全端口列表 EF Core的预先加载、延迟加载、实体追踪 同步、异步、回调 软件设计原则 UML类图 Seq 多线程整理 Vuex和Pinia Vue3+TS+Vite+pinia 枚举 Vite创建Vue3项目 闭包 IdentitySrever4 ElasticSearch 前端防止重复提交案例
Serilog
木乃伊人 · 2024-04-22 · via 博客园 - 木乃伊人

一、简介

       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,详细的等各位自己发掘了