前言
在之前的文章我们已经把.net core api项目成功部署到linux系统,详情链接《.net core3.1项目部署到linux的docker》,接下来准备开始完善补齐我们的接口项目,一般.net项目记录日志信息的架包最常用的就是log4net跟NLog,根据自己喜好,本文使用的是NLog。
开始
1、NuGet添加依赖项
<PackageReference Include="NLog" Version="4.7.5" />
<PackageReference Include="NLog.Web.AspNetCore" Version="4.9.3" />
2、创建Nlog配置文件
在项目根目录创建一个nlog.config的文件
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
autoReload="true"
throwExceptions="false"
internalLogLevel="Warn"
internalLogFile="Logs\internal-nlog.txt">
<!-- 启用asp.net核心布局渲染器 -->
<extensions>
<add assembly="NLog.Web.AspNetCore"/>
</extensions>
<targets>
<!-- 写入文件配置 -->
<!-- 将日志写入文件 -->
<target xsi:type="File" name="allfile" fileName="Logs\nlog-all-${shortdate}.log"
layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring} ${newline}" />
<!-- 另一个文件日志,只有自己的日志。使用一些ASP.NET核心渲染器 -->
<target xsi:type="File" name="ownFile-web" fileName="Logs\nlog-own-${shortdate}.log"
layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action} ${newline}" />
</targets>
<rules>
<!--所有日志,包括来自Microsoft的-->
<!--minlevel 改为Trace 跟踪全部 Error 只捕获异常-->
<logger name="*" minlevel="Trace" writeTo="allfile" />
<!--跳过非关键的Microsoft日志,因此只记录自己的日志-->
<logger name="Microsoft.*" maxlevel="Info" final="true" />
<!-- BlackHole without writeTo -->
<logger name="*" minlevel="Trace" writeTo="ownFile-web" />
</rules>
</nlog>
3、启用复制到bin文件夹
手动编辑.csproj文件并添加
<ItemGroup>
<Content Update="nlog.config" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>
4、修改program.cs
using System;
using NLog.Web;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Hosting;
public static void Main(string[] args)
{
var logger = NLog.Web.NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();
try
{
logger.Debug("初始化 main");
CreateHostBuilder(args).Build().Run();
}
catch (Exception exception)
{
//NLog: 捕获设置错误
logger.Error(exception, "由于异常而停止程序");
throw;
}
finally
{
// 确保在应用程序退出之前刷新并停止内部计时器/线程(避免Linux上出现分段错误)
NLog.LogManager.Shutdown();
}
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.ConfigureLogging(logging =>
{
logging.ClearProviders();
logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
})
.UseNLog(); // NLog: 为依赖注入设置NLog
5、配置appsettings.json
{
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Trace",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
记住还要更新任何特定于环境的配置,以避免任何意外。appsettings.Development.json
6、开始写日志
在默认控制器中注入ILogger
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
namespace TestAPI.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class ValuesController: ControllerBase
{
private readonly ILogger<ValuesController> _logger;
public ValuesController(ILogger<ValuesController> logger)
{
_logger = logger;
_logger.LogDebug(1, "NLog注入控制器");
}
// GET api/<ValuesController>/5
[HttpGet("{id}")]
[AllowAnonymous]
public string Get(int id)
{
_logger.LogInformation("Hello, 这是一个测试输出日志!");
return "value";
}
}
}
7、输出示例
参考官方文档
https://github.com/NLog/NLog/wiki/Getting-started-with-ASP.NET-Core-3