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

Log4j2 Can I include users' name in pattern layout of 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 用户名,请选择最适合您需要的方法),然后您可以通过 PatternLayout 访问该值s %X 指令,例如 %X{jdbcUserName}.

如果您指的是数据库用户名,请使用 。如果您想要操作系统用户名,您可以从 Java 系统 属性“user.name”中获取,并且您可以在配置中使用模式 ${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());

        }