.Net 日志系统-Serilog

Serilog 是一个结构化的 C# 日志库。

跟log4net和nlog相比,Serilog记录结构化日志更加方便,可以对日志内容自定义格式输出,方便查询和使用。

.Net Core程序记录日志到文本文件中,下面用代码来演示如何实现:

基于.Net Core WebApi 3.1程序,项目结构如下图:

.Net 日志系统-Serilog_第1张图片

1.NuGet应用程序集:Serilog.AspNetCore

2.在Program.cs中创建全局静态实例并启用Serilog

.Net 日志系统-Serilog_第2张图片

Program.cs完整代码:

using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
using Serilog;
using System;
using System.Text;

namespace SerilogProject
{
    public class Program
    {
        public static void Main(string[] args)
        {

            // 创建全局静态实例
            Log.Logger = new LoggerConfiguration()
            //设置最小日志级别
            .MinimumLevel.Debug()
            //将日志写到文件
            .WriteTo.File($"logs/{DateTime.Now:yyyy-MM-dd}/log.txt", //日志按照天为单位创建文件夹
                outputTemplate: @"{Timestamp:yyyy-MM-dd HH:mm-ss.fff }[{Level:u3}] {Message:lj}{NewLine}{Exception}",  // 设置输出格式,显示详细异常信息
                rollingInterval: RollingInterval.Day, //日志按天保存
                rollOnFileSizeLimit: true,            // 限制单个文件的最大长度
                fileSizeLimitBytes: 10 * 1024,        // 单个文件最大长度10K
                encoding: Encoding.UTF8,              // 文件字符编码
                retainedFileCountLimit: 10            // 最大保存文件数,超过最大文件数会自动覆盖原有文件
            ) 
            .CreateLogger();


            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup();
                }).UseSerilog();
    }
}

 

3.在需要记录日志的地方调用日志记录方法,下面以控制器类中调用为例:

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using System;

namespace SerilogProject.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {

        private readonly ILogger _logger;

        public WeatherForecastController(ILogger logger)
        {
            _logger = logger;
        }

        [HttpGet]
        public void Get()
        {
            _logger.LogDebug("我是Debug信息");
            _logger.LogInformation("我是info信息");
            _logger.LogWarning("我是Warning信息");
            _logger.LogError("我是error信息");
            _logger.LogCritical("我是Critical信息");


            var person = new Person { Name = "aa", FirstName = "bb", Id = 5 };
            _logger.LogInformation("Person类信息: {@Person}", person);

            _logger.LogInformation("The time is {Now}", DateTime.Now);

            _logger.LogInformation("开始测试");

            try
            {
                _logger.LogDebug("抛出异常");
                throw new InvalidProgramException("程序错误。");
            }
            catch (Exception e)
            {
                _logger.LogError(e, "捕获异常");
            }

        }
    }



}

Person.cs

namespace SerilogProject.Controllers
{
    internal class Person
    {
        public string Name { get; set; }
        public string FirstName { get; set; }
        public int Id { get; set; }
    }
}

程序执行结果:

.Net 日志系统-Serilog_第3张图片

.Net 日志系统-Serilog_第4张图片 

.Net 日志系统-Serilog_第5张图片

 

同样可以输出日志到控制台、数据库、MongoDB等。

你可能感兴趣的:(杨中科.net6学习,serilog,结构化日志)