NLog 像 WithProperty 方法一样使用 .NET6 注入自定义属性

问题描述 投票:0回答:1

我有一个 .NET 4.8 项目,我按以下方式使用 NLog:

public class ReportsController : ApiController
{
    private static NLog.Logger logger = NLog.LogManager.GetLogger("Application");
    public void SomeMethod()
    {
       string userID = 'ABC123';
       logger.WithProperty("UserId", userID).Info("UserId {0} has created a new report.", userID);
    }
}

通过上面的代码,我能够将 UserId 属性保存在数据库日志表的专用字段中,以便轻松地按用户 ID 过滤日志。

现在我们已经将应用程序升级到.NET 6,使用依赖注入等..

当前代码如下:

using Microsoft.Extensions.Logging;

public class AuthorizationManagerService: IAuthorizationManagerService
{
    private readonly ILogger _logger; //interface in Microsoft.Extensions.Logging

    public AuthorizationManagerService(ILogger<AuthorizationManagerService> logger)
    {
        _logger = logger;
    }

    public void SomeMethod()
    {
       string userID = 'ABC123';
       _logger.LogInformation("UserId {0} has created a new report.", userID);
    }

在 appsettings.json 中,我为 NLog 定义了以下规则:

  "NLog": {
    "throwConfigExceptions": true,
    "internalLogLevel": "Error",
    "internalLogFile": "${CurrentDir}/internal-nlog.txt",
    "extensions": [
      { "assembly": "NLog.Extensions.Logging" },
      { "assembly": "NLog.Web.AspNetCore" }
    ],
    "targets": {
      "async": false,
      "logfile": {
        "type": "File",
        "fileName": "${CurrentDir}/Logs/nlog-${shortdate}.log"
      },
      "logconsole": {
        "type": "Console"
      },
      "logtrace": {
        "type": "Trace"
      },
      "logdatabase": {
        "type": "Database",
        "connectionString": "Data Source=MyDatabaseInstance;Initial Catalog=MyDatabase;Integrated Security=false;user id=TheUser;password=INCORRECT;",
        "keepConnection": "true",
        "commandText": "insert into \"Logs\"(\"LogDate\", \"LogMessage\", \"LogLevel\", \"LogIP\", \"LogUrl\", \"LogException\", \"LogUserId\", \"LogModule\", \"LogCallSite\", \"LogSessionId\") values (@LogDate, @LogMessage, @LogLevel, @LogIP, @LogURL, @LogException, @LogUserId, @LogModule, @LogCallSite, @LogSessionId);",
        "parameters": [
          {
            "name": "@LogDate",
            "layout": "${date}"
          },
          {
            "name": "@LogMessage",
            "layout": "${message}"
          },
          {
            "name": "@LogLevel",
            "layout": "${level:uppercase=true}"
          },
          {
            "name": "@LogIP",
            "layout": "${aspnet-request-ip}"
          },
          {
            "name": "@LogUrl",
            "layout": "${aspnet-request-url}"
          },
          {
            "name": "@LogException",
            "layout": "${exception:format=tostring}"
          },
          {
            "name": "@LogUserID",
            "layout": "${event-properties:UserId}"
          },
          {
            "name": "@LogModule",
            "layout": "${logger}"
          },
          {
            "name": "@LogCallSite",
            "layout": "${callsite:filename=true}"
          },
          {
            "name": "@LogSessionID",
            "layout": "${aspnet-sessionid}"
          }
        ]
      }
    },
    "rules": [
      {
        "logger": "*",
        "minLevel": "Info",
        "writeTo": "logdatabase"
      },
      {
        "logger": "*",
        "minLevel": "Debug",
        "writeTo": "logconsole"
      },
      {
        "logger": "*",
        "minLevel": "Info",
        "writeTo": "logfile"
      },
      {
        "logger": "*",
        "minLevel": "Trace",
        "writeTo": "logtrace"
      }
    ]
  }

如何传递 userID 信息,以便像以前一样将其写入数据库字段 LogUserId 中?

c# asp.net nlog
1个回答
0
投票

您可以使用 BeginScope

using (_logger.BeginScope(_utilityService.GenerateNewGuid()))
{
       _logger.LogDebug($"1234");
}

public KeyValuePair<string, object>[] GenerateNewGuid()
{
    return new[] 
    { 
        new KeyValuePair<string, object>("ScopeId", Guid.NewGuid().ToString("N"))
        , new KeyValuePair<string, object>("AppId", "abcdefg")// <--this
    };
}

nlog.config

<variable name="layoutVar" value="AppId:${mdlc:AppId}"/>
© www.soinside.com 2019 - 2024. All rights reserved.