问题描述
我正在使用将NLog设置为记录器的ASP.NET Core 2.2 MVC应用程序。我对它的设置不太熟悉,但是我们有一个nlog.config
,用于设置要记录的参数名称以及用于获取值的布局渲染器。我们使用using Microsoft.Extensions.Logging;
将ILogger
的实例注入到整个应用程序的控制器操作和服务方法中。
例如,当我们记录诸如_logger.LogInformation("Client was created");
之类的内容以及其他数据时,我们记录经过身份验证的用户的名称。这是下面代码中的ObjectID
,其值取自HttpContext.User.Identity.Name
。
问题是我想在HttpContext.User.Identity.Name
中尚不可用的位置记录ObjectID。这将导致没有ObjectID的日志记录。但是,ObjectID在另一个变量中可用。
是否可以记录消息并传递参数的值,而不是让记录器从布局渲染器获取它?如果我没有手动传递参数,我仍然希望它使用布局渲染器。
nlog.config
的相关部分:
<commandText>
insert into dbo.Log (
CorrelationId,Application,ObjectID,Logged,Level,Message,Logger,CallSite,Exception
) values (
@CorrelationId,@Application,@ObjectID,@Logged,@Level,@Message,@Logger,@Callsite,@Exception
);
</commandText>
<parameter name="@correlationId" layout="${aspnet-traceidentifier}" />
<parameter name="@application" layout="${configsetting:AppSettings.NlogConnection.AppName}" />
<parameter name="@ObjectID" layout="${aspnet-user-identity}" /> <!-- I want to be able to optionally pass the value of this parameter manually -->
<parameter name="@logged" layout="${date}" />
<parameter name="@level" layout="${level}" />
<parameter name="@message" layout="${message}" />
<parameter name="@logger" layout="${logger}" />
<parameter name="@callSite" layout="${callsite:filename=false}" />
<parameter name="@exception" layout="${exception:toString}" />
我们如何注入和使用记录器实例:
public class ClientService : IClientService
{
private readonly ILogger<ClientService> _logger;
public ClientService(ILogger<ClientService> Logger)
{
_logger = Logger;
}
public string CreateClient() {
//some logic to create client
string userName = "John Doe"; // I want to log this as ObjectID in the database
_logger.LogInformation("Client created");
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)