ASP.NET中使用NLog正确输出用户名的问题咨询
问题根因
你遇到的两个问题都和当前使用的${identity} NLog布局渲染器的默认规则直接相关:
${identity}默认输出格式为{认证状态}:{认证类型}:{用户名},未认证时输出notauth::,已认证时输出auth:认证方案名:用户名,这就是日志出现多余前缀的原因- 登录请求执行时,ASP.NET的
User.Identity是从当前请求携带的Cookie解析的,登录操作只是给响应写入新的认证Cookie,当前请求的User.Identity不会同步更新,所以登录时打日志无法自动获取到刚登录的用户名,会显示notauth
解决方案
步骤1:修改NLog配置解决用户名带前缀问题
将NLog.config中file目标的layout属性里的${identity}替换为${identity:name=true},该参数会让渲染器只输出用户名部分,不携带认证状态和认证类型前缀。如果需要兼容登录场景手动传入的用户名,可以进一步修改配置,优先读取日志事件携带的自定义UserName属性,属性为空时再取当前登录用户名,未登录默认显示notauth:
原配置行:
layout="[${longdate}] [${uppercase:${level}}] [${logger}] ${message} ${exception:format=tostring}|user: ${identity}"
修改后配置行:
layout="[${longdate}] [${uppercase:${level}}] [${logger}] ${message} ${exception:format=tostring}|user: ${event-properties:item=UserName:whenEmpty=${identity:name=true:whenEmpty=notauth}}"
步骤2:解决登录操作日志用户名显示notauth问题
登录请求上下文无法自动获取刚登录的用户名,只需要在账号密码校验成功后,打登录日志时手动传入UserName属性即可:
// 账号密码校验逻辑完成,确认用户名合法后 var loginUserName = "admin"; // 实际替换为用户提交的用户名变量 // 打日志时附加UserName属性 _logger.WithProperty("UserName", loginUserName).Information("{UserName} Logged in.", loginUserName); // 再执行SignInAsync登录操作 await SignInManager.SignInAsync(...);
修改完成后两个问题均可解决:非登录场景的日志自动读取当前登录用户名,无多余前缀;登录操作日志可以正常显示当前登录的用户名。
内容的提问来源于stack exchange,提问作者max
相关产品推荐
相关产品推荐

