NET中如何使用NLog日志输出到文本中 Nlog日志如何捕获异常
NET中如何使用NLog日志输出到文本中
一、因我是在.net8里测试的 , 故我安装的是 NLog.Web.AspNetCore, 而不是 Nlog

期间可以参考官方网站地址 https://nlog-project.org/ ,
github参考地址 : https://github.com/NLog/NLog?tab=readme-ov-file , https://github.com/NLog/NLog/wiki/Getting-started-with-ASP.NET-Core-6
这里注意项目的名称不要命名为 NLOG, 如果命名NLOG,在添加Nget包时,会报检测到循环的错误。
添加后如下图

<PackageReference Include="NLog.Web.AspNetCore" Version="5.3.15" />
二、 根目录新建一个文件 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"
throwConfigExceptions="true"
internalLogLevel="Info"
internalLogFile="c:\temp\internal-nlog-AspNetCore.txt"> <!-- enable asp.net core layout renderers -->
<extensions>
<add assembly="NLog.Web.AspNetCore"/>
</extensions> <!-- the targets to write to -->
<targets> <!-- File Target for all log messages with basic details -->
<target xsi:type="File" name="allfile" fileName="c:\temp\nlog-AspNetCore-all-${shortdate}.log"
layout="${longdate}|${event-properties:item=EventId:whenEmpty=0}|${level:uppercase=true}|${logger}|${message} ${exception:format=tostring}" /> <!-- File Target for own log messages with extra web details using some ASP.NET core renderers -->
<target xsi:type="File" name="ownFile-web" fileName="c:\temp\nlog-AspNetCore-own-${shortdate}.log"
layout="${longdate}|${event-properties:item=EventId:whenEmpty=0}|${level:uppercase=true}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" /> <!--Console Target for hosting lifetime messages to improve Docker / Visual Studio startup detection -->
<target xsi:type="Console" name="lifetimeConsole" layout="${MicrosoftConsoleLayout}" />
</targets> <!-- rules to map from logger name to target -->
<rules> <!-- All logs, including from Microsoft -->
<logger name="*" minlevel="Trace" writeTo="allfile" /> <!-- Suppress output from Microsoft framework when non-critical -->
<logger name="System.*" finalMinLevel="Warn" />
<logger name="Microsoft.*" finalMinLevel="Warn" /> <!-- Keep output from Microsoft.Hosting.Lifetime to console for fast startup detection -->
<logger name="Microsoft.Hosting.Lifetime*" finalMinLevel="Info" writeTo="lifetimeConsole" />
<logger name="*" minLevel="Trace" writeTo="ownFile-web" />
</rules>
</nlog>三, Update program.cs
using NLog.Web; var app = builder.Build();之前加入如下两行 builder.Logging.ClearProviders(); builder.Host.UseNLog();
如图:

一定要放在 var app = builder.Build(); 之前。
更改 nlog.config文件里的输出文件的路径, ctrl + f 搜索
c:\temp
然后把它替换为项目的根目录
现在运行项目, 可以看到根目录下出现了两个文件

到此基本上是集成到项目中去了,现在看一下如果项目中出现异常时,能不能也输出到 文件中
Nlog日志如何捕获异常
在 home/index中加入如下代码 测试, 不用添加try catch
int a = 9; int b = 0; int c = a/b; Console.WriteLine(c);

运行后界面出现错误,

再看下日志文件里,已有错误信息,

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
到上面基本功能已经可以在项目中使用了,下面优化一下,搞的浪一点,其实功能上面已实现,如果没有洁癖,到此为止了,下面的搞点花样
把NLog的配置搞到appsettings.json文件里去
修改appsettings.json, 加入如下的节点
,"NLog": {
"throwConfigExceptions": true,
"targets": {
"async": true,
"logfile": {
"type": "File",
"fileName": "c:/temp/nlog-${shortdate}.log"
},
"logconsole": {
"type": "ColoredConsole"
}
},
"rules": [
{
"logger": "*",
"minLevel": "Info",
"writeTo": "logconsole"
},
{
"logger": "*",
"minLevel": "Debug",
"writeTo": "logfile"
}
]
}同样修改上面的
c:/temp
为项目根目录
programe.cs里加入如下代码
NLog.LogManager.Configuration = new NLogLoggingConfiguration(builder.Configuration.GetSection("NLog"));一定要在var app = builder.Build();的上面添加
到此为止, 可以删除根目录 里的 nlog.config配置文件了, 配置都在appsettings.json文件里了
下面再来搞点小花样,
如何在logging节点控制输出的范围
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning" //在这里控制
}
},更改 programe.cs里的 builder.Host.UseNLog();为如下内容
builder.Host.UseNLog(new NLogAspNetCoreOptions() { RemoveLoggerFactoryFilter = false });https://nlog-project.org/config/?tab=layout-renderers
这里有各项的配置
使用NLOG 的 layout

以json的格式输出NLOG日志, 把type设置为 jsonlayout
//这里可以拿到本appsettings.json文件里定义的变量,使用${configsetting:item=变量名}即可拿到,如 ${configsetting:item=AllowedHosts} 即拿到上面的AllowedHosts变量值
完整的appsettings.json文件里的 nlog配置
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"NLog": {
"throwConfigExceptions": true,
//"internalLogLevel": "Info",
//"internalLogFile": "${currentdir}/Logs/error.log",
"extensions": [
{ "assembly": "NLog.Extensions.Logging" },
{ "assembly": "NLog.Web.AspNetCore" }
],
"targets": {
"async": true,
"logfile": {
"type": "File",
"fileName": "c:\\temp\\nlog-${shortdate}.log",
"layout": {
"type": "JsonLayout",
"Attributes": [
{
"name": "timestamp",
"layout": "${date:format=o}"
},
{
"name": "ip",
"layout": "${aspnet-request-ip}"
},
{
"name": "querystring",
"layout": "${aspnet-request-querystring:OutputFormat=JSON}"
},
{
"name": "useragent",
"layout": "${aspnet-request-useragent}"
},
{
"name": "controller",
"layout": "${aspnet-mvc-controller}"
},
{
"name": "action",
"layout": "${aspnet-mvc-action}"
},
{
"name": "requesturl",
"layout": "${aspnet-request-url}"
},
{
"name": "Env",
"layout": "${environment:ASPNETCORE_ENVIRONMENT}"
},
{
"name": "appname",
"layout": "${processname}" //这里可以拿到本appsettings.json文件里定义的变量,使用${configsetting:item=变量名}即可拿到,如 ${configsetting:item=AllowedHosts} 即拿到上面的AllowedHosts变量值
},
{
"name": "level",
"layout": "${level}"
},
{
"name": "logger",
"layout": "${logger}"
},
{
"name": "message",
"layout": "${message:raw=true}"
},
{
"name": "exception",
"layout": "${exception}"
},
{
"name": "properties",
"encode": false,
"layout": {
"type": "JsonLayout",
"includeallproperties": "true"
}
}
]
}
},
"logconsole": {
"type": "ColoredConsole"
}
},
"rules": [
{
"logger": "*",
"minLevel": "Info",
"writeTo": "logconsole"
},
{
"logger": "*",
"minLevel": "Debug",
"writeTo": "logfile"
}
]
}
}完毕!



















