0
点赞
收藏
分享

微信扫一扫

Flink Task 日志文件隔离

钎探穗 2024-09-23 阅读 20

Flink Task 日志文件隔离

在这里插入图片描述

在这里插入图片描述

任务在启动时会先通过 MdcUtils 启动一个 slf4j 的 MDC 环境,然后将 jobId 添加到 slf4j 的 MDC 容器中,随后任务输出的日志都将附带 joid。

MDC 介绍如下:

原理简单来说则是日志框架会将标记信息存放到 ThreadContextMap 中,而在每次打印日志时都会从 ThreadContextMap中获取 标记信息并附加到日志中。

ThreadContextMap 默认实现类为 DefaultThreadContextMap,可以看到如果要让所有线程都生效,那么还需要在 Properties 中设置 isThreadContextMapInheritable 配置。

public class DefaultThreadContextMap implements ThreadContextMap, ReadOnlyStringMap {
    public static final String INHERITABLE_MAP = "isThreadContextMapInheritable";
    private static boolean inheritableMap;
    static {
        init();
    }
    static ThreadLocal<Map<String, String>> createThreadLocalMap(final boolean isMapEnabled) {
        if (inheritableMap) {
            return new InheritableThreadLocal<Map<String, String>>() {
                @Override
                protected Map<String, String> childValue(final Map<String, String> parentValue) {
                    return parentValue != null && isMapEnabled //
                    ? Collections.unmodifiableMap(new HashMap<>(parentValue)) //
                            : null;
                }
            };
        }
        return new ThreadLocal<>();
    }

    static void init() {
        inheritableMap = PropertiesUtil.getProperties().getBooleanProperty(INHERITABLE_MAP);
    }
}

了解到MDC 类只包含静态方法,而 Task 会以 “flink-job-id” 作为 key 将 jobid 存放进 MDC 中,这样的话日志隔离也就好办了。
在这里插入图片描述

我们只需要自定义一个 Appender 并使用该 Appender,而该 Appender 通过 “flink-job-id” key 获取 MDC 中的 jobId,然后输出到以 jobId 命名的日志中,这样即实现了作业日志文件隔离。

Flink 日志记录:https://nightlies.apache.org/flink/flink-docs-release-1.20/docs/deployment/advanced/logging/

举报

相关推荐

0 条评论