当前位置: 首页 > news >正文

实现.NetCore集成Serilog,写入日志文件,并按日期拆分文件夹

“之前使用的log4net,遇到一个问题就是导致日志文件夹循环嵌套,未找到确切原因,自己猜想可能在高并发情况下会资源竞争导致,要解决,可能需要自行编码实现日志队列”。所以尝试使用Serilog。习惯了log4net的日志目录结构,首先按日期分文件夹,然后按日志界别拆分日志文件,在Serilog中需要自行实现。
实现效果如下:
在这里插入图片描述

文章目录

      • 一、引入Serilog的类库
      • 二、封装Serilog扩展方法
      • 三、NetCore项目中使用
        • 1、`Program`中使用
        • 2、测试Controller

一、引入Serilog的类库

Serilog.AspNetCore – 基础库
Serilog.Sinks.Async – 异步写日志
Serilog.Sinks.File – 写入日志到文件

二、封装Serilog扩展方法

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Serilog;
using Serilog.Events;
using Serilog.Formatting.Display;namespace HJMinimally.Serilog
{public static class SerilogServiceCollectionExtensions{public static IServiceCollection AddSerilogToFile(this IServiceCollection services, IConfiguration configuration, LogEventLevel minimumLevel = LogEventLevel.Debug, int retainedFileCountLimit = 14){// 配置 SerilogLog.Logger = new LoggerConfiguration().MinimumLevel.Is(minimumLevel).Enrich.FromLogContext().WriteTo.Logger(lc => lc.Filter.ByIncludingOnly(e => e.Level == LogEventLevel.Verbose).WriteTo.Async(wt => wt.File(path: GenerateLogPath(LogEventLevel.Verbose),rollingInterval: RollingInterval.Day,formatter: new MessageTemplateTextFormatter("{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {SourceContext}: {Message}{NewLine}{Exception}"),fileSizeLimitBytes: 1024 * 1024 * 10,encoding: System.Text.Encoding.UTF8,rollOnFileSizeLimit: true,retainedFileCountLimit: retainedFileCountLimit))).WriteTo.Logger(lc => lc.Filter.ByIncludingOnly(e => e.Level == LogEventLevel.Debug).WriteTo.Async(wt => wt.File(path: GenerateLogPath(LogEventLevel.Debug),rollingInterval: RollingInterval.Day,formatter: new MessageTemplateTextFormatter("{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {SourceContext}: {Message}{NewLine}{Exception}"),fileSizeLimitBytes: 1024 * 1024 * 10,encoding: System.Text.Encoding.UTF8,rollOnFileSizeLimit: true,retainedFileCountLimit: retainedFileCountLimit))).WriteTo.Logger(lc => lc.Filter.ByIncludingOnly(e => e.Level == LogEventLevel.Information).WriteTo.Async(wt => wt.File(path: GenerateLogPath(LogEventLevel.Information),rollingInterval: RollingInterval.Day,formatter: new MessageTemplateTextFormatter("{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {SourceContext}: {Message}{NewLine}{Exception}"),fileSizeLimitBytes: 1024 * 1024 * 10,encoding: System.Text.Encoding.UTF8,rollOnFileSizeLimit: true,retainedFileCountLimit: retainedFileCountLimit))).WriteTo.Logger(lc => lc.Filter.ByIncludingOnly(e => e.Level == LogEventLevel.Warning).WriteTo.Async(wt => wt.File(path: GenerateLogPath(LogEventLevel.Warning),rollingInterval: RollingInterval.Day,formatter: new MessageTemplateTextFormatter("{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {SourceContext}: {Message}{NewLine}{Exception}"),fileSizeLimitBytes: 1024 * 1024 * 10,encoding: System.Text.Encoding.UTF8,rollOnFileSizeLimit: true,retainedFileCountLimit: retainedFileCountLimit))).WriteTo.Logger(lc => lc.Filter.ByIncludingOnly(e => e.Level == LogEventLevel.Error).WriteTo.Async(wt => wt.File(path: GenerateLogPath(LogEventLevel.Error),rollingInterval: RollingInterval.Day,formatter: new MessageTemplateTextFormatter("{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {SourceContext}: {Message}{NewLine}{Exception}"),fileSizeLimitBytes: 1024 * 1024 * 10,encoding: System.Text.Encoding.UTF8,rollOnFileSizeLimit: true,retainedFileCountLimit: retainedFileCountLimit))).WriteTo.Logger(lc => lc.Filter.ByIncludingOnly(e => e.Level == LogEventLevel.Fatal).WriteTo.Async(wt => wt.File(path: GenerateLogPath(LogEventLevel.Fatal),rollingInterval: RollingInterval.Day,formatter: new MessageTemplateTextFormatter("{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {SourceContext}: {Message}{NewLine}{Exception}"),fileSizeLimitBytes: 1024 * 1024 * 10,encoding: System.Text.Encoding.UTF8,rollOnFileSizeLimit: true,retainedFileCountLimit: retainedFileCountLimit)))// 控制台输出.WriteTo.Console(outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {SourceContext}: {Message}{NewLine}{Exception}").CreateLogger();// 将 Serilog 集成到 ASP.NET Core 日志系统中services.AddLogging(loggingBuilder =>{loggingBuilder.ClearProviders(); // 清除默认的日志提供程序//控制台/桌面/自托管服务:建议在程序结束前加 Log.CloseAndFlush();//如果你用的是 loggingBuilder.AddSerilog(dispose: true),Serilog 会在应用关闭时自动处理资源释放,通常不需要手动调用 Log.CloseAndFlush()。loggingBuilder.AddSerilog(dispose: true); // 添加 Serilog 作为日志提供程序});return services;}private static string GenerateLogPath(LogEventLevel logEventLevel){var now = DateTimeOffset.Now;return $"Logs/{now:yyyy}-{now:MM}-{now:dd}/{logEventLevel}-.txt";}}
}

三、NetCore项目中使用

1、Program中使用
builder.Services.AddSerilogToFile(builder.Configuration, retainedFileCountLimit: 7); // 保留最近7个日志文件
2、测试Controller
[ApiController]
[Route("[controller]")]
public class LogController : ControllerBase
{private readonly ILogger<LogController> _logger;public LogController(ILogger<LogController> logger){_logger = logger;}[HttpGet]public IActionResult Get(){// 记录不同级别的日志_logger.LogTrace("这是一条Trace级别的日志");_logger.LogCritical("这是一条Critical级别的日志");_logger.LogDebug("这是一条Debug级别的日志");_logger.LogInformation("这是一条Information级别的日志,用户访问了Get方法");_logger.LogWarning("这是一条Warning级别的日志");try{int c = 0;// 模拟异常int result = 1 / c;return Ok(result);}catch (Exception ex){// 记录错误日志,包含异常信息_logger.LogError(ex, "发生了一个错误");return BadRequest("操作失败");}}
}
http://www.dtcms.com/a/388957.html

相关文章:

  • [新启航]航空发动机燃烧室喷嘴孔深光学 3D 轮廓测量 - 激光频率梳 3D 轮廓技术
  • iOS 上架 App 流程全解析 苹果应用发布步骤、App Store 审核流程、ipa 文件上传与 uni-app 打包实战经验
  • 22.6 单卡A100驯服30亿参数模型!DeepSpeed ZeRO-3实战显存优化指南
  • jvm垃圾搜集器
  • 小红书开放平台笔记详情接口实战:内容解析与数据挖掘全方案
  • App 上架平台全解析,iOS 应用发布流程、苹果 App Store 审核步骤
  • BeeWorks:私有化部署即时通讯,铸就企业数字安全基石
  • (数据分析方向)Flask 动漫数据可视化分析系统(Echarts + 番剧管理・大数据)(源码)✅
  • 2025 最新版 Node.js 下载安装及环境配置教程
  • 分布式流处理与消息传递——Kafka ISR(In-Sync Replicas)算法深度解析
  • JVM(三)-- 运行时数据区
  • 从比特币到Web3:数字资产犯罪的演进史
  • godot+c#实现状态机
  • linux计划任务管理
  • excel文件导入+存储过程导入表到业务表
  • Chromium 138 编译指南 macOS 篇:构建配置与编译优化(五)
  • 基于Java与Vue的MES生产制造管理系统,实现生产流程数字化管控,涵盖计划排程、质量追溯、设备监控等功能模块,提供完整源码支持二次开发,助力智能制造升级
  • 人工智能基础:从感知机到神经网络核心知识整合​
  • 电子制造设备中螺杆支撑座如何保障精度与质量控制?
  • 东莞精密制造工厂6人共用一台服务器做SolidWorks设计
  • 智能科学与技术专业毕业设计选题推荐:计算机视觉与自然语言处理
  • 基于STM32F103C8T6与HC-08蓝牙模块实现手机连接方案
  • OpenCV 4.12.0源码解析:核心模块原理与实战应用
  • PyTorch 与 TensorFlow 的深度对比分析
  • 怀旧电玩游戏ROM合集 50T模拟器游戏资源分享
  • MacCAD2019.dmg 安装包使用教程|Mac电脑安装CAD2019全流程
  • IP失效,溯源无门:微隔离如何破局容器环境下“黑域名”攻击溯源难题!
  • 基于dify做聊天查询的智能体(一)
  • 关于 C 语言 编程语言常见问题及技术要点的说明​
  • Chromium 138 编译指南 macOS 篇:高级优化与调试技术(六)