【发布时间】:2018-12-03 17:05:20
【问题描述】:
我有多个在独立集群上运行的 flink 作业。我想要不同的日志文件用于不同的 flink 作业。那么如何在提交 flink 作业时传递不同的 log4j.properties 文件。
【问题讨论】:
标签: apache-flink flink-streaming flink-cep
我有多个在独立集群上运行的 flink 作业。我想要不同的日志文件用于不同的 flink 作业。那么如何在提交 flink 作业时传递不同的 log4j.properties 文件。
【问题讨论】:
标签: apache-flink flink-streaming flink-cep
到目前为止,还没有简单的方法来做到这一点,因为 flink 总是加载 flink/conf 下的文件。
如果您使用 flink 的 one-yarn-cluster-per-job 模式(即您使用:flink run -m yarn-cluster ... 启动脚本),这里有一个解决方法:
flink/conf 目录复制到仅用于您的工作的自定义位置log4j.properties或任何其他配置文件export FLINK_CONF_DIR=/path/to/my/conf
根据你的 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
如果您找到其他方法,请与我们分享。
【讨论】:
根据 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 的例子:
<!-- 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")
干杯
【讨论】: