我有一个 .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 中?
您可以使用 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}"/>