Serilog 是一个结构化的 C# 日志库。
跟log4net和nlog相比,Serilog记录结构化日志更加方便,可以对日志内容自定义格式输出,方便查询和使用。
.Net Core程序记录日志到文本文件中,下面用代码来演示如何实现:
基于.Net Core WebApi 3.1程序,项目结构如下图:
1.NuGet应用程序集:Serilog.AspNetCore
2.在Program.cs中创建全局静态实例并启用Serilog
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; }
}
}
程序执行结果:
同样可以输出日志到控制台、数据库、MongoDB等。



