Serilog日志框架

文章目录

    • 一. Serilog介绍
      • 1.1 安装Serilog
      • 1.2 Serilog日志级别
    • 二. Serilog.App项目应用
      • 2.1 Serilog一般应用
      • 2.2 兼容系统日志
    • 三. Serilog.Web应用
      • 3.1 Minimal示例
      • 3.2 WebApi示例
    • 参考链接

一. Serilog介绍

Serilog 是 .NET应用程序的诊断日志记录库。它易于设置,具有干净的 API,并且可以在所有最新的 .NET 平台上运行。虽然它即使在最简单的应用程序中也很有用,但 Serilog 对结构化日志记录的支持在检测复杂、分布式和异步应用程序和系统时大放异彩。

1.1 安装Serilog

dotnet add package Serilog
dotnet add package Serilog.Extensions.Logging
dotnet add package Serilog.Sinks.File
dotnet add package Serilog.Sinks.Console
dotnet add package Serilog.Sinks.Async

1.2 Serilog日志级别

public enum LogEventLevel {Verbose,       // 相当于TraceDebug,     	 // 调试模式Information,   // 提示信息Warning,       // 警告信息Error,         // 错误信息Fatal          // 验证错误
}

二. Serilog.App项目应用

2.1 Serilog一般应用

  • 可使用Serilog.Log.ForContext<T>()构建类型化ILogger对象。
  • 可使用Serilog.Log类的静态ILogger成员直接打印日志内容。
using Demo.Service;
using Serilog;// Log.Logger是Serilog的一个静态成员,作为全局的ILogger对象
Log.Logger = new LoggerConfiguration().WriteTo.Console(outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}]  {SourceContext} {Message} {Exception}{NewLine}").MinimumLevel.Verbose().WriteTo.File("Logs/Log.txt").CreateLogger();// Main中打印日志
Log.Information("应用程序已启动");// 其他业务代码...
var foo = new FooService();
foo.PrintWithNewLogger();
foo.PrintWithStaticLogger();// 关闭日志记录器并刷新缓冲区
Log.CloseAndFlush();
Console.ReadKey();
using Serilog;namespace Demo.Service;/// <summary>
/// 示例逻辑服务
/// </summary>
public class FooService {private readonly ILogger _logger;public FooService () {// 底层调用了CreateLogger创建了新的ILogger对象_logger = Log.ForContext<FooService>();}/// <summary>/// 构造ILogger/// </summary>public void PrintWithNewLogger () {_logger.Information("构建的ILoggre对象");_logger.Error(new Exception("发生异常"), "构建的ILoggre对象");}/// <summary>/// 静态的ILogger成员/// </summary>public void PrintWithStaticLogger () {Serilog.Log.Logger.Error("使用Serilog.Log.Logger打印日志");// 可简化为Serilog.Log.XXX(内部依然使用了Serilog.Log.Logger.XXX)Serilog.Log.Debug("使用Serilog.Log静态方法打印日志");Serilog.Log.Information("使用Serilog.Log静态方法打印日志");Serilog.Log.Warning("使用Serilog.Log静态方法打印日志");Serilog.Log.Error("使用Serilog.Log静态方法打印日志");Serilog.Log.Fatal("使用Serilog.Log静态方法打印日志");Serilog.Log.Verbose("等价于Trace级别的日志");}
}

2.2 兼容系统日志

using Microsoft.Extensions.Logging;
using Serilog;// 配置Serilog日志
var tpl = "时间: {Timestamp:yyyy-MM-dd HH:mm:ss}{NewLine}来源: {SourceContext}{NewLine}内容: [{Level:u3}] {Message}{NewLine}{Exception}{NewLine}";
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Information()
.WriteTo.Console(outputTemplate: tpl)
.WriteTo.File("Logs/Log.txt", rollingInterval: RollingInterval.Day, outputTemplate: tpl)
.CreateLogger();// ⚠ 加入到Microsoft.Extensions.Logging 日志工厂
var fac = LoggerFactory.Create(config => { config.AddSerilog(); });// 在具体的类型化对象中使用Logger
var logger = fac.CreateLogger<Program>();
logger.LogInformation("这是一条提示信息");
logger.LogWarning("这是一条警告信息");
logger.LogError("这是一条错误信息");
logger.LogCritical("这是一条严重错误");Log.CloseAndFlush();
Console.ReadKey();

三. Serilog.Web应用

3.1 Minimal示例

  • 可将Serilog注入到IServiceCollection中,即依赖注入。
  • Serilog可打印系统捕获的异常信息,而无需显式指定异常输出格式。
using Serilog;
using Serilog.Events;var builder = WebApplication.CreateBuilder(args);// 配置Serilog日志
var tpl = "时间: {Timestamp:yyyy-MM-dd HH:mm:ss}{NewLine}来源: {SourceContext}{NewLine}内容: [{Level:u3}] {Message}{NewLine}{Exception}{NewLine}";
Log.Logger = new LoggerConfiguration().MinimumLevel.Override("Microsoft", LogEventLevel.Warning) .WriteTo.Console(outputTemplate: tpl).WriteTo.File("Logs/Log.txt", rollingInterval: RollingInterval.Day, outputTemplate: tpl).CreateLogger();//将Serilog注入到应用
builder.Services.AddLogging(opt => {opt.ClearProviders();opt.AddSerilog(dispose: true);
});var app = builder.Build();
app.MapGet("/", () => {// 动态对象var logger = Log.ForContext<Program>();logger.Error("这是一条Serilog.ILogger信息");logger.Fatal("这是一条Serilog.ILogger信息");// 静态方法Log.Information("这是一条Serilog.ILogger信息");Log.Warning("这是一条Serilog.ILogger信息");// 从注入容器读取app.Logger.LogInformation("这是一条系统ILogger信息");app.Logger.LogError("这是一条系统ILogger信息");return "Hello world";
});app.MapGet("/exp", () => {throw new Exception("测试异常日志");
});app.Run();
Log.CloseAndFlush();	// 关闭日志记录器并刷新缓冲区

3.2 WebApi示例

Extends

using Serilog.Events;
using Serilog;namespace Awesome;public static class Extends {const string infoPath = "Logs/info.log";const string warnPath = "Logs/warn.log";const string errorPath = "Logs/error.log";const string fatalPath = "Logs/fatal.log";const string template = "时间: {Timestamp:yyyy-MM-dd HH:mm:ss}{NewLine}来源: {SourceContext}{NewLine}内容: [{Level:u3}] {Message}{NewLine}{Exception}{NewLine}";// 可以将日志输出到控制台、文件、数据库、ES等public static void AddSerilog (this IServiceCollection c) {Log.Logger = new LoggerConfiguration().MinimumLevel.Information().MinimumLevel.Override("Microsoft", LogEventLevel.Warning) // 排除Dotnet自带的日志.Enrich.FromLogContext().WriteTo.Console(outputTemplate: template).WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(lev => lev.Level == LogEventLevel.Information).WriteTo.Async(congfig => congfig.File(infoPath,rollingInterval: RollingInterval.Day,fileSizeLimitBytes: 1024 * 1024 * 10,    //默认1GBretainedFileCountLimit: 10,                   //保留最近多少个文件,默认31个rollOnFileSizeLimit: true,                       //超过文件大小时,自动创建新文件  shared: true,outputTemplate: template))).WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(lev => lev.Level == LogEventLevel.Warning).WriteTo.Async(congfig => congfig.File(warnPath,rollingInterval: RollingInterval.Day,fileSizeLimitBytes: 1024 * 1024 * 10,retainedFileCountLimit: 10,rollOnFileSizeLimit: true,shared: true,outputTemplate: template))).WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(lev => lev.Level == LogEventLevel.Error).WriteTo.Async(congfig => congfig.File(errorPath,rollingInterval: RollingInterval.Day,fileSizeLimitBytes: 1024 * 1024 * 10,retainedFileCountLimit: 10,rollOnFileSizeLimit: true,shared: true,outputTemplate: template))).WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(lev => lev.Level == LogEventLevel.Fatal).WriteTo.Async(congfig => congfig.File(fatalPath,rollingInterval: RollingInterval.Day,fileSizeLimitBytes: 1024 * 1024 * 10,retainedFileCountLimit: 10,rollOnFileSizeLimit: true,shared: true,outputTemplate: template))).CreateLogger();// 注入到容器c.AddLogging(opt => {opt.ClearProviders();opt.AddSerilog(dispose: true);});}
}

Controllers

using Microsoft.AspNetCore.Mvc;namespace Awesome.Controllers;[ApiController]
[Route("[controller]/[action]")]
public class HomeController : ControllerBase {private readonly ILogger<HomeController> _logger;public HomeController (ILogger<HomeController> logger) {_logger = logger;}[HttpGet]public IActionResult Index () {_logger.LogDebug("这是一条调试消息");_logger.LogInformation("这是一条提示消息");_logger.LogWarning("这是一条警告消息");_logger.LogError("这是一条错误消息");_logger.LogCritical("这是一条严重错误");return Ok("Hello World");}
}

Program

using Awesome;
using Serilog;var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();// 添加Serilog日志
builder.Services.AddSerilog();var app = builder.Build();
app.MapControllers();
app.Run();// 关闭日志流
Log.CloseAndFlush();

参考链接

https://serilog.net/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/775511.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

libVLC 动态视频壁纸

在 Windows 上&#xff0c;你可能需要使用 Windows API 来设置壁纸&#xff0c;而在 Linux 上&#xff0c;你可能需要使用某种桌面环境特有的方法。在 macOS 上&#xff0c;这一功能可能受到限制。 效果图如下所示&#xff1a; 以下是一个简单的示例&#xff0c;说明了如何在 …

Ubuntu16.04 切换系统python和gcc版本

4.切换系统python版本 sudo update-alternatives --config python5.切换系统gcc版本 sudo update-alternatives --config gccubuntu16.04中的gcc版本及版本切换 5.查看opencv版本 pkg-config opencv --modversion查看cuda版本 cat /usr/local/cuda/version.txt或者 nvcc …

[Qt] QString::fromLocal8Bit 的使用误区

QString::fromLocal8Bit 是一个平台相关的函数。默认情况下在 Windows 下 就是 gbk 转 utf-8 ,在 Linux就应该是无事发生。因为Linux平台默认的编码方式就是 utf-8 可以通过 void QTextCodec::setCodecForLocale(QTextCodec *c)来修改 Qt默认的编码方式。如下 第一输出乱码的…

【单调队列单调栈专题】【蓝桥杯备考训练】:矩形牛棚、单调栈、滑动窗口、子矩阵、最大子序和、烽火传递【已更新完成】

目录 1、矩形牛棚&#xff08;usaco training 6.1&#xff09; 思路&#xff1a; 预处理的过程&#xff1a; 判断左右边界的过程&#xff1a; 代码&#xff1a; 2、单调栈&#xff08;单调栈模板&#xff09; 思路&#xff1a; 基本步骤&#xff1a; 1、维护单调性 2、处理要求…

vue组件如何使用?

今天我随便试两个组件 第一个轮播图 在minn.js 引入 import { createApp } from vue; import { Swipe, SwipeItem } from vant; const app createApp(); app.use(Swipe); app.use(SwipeItem); <van-swipe class"my-swipe" :autoplay"3000" indica…

python学习15:python中的input语句

python中的input语句 我们前面学习过print语句&#xff0c;可以将内容输出到屏幕上&#xff1b;在python中&#xff0c;与之对应的还有一个input语句&#xff0c;用来获取键盘输入。 数据输出&#xff1a;print 数据输入&#xff1a;input 使用上也很简单&#xff1a; 使用inp…

jvm高级面试题-2024

说下对JVM内存模型的理解 JVM内存模型主要是指Java虚拟机在运行时所使用的内存结构。它主要包括堆、栈、方法区和程序计数器等部分。 堆是JVM中最大的一块内存区域&#xff0c;用于存储对象实例。一般通过new关键字创建的对象都存放在堆中&#xff0c;堆的大小可以通过启动参数…

http 超全状态码

HTTP&#xff08;超文本传输协议&#xff09;是一种用于传输超文本的应用层协议。在进行HTTP通信时&#xff0c;服务器会向客户端返回一个状态码&#xff0c;用于表示请求的处理结果。 状态码由3位数字组成&#xff0c;使用第1个数字表示响应的类别&#xff0c;一共5种&#x…

广告牌效果的C#实现

前言 这个效果是在以前的项目时候&#xff0c;特效那边想要一个广告牌效果但是我不懂什么是广告牌两个人沟通半天&#xff0c;才把东西做出来。 代码如下 using System.Collections; using System.Collections.Generic; using UnityEditor; using UnityEngine;[ExecuteInEdit…

视图的作用

目录 视图的作用 创建视图 为 scott 分配创建视图的权限 查询视图 复杂视图的创建 视图更新的限制问题 更新视图中数据的部门编号&#xff08;视图的存在条件&#xff09; 限制通过视图修改数据表内容 创建只读的视图 复杂视图创建 oracle从入门到总裁:​​​​​​h…

关于GPT-SoVITS语音合成的效果展示(西游之西天送葬团)

目录 使用效果总结合成效果展示 使用效果总结 使用的是2024年03月21日22点28分更新的版本。 使用起来很方便&#xff0c;从它“自带界面”这点就能看出&#xff0c;易于使用也是目的之一&#xff0c;而且从训练到推理的每个步骤都能在界面中完成。 集成了多个实用工具&#…

快速创建zookeeper集群

先说明&#xff0c;我很穷&#xff01;&#xff01;&#xff0c;开不了多个虚拟机&#xff0c;zookeeper集群的3个节点都放在同一个虚拟机&#xff0c;所以搭建是一个伪集群&#xff0c;因为一个服务器挂机&#xff0c;所有节点都会停止。工作实际情况安装到三个服务器&#xf…

Doris 数据集成 Catalog

Doris 数据集成 Catalog 多源数据目录(Multi-Catalog)功能,旨在能够更方便对接外部数据目录,以增强Doris的数据湖分析和联邦数据查询能力。 在之前的 Doris 版本中,用户数据只有两个层级:Database 和 Table。当我们需要连接一个外部数据目录时,我们只能在Database 或 …

3、RabbitMQ_工作模式

一、简单模式 简介 简单模式 HelloWorld。一个生产者、一个消费者&#xff0c;不需要设置交换机使用默认的交换机。 代码示例 生产者public class Producer {//队列名称private final static String QUEUE_NAME "hello";public static void main(String[] args)…

【Linux】文件查看命令(六)

文章目录 wc 命令grep命令&#xff08;常用&#xff09;more 命令cat 命令less 命令&#xff08;不常用&#xff09;head 命令&#xff08;不常用&#xff09;tail 命令&#xff08;不常用&#xff09; wc 命令 功能描述: wc 命令用于统计文件中的字节数、字数、行数等信息。 …

H5抓包——Android 使用电脑浏览器 DevTools调试WebView

H5抓包——Android 使用电脑浏览器 DevTools调试WebView 一、使用步骤 1、电脑通过数据线连接手机&#xff0c;开启USB调试&#xff08;打开手机开发者选项&#xff09; 2、打开待调试的H5 App&#xff0c;进入H5界面 3、打开电脑浏览器&#xff0c;调试界面入口 如果用ed…

第十一章:位运算符与位运算

文章目录 第十一章&#xff1a;位运算符与位运算1.按位与运算&#xff1a;&2.按位或运算&#xff1a;|3.按位异或运算&#xff1a;^4.取反运算符&#xff1a;~5.左移运算符&#xff1a;<<6.右移运算符&#xff1a;>>总结 第十一章&#xff1a;位运算符与位运算…

免费SSL证书和付费SSL证书的区别点

背景&#xff1a; 在了解免费SSL证书和付费SSL证书的区别之前&#xff0c;先带大家了解一下SSL证书的概念和作用。 SSL证书的概念&#xff1a; SSL证书就是基于http超文本传输协议的延伸&#xff0c;在http访问的基础上增加了一个文本传输加密的协议&#xff0c;由于http是明…

二分练习题——妮妮的月饼工厂

妮妮的月饼工厂 题目分析 这里出现了“最高高度”&#xff0c;那么可以考虑用二分去做。 第一阶段二段性分析 希望月饼的高度最大&#xff0c;而月饼的高度要满足一个条件&#xff0c;就是按照该高度切出来的月饼的块数应该大于等于K块。那么现在就是满足条件的最大值&…

【爬虫基础】第6讲 opener的使用

在爬虫中&#xff0c;opener是一个用来发送HTTP请求的对象。它可以用来模拟浏览器发送请求&#xff0c;包括设置请求头、处理Cookie等操作。使用opener可以实现一些高级功能&#xff0c;如模拟登录、处理验证码等。 方法1&#xff1a; from urllib.request import Request,bu…