EMR上运行Flink Jar无法输出自定义日志的解决方法咨询
我之前在EMR上部署Flink任务时也碰到过几乎一模一样的问题,结合你的logback配置和EMR的Flink运行逻辑,给你几个实用的排查和解决方向:
1. 确保logback.xml被Flink正确加载
EMR上的Flink默认会读取FLINK_CONF_DIR(通常是/usr/lib/flink/conf/)下的日志配置文件,如果你只是把logback.xml放在自己的Jar包或者自定义路径,Flink大概率没加载到它。解决方式二选一:
- 把你的logback.xml复制到
/usr/lib/flink/conf/目录下,替换默认的配置文件 - 提交Jar时通过JVM参数强制指定配置路径:
(如果是yarn session模式,启动session时就要加上这个参数)flink run -m yarn-cluster -yD logback.configurationFile=/path/to/your/logback.xml your-flink-job.jar
2. 检查日志目录的权限
/mnt/var/log/是EMR的系统日志目录,Flink的运行用户(通常是flink用户)可能没有写入权限。你可以先测试一下:
sudo -u flink touch /mnt/var/log/flink.log
如果报错权限不足,建议换一个Flink有权限的路径,比如:
sudo mkdir -p /var/log/flink sudo chown flink:flink /var/log/flink
然后把logback.xml里的<file>路径改成/var/log/flink/flink.log。
3. 添加自定义代码的Logger配置
你的logback.xml里只配置了Flink内部org.apache.flink.runtime.jobgraph.JobGraph的Logger和Root Logger,但你的自定义代码日志大概率用了自己的包名(比如com.yourcompany.flink)。需要给自定义包单独配置Logger,比如:
<configuration> <!-- 保留你原有的配置 --> <logger name="org.apache.flink.runtime.jobgraph.JobGraph" level="INFO" additivity="false"> <appender-ref ref="file" /> </logger> <!-- 添加自定义包的Logger --> <logger name="com.yourcompany.flink" level="INFO" additivity="false"> <appender-ref ref="file" /> </logger> <appender name="file" class="ch.qos.logback.core.FileAppender"> <file>/var/log/flink/flink.log</file> <append>false</append> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{60} %X{sourceThread} - %msg%n</pattern> </encoder> </appender> <root level="INFO"> <appender-ref ref="file"/> </root> </configuration>
这样你的自定义代码日志才会被正确路由到文件Appender。
4. 排查Log4j与Logback的依赖冲突
EMR上的Flink发行版可能默认用Log4j作为日志框架,这时候你的Logback配置会被忽略。你可以检查Flink的lib目录(/usr/lib/flink/lib/):
- 如果有
log4j-core.jar但没有log4j-to-slf4j.jar和slf4j-api.jar,说明Log4j没有桥接到SLF4J,Logback无法接管日志 - 解决办法:添加
log4j-to-slf4j和slf4j-api的Jar包到Flink的lib目录,或者在你的Jar包中包含这些依赖(注意版本兼容)
5. 检查YARN Container的日志路径
如果以上步骤都没问题,可能日志其实已经输出了,但你找错了路径。EMR上Flink的YARN任务日志会默认存放在本地的/var/log/hadoop-yarn/containers/目录下,对应每个任务的Container子目录里。你可以通过以下命令快速查找:
sudo find /var/log/hadoop-yarn/containers -name "stdout" | xargs grep "你的自定义日志关键词"
按照这些步骤排查下来,基本就能解决自定义日志不输出的问题了。
内容的提问来源于stack exchange,提问作者Vijaya Seetharaman

