我想在NLog输出的每一行添加一个字符串。逻辑保持不变,尝试获取当前用户,如果成功,则将当前用户添加到输出。
我知道如何每次都实现它,但我想在一个地方设置这个模板,而不是在每次写作时重复它。
答案 0 :(得分:14)
WindowsIdentityLayoutRenderer
应该可以给你你想要的东西。您可以选择记录域,用户名或两者。
您可以在NLog.config文件中配置类似的(未经测试):
<targets>
<target name="file" xsi:type="File"
layout="${longdate} | ${level} | ${logger} | ${windows-identity} | ${message}"
fileName="${basedir}/${shortdate}.log" />
</targets>
这可能不适用于低权限环境。
您现在如何获得用户名?如果你得到这样的东西:
HttpContext.Current.User.Identity.Name
然后你可以使用NLog的“aspnet-user-identity”LayoutRenderer,如下所示:
<targets>
<target name="file" xsi:type="File"
layout="${longdate} | ${level} | ${logger} | ${aspnet-user-identity} | ${message}"
fileName="${basedir}/${shortdate}.log" />
</targets>
NLog的aspnet * LayoutRenderers在NLog.Extended.sll中,因此除NLog.dll外还需要该dll。
答案 1 :(得分:0)
对于使用自定义authentication
/ authorization
(或由于某些原因无法使用windows
身份)且正在使用.NET core
(3.*
)的用户您可以使用MappedDiagnosticsContext
注入自定义键值。
一旦知道用户的身份,就可以像这样设置它:
using NLog;
//...
MappedDiagnosticsContext.Set("UserName", "Some user name");
始终确保您以 Scoped 的方式执行此操作(使用.NET核心 Dependency Injection 术语或每个请求范围),因为您不想在登录时混淆用户。
然后在NLog
配置中,您可以使用${mdc:UserName}
语法读取值。
我正在使用以下nuget
软件包:
nlog
nlog.web.aspnetcore
答案 2 :(得分:0)
NLog版本。 4.6.4引入了${environment-user}
,可在Windows和Linux上使用。解析为System.Environment.UserName
另请参阅:https://github.com/NLog/NLog/wiki/Environment-User-Layout-Renderer
对于ASP.NET应用程序,当前登录的用户身份也有${aspnet-user-identity}
。
另请参阅:https://github.com/NLog/NLog/wiki/AspNetUserIdentity-layout-renderer