NLog整合ExceptionLess如何映射当前用户身份
在将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发现,用户信息有些还是为空:
除了上面通过代码设置的用户信息可以显示外,其它正常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信息或者用户登录账号了:
会话事件也可以自动聚合了:
2023.1.8更新
默认情况下,EXceptionless UI里面的用户会自动读取 HttpContext.User?.Identity.Name属性值,因此我们在登录构造凭证Claims的时候,记得赋值2个通用属性即可:
new Claim(ClaimTypes.Name,userData.DispName), new Claim(ClaimTypes.NameIdentifier,userData.LoginAccount)