Log4j2 我可以在 log4j2 的模式布局中包含用户名吗?



我在应用程序中使用Log4j2作为记录器。我想自定义记录器消息,并将登录的用户名作为模式布局的一部分例如:2021-06-01 03:29:06.636[CURRENT_USER]警告1--[nio-8002-exec-7]com.zaxxer.hikari.pool.PoolBase:HikariPool-1-验证连接失败org.postgresql.jdbc.PgConnection@6813ce6c(此连接已关闭。(。可能考虑使用较短的maxLifetime值。

我认为登录用户是指活动事务的数据库用户。如果您可以将其放入MDC变量中(有多种方法可以访问JDBC用户名,请选择最适合您需要的方法(,那么您可以通过PatternLayouts%X指令访问该值,例如%X{jdbcUserName}

如果您指的是数据库用户名,请使用Volkan Yazıcı的答案。如果你想要操作系统用户名,你可以从Java系统属性"中获得;用户名";,并且您可以在配置中使用模式${sys:system.property.name}(您需要将$字符加倍(。

<pattern>... [$${sys:user.name}] ...</pattern>

已解决。使用承载令牌获取用户凭据,然后通过ThreadContext放置用户名。

if (bearerToken != null && bearerToken.startsWith("Bearer ")) {
UserCredential user = JWTUtil.parseToken(bearerToken.substring(7, bearerToken.length()));
ThreadContext.put("userName",  user.getUsername());
}