简体   繁体   English

使用 NLog 在 ASP.NET Core 中记录异常

[英]Logging exception in ASP.NET Core with NLog

I'm currently trying to log the exception message, etc using NLog, no luck so far, and I can't imagine why我目前正在尝试使用 NLog 记录异常消息等,到目前为止没有运气,我无法想象为什么

To setup NLog I used this guide: https://github.com/NLog/NLog.Web/wiki/Getting-started-with-ASP.NET-Core-(project.json)要设置 NLog,我使用了本指南: https : //github.com/NLog/NLog.Web/wiki/Getting-started-with-ASP.NET-Core-( project.json )

I've setup this on the asp.net core, and tried the logging on my bussiness project我已经在 asp.net 核心上设置了这个,并尝试在我的业务项目上进行日志记录

Bussiness商务

using Microsoft.Extensions.Logging;

public class FileService
{
    private readonly ILogger<FileService> _logger;

    public Task<DataResult<ICollection<BlankDTO>>> Test(Guid appId, Guid fileId)
    {
        try
        {
            throw new DivideByZeroException();
        }
        catch (DivideByZeroException ex)
        {
            _logger.LogError("EventId", ex, "Welp, something went wrong", new object[0]);
        }
    }
}

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"
      internalLogLevel="Warn"
      internalLogFile="c:\temp\internal-nlog.txt">

  <!-- Load the ASP.NET Core plugin -->
  <extensions>
    <add assembly="NLog.Web.AspNetCore"/>
  </extensions>

  <!-- the targets to write to -->
  <targets>
     <!-- write logs to file -->
     <target xsi:type="File" name="allfile" fileName="c:\temp\nlog-all-${shortdate}.log"
                 layout="${longdate}|${event-properties:item=EventId.Id}|${logger}|${uppercase:${level}}|${message} ${exception}" />

   <!-- another file log, only own logs. Uses some ASP.NET core renderers -->
    <target xsi:type="File" name="ownFile-web" fileName="c:\temp\nlog-own-${shortdate}.log">
      <layout xsi:type="JsonLayout">
        <attribute name="level" layout="${level}" />
        <attribute name="timestamp" layout="${date:format=yyyy-MM-dd HH\:mm\:ss.fff}" />
        <attribute name="systemUser" layout="${windows-identity:userName=true:domain=true}" />
        <attribute name="currentUser" layout="${aspnet-user-identity}" />
        <attribute name="machineName" layout="${machinename}" />
        <attribute name="environment" layout="#{Environment}" />
        <attribute name="applicationName" layout="My app" />
        <attribute name="module" layout="My module" />
        <attribute name="threadId" layout="${threadid}" />
        <attribute name="message" layout="${event-properties:item=message}" />
        <attribute name="messageDetails" layout="${exception}" />
        <attribute name="variables" layout="${event-properties:item=Variables}" />
      </layout>
    </target>
     <!-- write to the void aka just remove -->
    <target xsi:type="Null" name="blackhole" />
  </targets>

  <!-- rules to map from logger name to target -->
  <rules>
    <!--All logs, including from Microsoft-->
    <logger name="*" minlevel="Trace" writeTo="allfile" />

    <!--Skip Microsoft logs and so log only own logs-->
    <logger name="Microsoft.*" minlevel="Trace" writeTo="blackhole" final="true" />
    <logger name="*" minlevel="Trace" writeTo="ownFile-web" />
  </rules>
</nlog>

This is all i get logged:这就是我记录的全部内容:

{ "level": "Error", "timestamp": "2017-06-20 09:51:24.904", "systemUser": "JONDOE-ORG\\foobar", "machineName": "BUC-007", "environment": "#{Environment}", "applicationName": "My app", "module": "My module", "threadId": "4" }
  • NLog.Web.ASpNetCore (4.4.1) NLog.Web.ASpNetCore (4.4.1)
  • Microsoft.NETCore.App (1.1.2) Microsoft.NETCore.App (1.1.2)

I've created a LoggingEvents我创建了一个 LoggingEvents

public class LoggingEvents
{
    public const int GENERATE_ITEMS = 1;
    public const int LIST_ITEMS = 2;
    public const int GET_ITEM = 3;
    public const int INSERT_ITEM = 4;
    public const int UPDATE_ITEM = 5;
    public const int DELETE_ITEM = 6;

    public const int GET_ITEM_NOTFOUND = 7;
    public const int UPDATE_ITEM_NOTFOUND = 8;
}

And I can log errors like this:我可以记录这样的错误:

//Logging example
try
{
    throw new Exception();
}
catch (Exception ex)
{
    _logger.LogError(LoggingEvents.GET_ITEM, ex, "Test({appId}, {fileId} Failed", appId, fileId);
}

Hope this helps somebody.希望这可以帮助某人。

I don't think you need the events:我认为你不需要这些事件:

logger.LogError($”{ex.Message} {{@0}}”, ex, arg0); logger.LogError($"{ex.Message} {{@0}}", ex, arg0);

logger.LogError(ex.Message, ex, arg0); logger.LogError(ex.Message, ex, arg0);

And:并且:

layout="[${date:format=yyyy-MM-dd HH:mm:ss.fff zzz}] ${level:uppercase=true:truncate=3} ${threadid} ${mdlc:CorrelationId} <${logger}:${mdlc:CallerMemberName}:${mdlc:CallerLineNumber}> ${message}${onexception:${newline}${exception:format=ToString,Data}}" /> layout="[${date:format=yyyy-MM-dd HH:mm:ss.fff zzz}] ${level:uppercase=true:truncate=3} ${threadid} ${mdlc:CorrelationId} <${ logger}:${mdlc:CallerMemberName}:${mdlc:CallerLineNumber}> ${message}${oneexception:${newline}${exception:format=ToString,Data}}" />

See samples and use library:查看示例并使用库:

https://github.com/akovac35/Logging https://github.com/akovac35/Logging

https://github.com/akovac35/Logging.Samples https://github.com/akovac35/Logging.Samples

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM