首页 DotNet NET8下的ILogger如何写入输出到文本 难道ILogger只能在控制台里输出日志吗

NET8下的ILogger如何写入输出到文本 难道ILogger只能在控制台里输出日志吗

2024-09-13 08:59 编辑:  丽丽学习网

NET8下的ILogger如何写入输出到文本 难道ILogger只能在控制台里输出日志吗, 现在记录一下,网站日志是可以输出到文本中的。

一、 首先安装一个NLog.Extensions.Logging包

打开nuget包管理器,搜索NLog.Extensions.Logging然后安装稳定版(目前是5.3.11,可能以后会更新,不过你使用.net8时就安装这个即可)

二、根目录下新建一个日志配置文件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"
      xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
      autoReload="true"
      internalLogLevel="Info"
      internalLogFile="nlog-internal.log">
<!--Nlog 文档参考地址: , 被www.hao366.net站长编辑 -->
<!--internalLogLevel Nlog内部日志记录为Off关闭。除非纠错,不可以设为Trace否则速度很慢,起码Debug以上-->
<!--自定义日志输出文件路径及命名规则-->
<variable name="logDir" value="${basedir}/nlogs/${date:format=yyyyMMdd}/${level}.log"/>
<!-- Load the ASP.NET Core plugin,enable asp.net core layout renderers-->
<extensions>
<add assembly="NLog.Web.AspNetCore" />
</extensions>
<!--define various log targets-->
<targets async="true">
<!--写入文件-->
<!--滚动日志文件上限数,滚动日志文件数达到上限新的文件内容会覆盖旧文件内容 -->
<!--archiveAboveSize每个日志文件大小的最大值(单位:字节),主日志文件超过大小超过该值时会将文件内容写入滚动日志并清空主日志文件内容-->
<!--${basedir}表示当前应用程序域所在的根目录-->
<target name="allfile" xsi:type="File"
fileName="${basedir}/adminlogs/all.txt"
archiveFileName="${basedir}/adminlogs/all.{###}.txt"
archiveEvery="Day"
archiveNumbering="DateAndSequence"
archiveAboveSize="20000000"
maxArchiveFiles="30"
keepFileOpen="true"
layout="${longdate} | ${event-properties:item=EventId_Id} | ${uppercase:${level}} | ${logger} | ${aspnet-request-iP:CheckForwardedForHeader=true} | ${event-properties:item=user} | ${aspnet-request-url} | ${message} | ${event-properties:item=requestParam} | ${event-properties:item=jsonResult} | ${onexception:${exception:format=tostring}"/>
<!--SQL-->
<target name="sqlfile" xsi:type="File"
fileName="${basedir}/adminlogs/all-sql.txt"
archiveFileName="${basedir}/adminlogs/all.sql{###}.txt"
archiveEvery="Day"
archiveNumbering="DateAndSequence"
archiveAboveSize="20000000"
maxArchiveFiles="30"
keepFileOpen="false"
layout="===========================================${newline} ${longdate} - ${aspnet-request-iP} - ${aspnet-request-headers:HeaderNames=userid} - ${aspnet-request-url} ${newline} ${message}"/>
<!--写入控制台-->
<target name="console" xsi:type="ColoredConsole" layout="${date:format=MM-dd HH\:mm\:ss} | ${uppercase:${level}} | ${logger} | ${aspnet-request-iP} | ${aspnet-request-url} | ${message}"/>
<!--SQL写入控制台-->
<target name="consoleSql" xsi:type="ColoredConsole" layout="${date:format=MM-dd HH\:mm\:ss} | ${aspnet-request-url} ${newline} ${message}"/>
<!--写入黑洞-->
<target name="blackhole" xsi:type="Null" />
</targets>
<!--define various log rules-->
<rules>
<!-- 除非调试需要,把 .NET Core 程序集的 Debug 输出都屏蔽 Trace -> Debug-> Info ->Warn-> Error-> Critical-->
<!--All logs, including from Microsoft-->
<logger name="*" minlevel="Error" writeTo="allfile" />
<!-- 除非调试需要,把系统的 Debug 输出都屏蔽 -->
<logger name="*" minLevel="Error" writeTo="console"/>
<!--跳过所有级别的Microsoft组件的日志记录-->
<logger name="Microsoft.*" writeTo="blackhole" final="true" />
<!--<logger name="System.*" writeTo="blackhole" final="true" />-->
</rules>
</nlog>

三、打开Program.cs里,把下面的代码加入

#region 日志记录
builder.Services.AddLogging(x => { 
    x.ClearProviders();
    x.AddNLog(configFileRelativePath:Path.Combine(Directory.GetCurrentDirectory(), "nlog.config"));
});
#endregion