将Keycloak日志记录为JSON格式

4

如何使 Keycloak 4.5.0.Final 以JSON格式登录?

我正在使用Helm chart在Kubernetes中运行Keycloak,该图表提供了运行JBoss CLI脚本(keycloak.cli.custom)或shell脚本(keycloak.preStartScript)的钩子。

但我希望避免定制Docker镜像。


有趣的是,如果您要自定义Docker镜像,您会如何处理?我想知道是否有一种方法可以仅通过cli配置它,或者您必须安装Wildfly扩展程序。 - Ryan Dawson
@RyanDawson 不太确定,但这篇文章描述了如何使用 jboss-logmanager-ext 的格式化程序,在通过 cli 进行配置之前必须安装它: http://wildfly.org/news/2015/07/25/Wildfly-And-ELK/. 我猜我可以使用 init-container 将 jar 文件复制到容器中,但这比我想象的要复杂得多。 - otto.poellath
你对这个有什么进展吗? - Ryan Dawson
2
根据我所发现的,Keycloak Docker镜像不包含能够生成JSON的格式化程序。我决定通过一个init容器添加Mark Paluch的WildFly JSON格式化程序,并使用JBoss CLI配置日志子系统,类似于这里描述的方式。 - otto.poellath
3个回答

3
我正在使用Keycloak 8.0.1,因此这可能不适用于您的4.5版本,但我所要做的就是提供一个jboss cli脚本来使用JSON格式化程序,而不是PATTERN格式化程序。
# Undertow HTTP Server Configuration

echo Started configuring Undertow ....

# Create a new log formatter to output json with full stacktrace details
/subsystem=logging/json-formatter=SUMO_FORMATTER:add(pretty-print=false, exception-output-type=detailed-and-formatted, print-details=false)
# Disable the original console output that was in plain text format
/subsystem=logging/console-handler=CONSOLE/:write-attribute(name=enabled,value=false)
# Create a new console logger that uses the new json formatter
/subsystem=logging/console-handler=SUMO_CONSOLE:add(enabled=true, named-formatter=SUMO_FORMATTER)
# Make the root logger use the new console logger
/subsystem=logging/root-logger=ROOT/:write-attribute(name=handlers,value=["SUMO_CONSOLE"])

echo ... Completed configuring Undertow

这里有一些相关文档


2

根据这篇很棒的文章(也链接到Github),按照以下步骤,可以实现JSON日志:

  1. 创建一个JAVA项目,实现Keycloak SPI插件-该插件将监听Keycloakevents并可能替换默认记录器
  2. 修改代码以将事件对象字符串化为JSON格式
  3. 将项目构建为库,并将可执行的jar文件放置在Keycloakdeployments文件夹中(请遵循文章获取完整细节)
  4. 进入Keycloak管理界面,选择相关领域并用您的记录器替换默认记录器

最终代码可能如下所示:

public class MyEventListenerProvider implements EventListenerProvider {

    public MyEventListenerProvider() {
        // use c'tor to init variables / connections / etc. - plugin load hook
        this.jsonMapper = new ObjectMapper();
    }

    ObjectMapper jsonMapper;

   private stringify(Object obj) {
       try {
          return this.jsonMapper.writeValueAsString(obj);
       } catch (Exception ex) {
          ex.printStackTrace();
          return null;
       }
   }

    @Override
    public void onEvent(Event event) {
        System.out.println(this.stringify(event));
    }

    @Override
    public void onEvent(AdminEvent adminEvent, boolean b) {
          System.out.println(this.stringify(adminEvent));
    }

    @Override
    public void close() {
       // use close to close connections / reset variables - plugin unload hook
    }

这个示例是即时编写的(如果有编译错误,请原谅),并使用Jackson库,如此处所述,将Java对象转换为JSON字符串。


抱歉,但我认为这并不是重点。您的代码可以记录Keycloak的事件和AdminEvents,但无法帮助Keycloak以JSON格式格式化其常规日志消息(这正是我要求的)。 - otto.poellath
只需删除默认的Keycloak记录器(在管理仪表板->您的领域->事件->配置中),并将其替换为您的插件-这样,您就可以确保“默认”的Keycloak日志以JSON格式记录(我的答案中的第4节)。 - ymz
抱歉,但我认为我们仍然没有理解对方的意思。我不认为您的方法会改变来自上面链接文章中截图的常规日志消息“16:55:52.446 INFO Admin console listening on http://127.0.0.1:9090”。您提出的是一个记录事件的EventListener,而不是通用的记录器。 - otto.poellath

0
(问题是关于4.5.0的,但这对于更现代的版本 - 如21.0.2 - 可能也有帮助,因为人们可能会像我一样通过搜索找到这个。)

您可以在启动时使用一个选项启用JSON日志记录,如此处所述:

bin/kc.[sh|bat] start --log-console-output=json

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接