首页 > 解决方案 > 在 ververica flink 中启用 JSON 日志记录

问题描述

前言 - 我之前在没有 ververica 的情况下使用 flink,并且能够通过利用 pre entrypoint 脚本下载所需的 jackson 依赖项来设置 log4j JSON 日志记录

问题是 - 对于 ververica,无需构建自定义图像,是否可以启用 json 日志记录?

我尝试使用 JSONLayout 类型的日志,但杰克逊不在类路径中,并且由于某种原因将它们标记为工件对于作业/任务管理器日志来说是不够的

接下来,我尝试了不需要杰克逊或任何其他依赖项的 JsonTemplateLayout,但它看起来像 EcsLayout.json 或 LogstashJsonEventLayoutV1.json 等布局也不存在

我的日志配置附在下面,它与默认配置相同,但rollingFile appender 布局已更改

我是否遗漏了什么或者这是否需要自定义图像创建?

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Configuration xmlns="http://logging.apache.org/log4j/2.0/config" strict="true">
    <Appenders>
        <Appender name="StdOut" type="Console">
            <Layout pattern="%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p %-60c %x - %m%n" type="PatternLayout"/>
        </Appender>
        <Appender name="RollingFile" type="RollingFile" fileName="${sys:log.file}" filePattern="${sys:log.file}.%i">
            <JsonTemplateLayout eventTemplateUri="classpath:EcsLayout.json"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="50 MB"/>
            </Policies>
            <DefaultRolloverStrategy max="5"/>
        </Appender>
    </Appenders>
    <Loggers>
        <Logger level="INFO" name="org.apache.hadoop"/>
        <Logger level="INFO" name="org.apache.kafka"/>
        <Logger level="INFO" name="org.apache.zookeeper"/>
        <Logger level="INFO" name="akka"/>
        <Logger level="ERROR" name="org.jboss.netty.channel.DefaultChannelPipeline"/>
        <Logger level="OFF" name="org.apache.flink.runtime.rest.handler.job.JobDetailsHandler"/>
        {%- for name, level in userConfiguredLoggers -%}
        <Logger level="{{ level }}" name="{{ name }}"/>
        {%- endfor -%}
        <Root level="{{ rootLoggerLogLevel }}">
            <AppenderRef ref="StdOut"/>
            <AppenderRef ref="RollingFile"/>
        </Root>
    </Loggers>
</Configuration>

标签: apache-flinkflink-streaming

解决方案


是的,您可以在 Ververica 平台中使用没有自定义图像的 JSON 日志记录。我以 JsonTemplateLayout 为例。

第 1 步
准备log4j-layout-template-json-2.14.1.jar(或您使用的任何版本)和 LogstashJsonEventLayoutV1.json(来自https://logging.apache.org/log4j/2.x/手册/json-template-layout.html )

第 2 步:使用 k8s 命名空间中的log4j-layout-template-json-2.14.1.jar
从 configmap 创建一个 k8s 卷,您将在其中运行此作业:

kubectl create configmap jsonlogging --from-file=log4j-layout-template-json-2.14.1.jar -n vvp-ops-jobs

Step-3 :
在 Deployment 配置页面 (YAML) 中,为 json 模板 jar 添加卷挂载(在spec.template.spec.kubernetes下):

pods:
  volumeMounts:
    - name: jsonlogging
      volume:
        configMap:
          name: jsonlogging
        name: jsonlogging
      volumeMount:
        mountPath: /flink/lib/log4j-layout-template-json-2.14.1.jar
        name: jsonlogging
        subPath: log4j-layout-template-json-2.14.1.jar

Step-4 :
将 LogstashJsonEventLayoutV1.json 添加到 Deployment Artifacts 并在 Deployment 配置页面 (YAML) 下引用它:

spec:
  template:
    spec:
      artifact:
        additionalDependencies:
          - >-
            s3://vvp-lab/artifacts/namespaces/default/LogstashJsonEventLayoutV1.json

第 5 步
为部署配置日志记录模板:

<Appender name="RollingFile" type="RollingFile" fileName="${sys:log.file}" filePattern="${sys:log.file}.%i">
  <Layout type="JsonTemplateLayout" eventTemplateUri="file:///flink/usrlib/LogstashJsonEventLayoutV1.json" />
  <Policies>
    <SizeBasedTriggeringPolicy size="50 MB"/>
  </Policies>
  <DefaultRolloverStrategy max="1"/>
</Appender>

备注

  • 对于Step-2Step-3,您不能只将此 jar 添加为部署的附加依赖项,因为该 jar 仅在用户类加载器中可用。Flink 需要这个 jar 在父类加载器中可用,以便格式化日志。您还可以使用自定义图像将此 jar 烘焙到 /flink/lib 目录中。
  • 对于Step-4,json 文件可以放在“附加依赖项”中,也可以放在与 jar 文件相同的位置。(但后一个意味着您需要在步骤 5 中使用“classpath:LogstashJsonEventLayoutV1.json”而不是绝对文件路径来引用该 json)

推荐阅读