首页 > 编程语言 >手把手教你AspNetCore WebApi:Serilog(日志)

手把手教你AspNetCore WebApi:Serilog(日志)

时间:2023-06-05 22:07:44浏览次数:51  
标签:WebApi Log Serilog AspNetCore args new logger public

前言

小明目前已经把“待办事项”功能实现了,API文档也搞定了,但是马老板说过,绝对不能让没有任何监控的项目上线的。

Serilog是什么?

在.NET使用日志框架第一时间会想到NLog或是Log4Net,Serilog 是这几年快速崛起的Log框架之一,Serilog是以Structured logging 为基础进行设计,透过logging API 可以轻松的记录应用程式中对象属性,方便快速进行logging 内容进行查询与分析,并将其纪录内容透过json (可指定) 的方式输出。

使用

首先,将Serilog.AspNetCore NuGet软件包安装到您的应用程序中。

dotnet add package Serilog.AspNetCore

接下来,在应用程序的Program.cs文件中,首先配置Serilog。

public static void Main(string[] args)
{
    Log.Logger = new LoggerConfiguration()
        .MinimumLevel.Debug()
        .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
        .Enrich.FromLogContext()
        .WriteTo.Console()
        .CreateLogger();

    try
    {
        Log.Information("启动主机");
        CreateHostBuilder(args).Build().Run();
    }
    catch (Exception ex)
    {
        Log.Fatal(ex, "主机意外终止");
    }
    finally
    {
        Log.CloseAndFlush();
    }
}

然后,添加UseSerilog()到中的通用主机CreateHostBuilder()。

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .UseSerilog() // <-添加此行
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        });

然后,通过删除默认记录器的其余配置进行清理:

  • "Logging"从appsettings.json文件中删除此部分

最后,调试启动vs,可以查看以下效果:

手把手教你AspNetCore WebApi:Serilog(日志)_json

在控制器使用

首先.NETCore通过继承 ILogger接口实现了它自己的日志记录。通过借助依赖注入机制,它可以很容易地使用。

private readonly TodoContext context;
private readonly ILogger<TodosController> logger; // <-添加此行

public TodosController(TodoContext context, ILogger<TodosController> logger)
{
    this.context = context ?? throw new ArgumentNullException(nameof(context));
    this.logger = logger ?? throw new ArgumentNullException(nameof(logger)); // <-添加此行
}

/// <summary>
/// 获取所有待办事项
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<ActionResult<IEnumerable<Todo>>> GetTodo()
{
    logger.LogInformation("启动{ActionName}", "获取所有待办事项"); // <-添加此行
    var todos = await context.Todo.ToListAsync();

    return todos;
}

测试GetTodo接口,再次查看以下效果:

手把手教你AspNetCore WebApi:Serilog(日志)_json_02

输出到文件

在原来的输出到控制台的基础上增加.WriteTo.File(@"C:\LogFiles\log.txt")就可以了。

Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Debug()
    .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
    .Enrich.FromLogContext()
    .WriteTo.Console()
    .WriteTo.File(
        @"C:\LogFiles\log.txt")
    .CreateLogger();

再次查看以下效果:

手把手教你AspNetCore WebApi:Serilog(日志)_json_03

使用配置文件

更改appsettings.json内容:

"Serilog": {
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "Microsoft": "Warning",
        "System": "Warning"
      }
    },
    "WriteTo": [
      { "Name": "Console" },
      {
        "Name": "File",
        "Args": { "path": "C:\\LogFiles\\log.txt" }
      }
    ],
    "Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ]
  },

更改Program类,使用ReadFrom.Configuration()并传递一个IConfiguration对象。

public static IConfiguration Configuration { get; } = new ConfigurationBuilder()
    .SetBasePath(Directory.GetCurrentDirectory())
    .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
    .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json", optional: true)
    .AddEnvironmentVariables()
    .Build();

public static void Main(string[] args)
{
    Log.Logger = new LoggerConfiguration()
        .ReadFrom.Configuration(Configuration)
        .Enrich.FromLogContext()
        .CreateLogger();

    try
    {
        Log.Information("启动主机");
        CreateHostBuilder(args).Build().Run();
    }
    catch (Exception ex)
    {
        Log.Fatal(ex, "主机意外终止");
    }
    finally
    {
        Log.CloseAndFlush();
    }
}

小结

目前为止,小明把日志记录也搞定了,摸了摸光滑的脑袋,对于优秀青年小明来说添加日志按时so easy!当然Serilog可不是这么简单,还有很多功能留给其他小伙伴们去发掘。



标签:WebApi,Log,Serilog,AspNetCore,args,new,logger,public
From: https://blog.51cto.com/u_4018548/6419725

相关文章

  • 手把手教你AspNetCore WebApi:缓存(MemoryCache和Redis)
    前言这几天小明又有烦恼了,系统上线一段时间后,系统性能出现了问题,马老板很生气,叫小明一定要解决这个问题。性能问题一般用什么来解决呢?小明第一时间想到了缓存。什么是缓存缓存是实际工作中非常常用的一种提高性能的方法。缓存可以减少生成内容所需的工作,从而显著提高应用程序的性能......
  • 手把手教你AspNetCore WebApi:增删改查
    前言小明已经创建与运行了WebApi项目,了解项目结构有哪些组成,并学会了怎么发布到IIS。基础已经建好,从现在开始要真正实现待办事项的功能了。新建表CREATETABLE[dbo].[Todo]( [Id][uniqueidentifier]NOTNULL, [Name][nvarchar](100)NULL,CONSTRAINT[PK_Todo]PRIMARYKEY......
  • 手把手教你AspNetCore WebApi:认证与授权
    前言这几天小明又有烦恼了,之前给小红的接口没有做认证授权,直接裸奔在线上,被马老板发现后狠狠的骂了一顿,赶紧让小明把授权加上。赶紧Baidu一下,发现大家都在用JWT认证授权,这个倒是挺适合自己的。什么是TokenToken是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后......
  • Python|通过FastAPI开发一个快速的WebAPI项目
    前言Python如此受欢迎的众多原因之一是Python有大量成熟和稳定的库可供选择:网页开发有:Django和Flask,提供了很好的网络开发体验和大量的有用文档机器学习有:scikit-learn、Keras等,提供了丰富的机器学习的包和数据处理和可视化工具。FastAPI是一个快速、轻量级的现代A......
  • .net 温故知新【11】:Asp.Net Core WebAPI 入门使用及介绍
    在Asp.NetCore上面由于现在前后端分离已经是趋势,所以asp.netcoreMVC用的没有那么多,主要以WebApi作为学习目标。一、创建一个WebApi项目我使用的是VS2022,.Net7版本。在创建界面有几项配置:配置Https启用Docker使用控制器启用OpenAPI支持不使用顶级语句其中配置Ht......
  • .NET Core WebAPI 认证授权之JWT
    @@.NETCoreWebAPI认证授权之JWT--google from --->NETCoreWebAPI认证授权之JWT(二)  在上一篇 《.NET缓存系列(一):缓存入门》中实现了基本的缓存,接下来需要对缓存进行改进,解决一些存在的问题。一、缓存过期策略问 题:当源数据更改或删除时,服务器程序并不知道,导......
  • NET Core WebAPI 认证授权之JWT
    @@.netcoretoken非对称加密 --Google-->@@wepapi认证授权之jwt NETCoreWebAPI认证授权之JWT(二):HMAC算法实操  一、前言在上一篇 《.NETCoreWebAPI认证授权之JWT(一):JWT介绍》中讲到了JWT的组成,分为三部分,其中标头(header)和载荷(payload)都只是简单的将json......
  • aspnetcore最最简单的接口权限认证
    五月一眨眼就过去,就当凑个数吧。场景:一个小小的项目,需要一个后台,就展示几个列表,连用户表、角色表等都不需要设计。之前有写过identityserver4和jwt4的demo(exercisebook/IdentityServer4&Serilogatmain·liuzhixin405/exercisebook·GitHubexercisebook/授权/授权一/Jw......
  • C# WebApi接收参数的常用方式
    C#后端开发请求相关知识C#WebApi接收参数的常用方式查询字符串参数:查询字符串是通过HTTPGET请求中的URL中传递的键值对。在WebAPI中,可以使用以下方式获取查询字符串参数://使用Request.QueryString获取单个查询字符串参数stringname=Request.QueryString["name......
  • ASP.NET MVC WebAPI Put和Delete请求出现405(Method not allowed)错误
    解决办法:在站点根目录下的web.config设置如下(主要参考添加项):<system.webServer></system.webServer>(End)转自:https://www.bbsmax.com/A/qVdepEM85P/......