Loading...

学习和积累有关asp.net, .net core, asp.net core的知识,在编程中找寻乐趣!

当前位置:首页DotNet

NET中如何使用NLog日志输出到文本中 Nlog日志如何捕获异常

发布时间:2025-02-19 16:58

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"
      }
    ]
  }
}

完毕!

asp.net mvc项目中如果不使用asp-for直接为控件命名id-name时后台拿不到值的情况

当前台以js动态为id="aaa"赋值时(直接写值除外),上面 viewArticlenews 里面是拿不到aaa的值,当然这里说的不使用a

网站建设小程序开发前端样式编写积累style刷新回顶部css计算函数

使单个元素居中显示 小程序开发时的底部的安全区要留出来,样式如下 小程序开发添加右下角的刷新和回顶部两个按钮 css中使用计算函数

为只有table和tr及td元素的表格添加一个边框css样式这样写

为只有table和tr及td元素的表格添加一个边框css样式这样写, 适合快速给一个表格加样式,为表格快速添加细边框,表格含有table,t

C#.NETCORE文件上传到linux服务器时要注意的问题

C#.NETCORE文件上传到linux服务器时要注意的问题, 使用反斜杠和斜杠两个是有很大的区别的,最好使用 正斜杠,则不使用反斜杠,这样

DOTNET下使用正则使内容字段进行分段处理适合不分段的内容文本处理

DOTNET下使用正则使内容字段进行分段处理适合不分段的内容文本处理, 如果您的内容是一个整段,可以使用如下方法处理,使用条件:内容必须放在

提供免费的服务器维护、网站维护、宝塔面板的安装及运行。

网站编写代码分享

网站收录效果不好,自然会影响排名,网站优化首先第一步是要搞好网站收录

网络营销