如何为在同一独立群集上运行的不同flink作业指定不同的log4j.properties文件

时间:2016-07-07 18:09:33

标签: apache-flink flink-streaming flink-cep

我在独立群集上运行多个flink作业。我想为不同的flink工作提供不同的日志文件。那么如何在提交flink作业时传递不同的log4j.properties文件。

2 个答案:

答案 0 :(得分:1)

截至目前,没有简单的方法可以做到这一点,因为flink总是加载flink/conf下的文件。

如果您使用每个作业的一个纱线群组flink (即您使用以下代码启动脚本:flink run -m yarn-cluster ...),这是一个解决方法:

  1. flink/conf目录复制到仅用于您的工作的自定义位置
  2. 修改log4j.properties或任何其他配置文件
  3. 在启动作业之前,请运行export FLINK_CONF_DIR=/path/to/my/conf
  4. 根据您的flink版本,检查文件flink/bin/config.sh。如果你在这条线上奔跑:

    FLINK_CONF_DIR=$FLINK_ROOT_DIR_MANGLED/conf
    

    改为:

    if [ -z "$FLINK_CONF_DIR" ]; then 
        FLINK_CONF_DIR=$FLINK_ROOT_DIR_MANGLED/conf; 
    fi
    

    如果您找到其他方式,请与我们分享。

答案 1 :(得分:0)

根据Flink文档(最新版本),您可以在提交时传递log4j / logback文件,这里是链接: https://ci.apache.org/projects/flink/flink-docs-master/monitoring/logging.html

简而言之,您可以提供" -Dlog4j.configuration=/path/to/log4j.properties"或" -Dlogback.configurationFile=/path/to/logback.xml"。您也可以为每个作业配置不同的记录器,这样您就可以保留一个" logback"/"log4j"文件。这是一个回溯的例子:

<!-- logback.xml -->
<configuration>
    <property name="LOG_HOME" value="/path/to/logs" />

    <appender name="JOB1"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/job1/job.out</file>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <Pattern>
                %d{yyyy-MM-dd HH:mm:ss} - %msg%n
            </Pattern>
        </encoder>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- rollover hourly -->
            <fileNamePattern>${LOG_HOME}/job1/%d{yyyyMMdd_HH}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>1MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
    </appender>

    <logger name="com.yourcompany.job1" level="INFO" additivity="false">
        <appender-ref ref="JOB1" />
    </logger>

    <!-- rest of configs -->
</configuration>

在你的代码中(使用Scala的例子,它与Java几乎相同):

import org.slf4j.LoggerFactory

private final val logger = LoggerFactory.getLogger("com.yourcompany.job1")
logger.info("some message")

干杯