如何解决如果用户登录,则Log4j2添加到布局
我希望根据用户是否通过身份验证在log4j2中添加或附加到PatternLayout。
如果用户未通过身份验证,则日志将如下所示:
{
"value1": "Here is our values","map": {
"key1": "value1","key2": "value2"
},"something": "something else"
}
如果用户通过了身份验证,我将得到如下信息:
{
"value1": "Here is our values","user": {
"name": "name","client": "some value"
},"something": "something else"
}
有什么方法可以实现这一目标吗?
解决方法
一种实现此目的的方法是对Log4j2使用PatternSelector。当前,Log4j 2支持LevelPatternSelector,MarkerPatternSelector和ScriptPatternSelector。您很可能真的希望像ThreadContextPatternSelector这样的东西可以根据ThreadContext中是否存在键来选择模式。但是,直到有人要求您可以使用ScriptPatternSelector进行类似的操作来实现相同的功能:
<PatternLayout>
<ScriptPatternSelector defaultPattern="[%-5level] %c{1.} %C{1.}.%M.%L %msg%n">
<Script name="BeanShellSelector" language="bsh"><![CDATA[
if (logEvent.getContextMap().containsKey("client")) {
return "Client";
}
return null;
]]>
</Script>
<PatternMatch key="Client" pattern="{ ... \"user\": { \"name\": \"${mdc:name}\",\"client\": \"${mdc:client}\"},..."/>
</ScriptPatternSelector>
</PatternLayout>
如果要从OAuth令牌获取客户端信息,则可以创建一个自定义PatternSelector,该自定义PatternSelector从Spring SecurityContext获取并返回要应用的模式的键,或者返回null以使用默认模式。要创建自定义插件,您可以查看LevelPatternSelector或MarkerPatternSelector作为示例。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。