在 ververica flink 中启用 JSON 登录

Enabling JSON logging in ververica flink

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

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

我尝试使用 JSON 布局类型的日志,但 jackson 不在 class 路径中,并且出于某种原因将它们标记为工件对于 job/task 管理器日志来说是不够的

接下来,我尝试了不需要 jackson 或任何其他依赖项的 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>

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

第一步:
准备 log4j-layout-template-json-2.14.1.jar(或您使用的任何版本)和 LogstashJsonEventLayoutV1.json(来自 https://logging.apache.org/log4j/2.x/manual/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

第三步:
在部署配置页面 (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

第四步:
将 LogstashJsonEventLayoutV1.json 添加到 Deployment Artifacts 并在部署配置页面 (YAML) 下引用它:

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

第五步:
为 Deployment 配置日志记录模板:

<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 将仅在用户 class 加载程序中可用。 Flink 需要这个 jar 在父 class 加载器中可用,以便格式化日志。您还可以将此 jar 放入带有自定义图像的 /flink/lib 目录中。
  • 对于Step-4,json 文件可以放在'additional dependencies' 中或与jar 文件相同的位置。 (但后者意味着您需要在第 5 步中使用 'classpath:LogstashJsonEventLayoutV1.json' 而不是绝对文件路径来引用 json)