1、引用NLog组件
通过NuGet安装NLog、NLog.Web.AspNetCore包。
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" keepVariablesOnReload="true" throwExceptions="false" internalLogLevel="Off" internalLogFile="log/nlog.txt"> <!-- the targets to write to --> <targets async="true"> <!-- File Target for all log messages with basic details --> <!-- enableFileDelete: 是否允许删除日志文件。其取值类型为Boolean,默认为true。 maxArchiveFiles: 保存的最大存档文件数。其类型类Integer,默认为9个。 archiveNumbering: 存档文件的编号方式。 可选值: Rolling – 滚动式编号,即最新的日志文件编号为0,然后是1,… ,N。 Sequence – 序列式编号,即最大编号的日志文件为最新的日志文件。 archiveAboveSize: 存档上限值。当日志文件大于此值是,将自动存档。其类型为Long。 注意:在多进程并发记录日志的情况下,启用该选项可能会大幅降低日志记录速度。 在单进程时,为了达到最佳性能,可以考虑设置ConcurrentWrites为false。 bufferSize: 日志文件缓存区大小(单位:字节)。其取值类型为Integer,默认值为32768(32KB)。 deleteOldFileOnStartUp: 启动时,是否删除旧的日志文件。其取值类型为Boolean,默认为false。 concurrentWriteAttemptDelay: 在再次尝试将日志写入文件之前延迟的毫秒数。其取值类型为Integer,默认值为1。 备注:实际的延迟时间,是一个介于0到指定参数值之间的随机整数,且在每次尝试失败之后,都会将此参数加倍。 假使此参数值为10,则第一次重试写入的延迟时间(毫秒数)在 0-10之间的一个随机数, 第二次重试时为0-20之间的一个随机数,第三次重试时为0-40之间的一个随机数, 第四次重试时为0-80之间的一个随机数等等,以此类推。 keepFileOpen: 是否保持日志文件处于打开状态,以代替其在每次日志写事件发生时频繁打开和关闭。 其取值类型为Boolean,默认值为false。 备注:设置此属性为true,有助于提高性能。 openFileCacheTimeout: 文件保持打开状态的最大时间秒数。如果这个数字为负数,则在一定不活动时间后, 文件不会自动关闭。其取值类型为Integer,默认值为-1。(即默 认状态下文件始终处于打开状态以备写入。) autoFlush: 在每次日志信息后,是否自动刷新文件缓存区。其取值类型为Boolean,默认值为true。 createDirs: 是否允许自动创建(不存在的)目录。其取值类型为Boolean,默认为true。 encoding: 文件编码方式。 archiveFileName: 存档文件名称。允许使用Layout。 --> <target xsi:type="File" name="allfile" fileName="${basedir}/logs/log.txt" enableFileDelete="true" maxArchiveFiles="20" concurrentWrites="true" archiveNumbering="Sequence" archiveAboveSize="2097152" bufferSize="327680" deleteOldFileOnStartup="false" concurrentWriteAttemptDelay="10" keepFileOpen="true" openFileCacheTimeout="30" autoFlush="false" openFileFlushTimeout="30" createDirs="true" encoding="utf-8" enableArchiveFileCompression="true" archiveFileName="${basedir}/archivelogs/log${date:format=yyyy\-MM\-dd_HH\-mm\-ss}.zip" layout="[${counter}] ${longdate} [${level}] [${processid}] [${processname}] ${message} ${newline} ${stacktrace}"/> </targets> <!-- rules to map from logger name to target --> <rules> <!--All logs, including from Microsoft--> <logger name="*" minlevel="Trace" writeTo="allfile"/> </rules> </nlog>
3、注入NLog组件
在注入NLog组件之前要先对其进行配置,然后通过IHostBuilder接口注入NLog组件。
修改Program.cs如下:
public class Program { public static void Main(string[] args) { var configFileName = Path.Combine("Config", "NLog.config"); var logger = NLogBuilder.ConfigureNLog(configFileName).GetCurrentClassLogger(); try { logger.Debug("Program startup."); CreateHostBuilder(args).Build().Run(); } catch (Exception exception) { //NLog: catch setup errors logger.Error(exception, "Stopped program because of exception"); throw; } finally { logger.Debug("Program shutdown."); // Ensure to flush and stop internal timers/threads before application-exit (Avoid segmentation fault on Linux) NLog.LogManager.Shutdown(); } } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }) .ConfigureLogging(logging => { logging.ClearProviders(); logging.SetMinimumLevel(LogLevel.Trace); }) .UseNLog(); // NLog: Setup NLog for Dependency injection }
4、使用NLog组件
正常使用ILogger接口注入即可,不需要额外代码修改。
[ApiController] [Route("api/[controller]")] public class WeatherForecastController : ControllerBase { private readonly ILogger<WeatherForecastController> _logger; public WeatherForecastController(ILogger<WeatherForecastController> logger) { _logger = logger; } }