• AspNetCore WebApi:Serilog(日志)


    前言

    小明目前已经把“待办事项”功能实现了,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,可以查看以下效果:

     
    image

    在控制器使用

    首先.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接口,再次查看以下效果:

     
    image

    输出到文件

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

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

    再次查看以下效果:

     
    image

    使用配置文件

    更改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();
        }
    }
    

     

  • 相关阅读:
    Centos 6 安装python2.7.6
    更新centos系统的python版本
    centos中wget的使用方法
    开启apahce的mod_speling.so模块,让使用apahce http服务器不再有大小写烦恼
    开启server-status失败
    TCP三次握手与四次挥手
    GitHub入门和项目托管
    使用javac,手动编译一个java文件的方法
    《TomCat与Java Web开发技术详解》(第二版) 第四章节的学习总结--常用Servlet API
    《TomCat与Java Web开发技术详解》(第二版) 第三章节的学习总结--利用Context元素来自定义web应用的存储位置
  • 原文地址:https://www.cnblogs.com/zxtceq/p/14151078.html
Copyright © 2020-2023  润新知