让我来给您讲解一下如何使用Serilog替换掉Log4j。
1. 搭建.Net Core项目框架
首先,我们需要新建一个.Net Core WebApi项目,并安装对应的NuGet包——Serilog和Serilog.AspNetCore。
在Program.cs文件中启用Serilog,代码如下:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseSerilog((context, loggerConfiguration) =>
{
loggerConfiguration
.Enrich.FromLogContext()
.WriteTo.Console();
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
2. 替换掉Log4j
现在我们来看看如何使用Serilog替换掉Log4j。
首先,我们需要卸载掉Log4j的NuGet包,然后安装Serilog.Sinks.File包。
在appsettings.json文件中添加Serilog的配置,将日志文件保存到logs文件夹中:
"Serilog": {
"Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ],
"MinimumLevel": "Information",
"WriteTo": [
{
"Name": "Console"
},
{
"Name": "File",
"Args": {
"path": "logs/log-.txt",
"rollingInterval": "Day",
"retainedFileCountLimit": 30
}
}
],
"Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ],
"Properties": {
"Application": "WebApi"
}
}
接下来,在Startup.cs文件的Configure方法中加入Serilog的中间件:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddSerilog();
...
}
最后,我们需要将原先使用Log4j的代码全部替换掉。例如,将原先的代码:
private static readonly ILog Logger = LogManager.GetLogger(Log4NetHelper.GetConfigPath(), "LoggerName");
替换成:
private static readonly ILogger Logger = Log.ForContext<ClassName>();
这里的ClassName指的是当前类的名称。
示例说明
以下是两个示例说明:
示例1:使用Serilog记录请求日志
我们可以使用Serilog在每个请求的开始和结束时分别记录请求的详细信息。假设我们有一个中间件类:
public class RequestLoggingMiddleware
{
private readonly RequestDelegate _next;
private readonly ILogger _logger;
public RequestLoggingMiddleware(RequestDelegate next, ILoggerFactory loggerFactory)
{
_next = next;
_logger = loggerFactory.CreateLogger<RequestLoggingMiddleware>();
}
public async Task Invoke(HttpContext context)
{
_logger.LogInformation("Request started: {Method} {Url} from {Ip}", context.Request.Method, context.Request.Path, context.Connection.RemoteIpAddress);
await _next.Invoke(context);
_logger.LogInformation("Request finished: {Status}", context.Response.StatusCode);
}
}
在Startup.cs文件中将中间件注册到管道中:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory)
{
app.UseMiddleware<RequestLoggingMiddleware>();
...
}
现在每个请求的详细信息都会被记录下来。
示例2:使用Serilog记录异常日志
我们可以在应用程序抛出未处理的异常时使用Serilog记录异常的详细信息。假设我们有一个异常过滤器:
public class ApiExceptionFilterAttribute : ExceptionFilterAttribute
{
private readonly ILogger _logger;
public ApiExceptionFilterAttribute(ILoggerFactory loggerFactory)
{
_logger = loggerFactory.CreateLogger<ApiExceptionFilterAttribute>();
}
public override void OnException(ExceptionContext context)
{
_logger.LogError(context.Exception, "An unhandled exception has occurred: {Message}", context.Exception.Message);
base.OnException(context);
}
}
在Startup.cs文件中将过滤器注册到全局过滤器中:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers(options => options.Filters.Add<ApiExceptionFilterAttribute>());
...
}
现在当应用程序抛出未处理的异常时,会在日志文件中记录异常的详细信息。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:.Net Core3.0 WebApi 项目框架搭建之使用Serilog替换掉Log4j - Python技术站