NLog整合ExceptionLess如何映射当前用户身份

发布时间 2023-11-29 16:27:05作者: pccai

在将NLog与Exceptionless集成时,要映射当前用户的身份,我们可以使用NLog的布局渲染器(Layout Renderer)和Exceptionless的上下文数据(Context Data)。

首先,在NLog的配置文件中,我们需要定义一个自定义的布局渲染器来获取当前用户的身份信息。例如,我们可以创建一个名为"currentuser"的布局渲染器。在该布局渲染器的实现中,我们可以访问当前用户的身份信息,并返回相应的值。

接下来,配置Exceptionless的客户端,将当前用户的身份信息添加到Exceptionless的上下文数据中。可以使用ExceptionlessClient.Default获取客户端实例,并使用SetUserDescription方法设置用户的身份信息。在这个例子中,我们将使用NLog布局渲染器中获取的当前用户身份信息。

下面是一个示例配置文件和代码:

NLog配置文件:

<target xsi:type="Exceptionless" name="exceptionlessTarget" serverUrl="https://your-exceptionless-url.com" apiKey="YOUR_API_KEY" />

<layout xsi:type="JsonLayout">
  <attribute name="time" layout="${date}" />
  <attribute name="level" layout="${level:upperCase=true}" />
  <attribute name="message" layout="${message}" />
  <attribute name="currentuser" layout="${currentuser}" />
</layout>

<rules>
  <logger name="*" minlevel="Trace" writeTo="exceptionlessTarget" />
</rules>

定义自定义布局渲染器:

[LayoutRenderer("currentuser")]
public class CurrentUserLayoutRenderer : LayoutRenderer
{
    protected override void Append(StringBuilder builder, LogEventInfo logEvent)
    {
        // 获取当前用户身份信息的逻辑
        // 将身份信息写入 builder 中
    }
}

设置Exceptionless的用户身份信息:

var client = ExceptionlessClient.Default;
client.SetUserDescription(NLog.LogManager.GetLogger("Example").Factory.GetCurrentClassLogger().Info("${currentuser}").ToString());

在上述示例中,我们将自定义布局渲染器命名为"currentuser",并在NLog的布局中使用${currentuser}来引用它。我们在自定义布局渲染器的Append方法中获取当前用户的身份信息并将其写入日志内容中。

然后,我们使用NLog的GetCurrentClassLogger()方法获取当前类的日志记录器,并通过${currentuser}来获取当前用户的身份信息。最后,使用Exceptionless的SetUserDescription方法将用户身份信息设置到Exceptionless的上下文数据中。

这样,当NLog记录日志时,Exceptionless将自动收集日志,包括当前用户的身份信息。

通过以上设置后,我们登录ExceptionlessUI发现,用户信息有些还是为空:

image

除了上面通过代码设置的用户信息可以显示外,其它正常NLog输入用户信息都没有,此时我可以修改一下NLog配置文件:

<target xsi:type="Exceptionless" name="exceptionlessTarget" serverUrl="https://your-exceptionless-url.com" apiKey="YOUR_API_KEY" userIdentity="${aspnet-user-identity}" />

布局中增加顶级的属性: userIdentity="${aspnet-user-identity}",就可以自动映射MVC或者WebAPI里面的Session信息或者用户登录账号了:

image

会话事件也可以自动聚合了:

image