下载依赖:
<ItemGroup> <PackageReference Include="Nlog" Version="4.7.13" /> <PackageReference Include="NLog.Web.AspNetCore" Version="4.14.0" /> </ItemGroup>
或者使用命令下载:
Install-Package NLog Install-Package NLog.Web.AspNetCore
添加一个nlog配置文件
配置文件选择:web配置文件即可
如下:
<?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" > <targets> <!--这个目标:最终输出文件类型, 位于根目录中得logs文件夹中, 名称以每日得时间一次生成log文件 , layout: 这个选项为生成的格式--> <target xsi:type="File" name="file" fileName="${basedir}/logs/nlog-aj-${shortdate}.log" layout="${longdate} ${uppercase:${level}} ${message}" /> </targets> <rules> <!--设定了一个Debug得路由, 最终指向了一个f名称得目标 --> <logger name="*" minlevel="Debug" writeTo="file" /> </rules> </nlog>
主要是两个内容,一个是规则配置,比如设定日志等级,然后有个writeTo和上面的目标进行关联,目标可以设置文件名的规则,输出内容的规则等。
比如输出具体某几个日志等级
<logger name="*" level="Debug,Warn,Trace,Error,Fatal" writeTo="seq" />
name - 日志源/记录者的名字 (允许使用通配符*)
minlevel - 该规则所匹配日志范围的最低级别
maxlevel - 该规则所匹配日志范围的最高级别
level - 该规则所匹配的单一日志级别
levels - 该规则所匹配的一系列日志级别,由逗号分隔。
writeTo - 规则匹配时日志应该被写入的一系列目标,由逗号分隔。
final - 标记当前规则为最后一个规则。其后的规则即时匹配也不会被运行。
小例子:
<logger name="Name.Space.Class1" minlevel="Debug" writeTo="f1" /> - 名字空间Name.Space下的Class1这个类的所有级别等于或者高于Debug的日志信息都写入到“f1”这个目标里。
<logger name="Name.Space.Class1" levels="Debug,Error" writeTo="f1" /> -名字空间Name.Space下的Class1这个类的所有级别等于Debug或Error的日志信息都写入到“f1”这个目标里。
<logger name="Name.Space.*" writeTo="f3,f4" /> -名字空间Name.Space下所有类的所有级别的日志信息都写入到“f3”和“f4”这两个目标里。
<logger name="Name.Space.*" minlevel="Debug" maxlevel="Error" final="true" /> - 名字空间Name.Space下所有类的、级别在Debug和Error之间的(包括Debug,Info,Warn,Error) 日志信息都不会被记录(因为这条规则没有定义writeTo),同时其它后续规则也都会被忽略(因为这里设置了final="true")。
使用日志,日志等级
如下:
public IActionResult Index(string value) { var nlog = NLog.LogManager.GetCurrentClassLogger(); nlog.Info("一般信息"); nlog.Error("错误信息"); nlog.Warn("警告信息"); nlog.Trace("Trace信息"); nlog.Debug("调试信息"); return View(); }
日志输出位置默认在\Debug\netcoreapp3.1\logs下面。
根据上图我们可以看到日志输出内容,但是为什么没有看到Trace信息呢。是因为日志等级的原因,上面的日志等级设置是minlevel="Debug",最低日志等级是Debug所以输出不了Trace信息。我们可以在配置一个规则,把日志等级修改成Trace即可。
修改配置文件为:
<?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" > <targets> <target xsi:type="File" name="fffff" fileName="${basedir}/logs/nlog-aj-${shortdate}.log" layout="${longdate} ${uppercase:${level}} ${message}" /> <target xsi:type="File" name="xxx" fileName="${basedir}/logs/${shortdate}.log" layout="${longdate} ${uppercase:${level}} ${message}" /> </targets> <rules> <logger name="*" minlevel="Debug" writeTo="fffff" /> <logger name="*" minlevel="Trace" writeTo="xxx" /> </rules> </nlog>
我们增加了一个规则和输出目标,其中一个日志最小等级是Bebug,另外一个是Trace。上面两个目标的文件名也不一样。
生成的日志文件如下:
日志最小等级是Trace的内容:可以看到所有日志信息都已经输出了
日志最小等级是Trace的内容:
其他的什么日志等级可以按自己的需要配置,可以配置最低日志等级,最高日志等级,具体的某个或者某几个日志等级,比较灵活!
添加NLOG依赖,让项目默认的日志使用NLOG作为日志输出
如下:
如果不要这步.net core自带的日志输出就不会在nlog里边
使用.net core自带的日志输出:
因为我们配置了项目日志使用nlog所以这个日志的输出也是在nlog里边
private readonly ILogger<HomeController> _logger; public HomeController(ILogger<HomeController> logger) { _logger = logger; } public IActionResult Index() { _logger.LogInformation("自带log测试_普通信息日志"); _logger.LogDebug("自带log测试_调试日志"); _logger.LogError("自带log测试_错误日志"); _logger.LogWarning("自带log测试_警告日志"); _logger.LogTrace("自带log测试_跟踪日志"); return View(); }
然后我们看看日志输出:自带的输出日志也有了
但是我们日志写了5个,这里只输出了3个,缺少了trace和debug。自带的控制台日志里边也没有trace和debug
和nlog的日志等级设置一样,这也是因为日志等级的问题,.net core自带的日志等级设置是在appsettings.json配置文件
关于日志等级的设置:
{ "Logging": { "LogLevel": { "Default": "Trace", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" } }, "AllowedHosts": "*" }
一般设置默认情况下的”Default”: “Trace”即可,默认”Default”设置是Information所以会缺少。
注意:还请确保检查任何特定于环境的应用程序设置,比如appsettings.development.json,开发环境下应该是设置appsettings.development.json而不是appsettings.json
我们把appsettings.development.json的Default日志等级设置一下:设置成最低等级Trace
然后在看日志输出:会发现所有的都能看到了
.net core项目的默认日志使用nlog作为日志框架后,日志等级会先受到自带日志等级的配置影响,然后也会收到nlog日志等级配置的影响
欢迎加群讨论技术,群:677373950(满了,可以加,但通过不了),2群:656732739