七、.net core(.NET 6)使用Serilog进行配置和实现日志记录
使用Serilog来实现日志记录
先安装Serilog六件套神装包:
也可以对个别相应的包进行删除等,都是可以的。例如,标注的1是读取配置文件的,如果不需要通过配置文件进行操作,就可以使用这个包。2是打印到控制台的,如果不需要打印到控制台,也可以不引用。3是写入到文件的,如果不需要写入到文件,也是可以不提供的。我在此处全部引入,方便可以使用多种日志记录方法。Async是异步写入日志,一般需要引入。
我们先在启动项目的Program类里面,新增一些对Serilog的支持操作:
然后,在控制器里面添加对Logger<T>的依赖注入,并写一些不同日志等级的日志记录功能:
然后启动项目,并执行一下该api方法,查看到日志打印的结果:
由于默认消息记录级别是Warn,所以debug消息类型就看不见了。
以及写入文本的日志,由于设定输出到本目录,所以可以在解决方案里面直接看见:
接下来使用配置文件的方式进行日志操作:
本部分serilog配置文件代码:
"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:小时
}
}
]
}
}
]
}
在Program里面,注释掉原先的代码,然后新增一条通过配置文件进行读取的语句:
因为配置文件里面设置的最小默认等级是Debug,所以现在可以全部打印出来:
配置文件里面配置的rollingInterval值为3,代表每天生成;path代表根目录,设置log/log.txt代表根目录下的log文件夹,按照每天(日期)生成的log开头的txt日志文件。所以我们可以看见在根目录下产生了一个日志文件log20210530.txt:
以上,代表Serilog通过配置文件成功。其中,还可以通过配置文件+启动项配置两个打配合进行配置出更适合自己的日志记录风格,此处不再赘述,欢迎自己尝试。
另外,Serilog还可以实现seq可视化功能,不过seq是收费的,所以这边不做演示。也可以通过ElasticSearch+Kibana进行开发,实现日志可视化和日志搜索引擎功能,该部分功能敬请期待,将来会有这部分教程放出,现在还没到时候。
本篇有关源码:
Program:
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
} /// <summary>
/// Serilog日志模板
/// </summary>
static string serilogDebug = System.Environment.CurrentDirectory + "\\Log\\Debug\\.log";
static string serilogInfo = System.Environment.CurrentDirectory + "\\Log\\Info\\.log";
static string serilogWarn = System.Environment.CurrentDirectory + "\\Log\\Warning\\.log";
static string serilogError = System.Environment.CurrentDirectory + "\\Log\\Error\\.log";
static string serilogFatal = System.Environment.CurrentDirectory + "\\Log\\Fatal\\.log"; static string SerilogOutputTemplate = "{NewLine}时间:{Timestamp:yyyy-MM-dd HH:mm:ss.fff}{NewLine}日志等级:{Level}{NewLine}所在类:{SourceContext}{NewLine}日志信息:{Message}{NewLine}{Exception}"; public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseServiceProviderFactory(new AutofacServiceProviderFactory()) // 添加Autofac
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>()
.UseUrls("http://*:35678")
.UseSerilog((context, logger) =>//注册Serilog
{
logger.ReadFrom.Configuration(context.Configuration);
logger.Enrich.FromLogContext(); //logger.WriteTo.Console(); // 输出到Console控制台
//// 输出到配置的文件日志目录
//logger.WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(p => p.Level == LogEventLevel.Debug).WriteTo.Async(a => a.File(serilogDebug, rollingInterval: RollingInterval.Hour, outputTemplate: SerilogOutputTemplate)))
// .WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(p => p.Level == LogEventLevel.Information).WriteTo.Async(a => a.File(serilogInfo, rollingInterval: RollingInterval.Hour, outputTemplate: SerilogOutputTemplate)))
// .WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(p => p.Level == LogEventLevel.Warning).WriteTo.Async(a => a.File(serilogWarn, rollingInterval: RollingInterval.Hour, outputTemplate: SerilogOutputTemplate)))
// .WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(p => p.Level == LogEventLevel.Error).WriteTo.Async(a => a.File(serilogError, rollingInterval: RollingInterval.Hour, outputTemplate: SerilogOutputTemplate)))
// .WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(p => p.Level == LogEventLevel.Fatal).WriteTo.Async(a => a.File(serilogFatal, rollingInterval: RollingInterval.Hour, outputTemplate: SerilogOutputTemplate)));
}); });
}
WSKController:
[Route("api/[controller]")]
[ApiController]
public class WSKController : ControllerBase
{ private readonly ITestAutofac _autofac;
private readonly ILogger<WSKController> _logger;
public WSKController(ITestAutofac autofac, ILogger<WSKController> logger) {
_autofac = autofac;
_logger = logger;
} [HttpPost]
public IActionResult HelloWorld()
{
// _autofac.Test(); _logger.LogInformation("Info Message……");
_logger.LogWarning("Warning Message……");
_logger.LogDebug("Debug Message……");
_logger.LogError("Error Message……"); return Ok();
} }
最后,如果本文章对君有用,欢迎点赞、评论和打赏~~
版权所有,转载请注明出处:https://www.cnblogs.com/weskynet/p/14829299.html
最新文章
- CSS权威指南之css声明,伪类,文本处理--(简要笔记一)
- writing
- 【原创】Java和C#下String类型中的==和equals的原理与区别
- 学术作为一种志业 马克斯&#183;韦伯Max Weber。
- Struts
- QQ第三方登录
- (IOS)Swift Music 程序分析
- (转)UIApplication sharedApplication详细解释-IOS
- yii2 增加新的目录结构
- SeuRain的归来
- html笔记 横向两列布局
- 《cracking the coding intreview》——链表
- Laravel 中使用子域名(一个框架多项目)
- 团队作业7——Alpha冲刺之事后诸葛亮(宣告项目失败团队解散)
- eclipse新建的项目,也添加到tomcat上了,地址栏访问的时候就是访问不到。。。怎么办
- Android开发学习之RecyclerView
- PE 装机
- 解决ie9以下浏览器对html5新增标签的不识别,并导致CSS不起作用的问题
- iOS开发中的 ARC
- spring boot 总结
热门文章
- Day09_47_Map
- 【Java集合】JDK1.7和1.8 HashMap有什么区别
- SpringCloud之服务网关Gateway,入门+实操
- CTF常见的加密和编码方法
- Windows核心编程 第四章 进程(中)
- XCTF-supersqli
- 3-5年以上的Android原生开发如何深入进阶?高级工程师必须要掌握哪些?
- axios提交表单
- Docker为PHP安装gd扩展
- The content of element type ";web-app"; must match ";(icon?,display- name?,description?,distributable?,context-param*,filter*,filter-mapping*,listener*,servlet*,servlet- mapping*,session-config?