flink限制日志文件大小( 滚动日志配置)

一、问题

flink如果不限制日志文件大小,如果报错的情况下,会产生大文件日志。
在这里插入图片描述

二、说明

Flink1.10.1

默认配置文件会将 JobManager 和 TaskManager 的日志分别打印在不同的文件中,每个文件的日志大小一直会增加.。

配置文件
  • log4j-cli.properties: 由Flink命令行客户端使用(例如flink run)
  • log4j-yarn-session.properties: 由Flink命令行启动YARN Session(yarn-session.sh)时使用
  • log4j.properties: JobManager /Taskmanager日志(包括standalone和YARN)

Flink1.11.1

JobManager 和 TaskManager 日志输出在同一个文件中。

这两个版本,我们都可以对Flink日志做滚动的配置,控制每个日志文件的输出大小。

三、配置详情

jm 和 tm 上用的 log 配置都依赖于 flink/conf/log4j.properties 配置文件。

下面两个版本,将滚动日志设置为最大5m,最多10个文件。

Flink1.10.1

# 滚动日志配置
# This affects logging for both user code and Flink
log4j.rootLogger=INFO, R

# Uncomment this if you want to _only_ change Flink's logging
#log4j.logger.org.apache.flink=INFO

# The following lines keep the log level of common libraries/connectors on
# log level INFO. The root logger does not override this. You have to manually
# change the log levels here.
log4j.logger.akka=INFO
log4j.logger.org.apache.kafka=INFO
log4j.logger.org.apache.hadoop=INFO
log4j.logger.org.apache.zookeeper=INFO

log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=${log.file}
log4j.appender.R.MaxFileSize=5MB
log4j.appender.R.Append=true
log4j.appender.R.MaxBackupIndex=10
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %t %-5p %-60c %x - %m%n

# Suppress the irrelevant (wrong) warnings from the Netty channel handler
log4j.logger.org.apache.flink.shaded.akka.org.jboss.netty.channel.DefaultChannelPipeline=ERROR, R

Flink1.11.1

# 滚动日志的配置
# This affects logging for both user code and Flink
rootLogger.level = DEBUG
rootLogger.appenderRef.rolling.ref = RollingFileAppender
 
# Uncomment this if you want to _only_ change Flink's logging
#logger.flink.name = org.apache.flink
#logger.flink.level = INFO
 
# The following lines keep the log level of common libraries/connectors on
# log level INFO. The root logger does not override this. You have to manually
# change the log levels here.
logger.akka.name = akka
logger.akka.level = INFO
logger.kafka.name= org.apache.kafka
logger.kafka.level = INFO
logger.hadoop.name = org.apache.hadoop
logger.hadoop.level = INFO
logger.zookeeper.name = org.apache.zookeeper
logger.zookeeper.level = INFO
 
# Log all infos in the given rolling file
appender.rolling.name = RollingFileAppender
appender.rolling.type = RollingFile
appender.rolling.append = false
#日志文件名
appender.rolling.fileName = ${sys:log.file}
#指定当发生文件滚动时,文件重命名规则
appender.rolling.filePattern = ${sys:log.file}.%i
appender.rolling.layout.type = PatternLayout
# 输出模板
appender.rolling.layout.pattern = %d{yyyy-MM-dd HH:mm:ss,SSS} %-5p %-60c %x - %m%n
# 指定记录文件的保存策略,该策略主要是完成周期性的日志文件保存工作
appender.rolling.policies.type = Policies
# 基于日志文件大小的触发策略
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy
# 当日志文件大小大于size指定的值时,触发滚动
appender.rolling.policies.size.size = 5MB
# 文件保存的覆盖策略
appender.rolling.strategy.type = DefaultRolloverStrategy
# 生成分割(保存)文件的个数,默认为5(-1,-2,-3,-4,-5)
appender.rolling.strategy.max = 10
 
# Suppress the irrelevant (wrong) warnings from the Netty channel handler
logger.netty.name = org.apache.flink.shaded.akka.org.jboss.netty.channel.DefaultChannelPipeline
logger.netty.level = OFF
<think>好的,用户问的是如何在Flink中打印日志。首先,我需要回忆一下Flink的基本结构,因为日志处理可能涉及到不同的组件,比如作业管理器和任务管理器,或者是在用户自己写的代码里打日志。 用户可能正在开发Flink应用程序,遇到了需要调试的情况,所以想知道如何正确添加日志。需要分情况考虑,比如在算子函数里如何打日志,或者配置整个Flink系统的日志级别。用户可能对Flink日志机制不太熟悉,需要详细的步骤说明。 接下来,我得考虑不同的场景。比如,用户可能是在自定义的RichFunction里想要记录数据流的处理情况。这时候应该用Logger,并且要确保不引入性能问题。同时,用户可能不知道应该用哪个日志框架,比如Slf4j,这是Flink常用的,需要指出正确的导入和用法。 另外,用户可能还关心如何调整全局的日志级别,比如修改log4j的配置文件,这样他们可以控制不同类别的日志输出。这时候需要给出配置文件的路径和示例配置,比如设置rootLogger的级别为INFO或者DEBUG。 还有,用户可能对作业管理器和任务管理器的日志位置不清楚,需要说明日志文件的默认存放位置,以及如何通过Web UI查看,这对调试实际问题很有帮助。 最后,需要注意提醒用户避免在生产环境中过度打印日志,以免影响性能。同时,确保代码中的Logger是静态常量,避免重复创建的开销。这些细节能帮助用户正确有效地使用日志功能,而不会引入其他问题。</think>在 Apache Flink 中打印日志需要根据不同的场景采用不同的方法,以下是详细的实现指南: --- ### 一、在算子函数中打印日志 #### 推荐方式:使用 SLF4J 日志框架 ```java import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class MyMapFunction extends RichMapFunction<String, String> { // 声明为 transient 避免序列化问题 private static final Logger LOG = LoggerFactory.getLogger(MyMapFunction.class); @Override public String map(String value) { LOG.debug("Processing: {}", value); // 使用占位符避免字符串拼接开销 if(value.contains("error")) { LOG.warn("Detected error in record: {}", value); } return value.toUpperCase(); } } ``` #### 关键注意事项: 1. 必须声明 `transient`(对于非静态Logger) 2. 建议使用 `static final` 声明Logger 3. 避免高频日志影响性能(建议DEBUG级别日志加判断) --- ### 二、配置系统日志级别 #### 修改 `conf/log4j.properties` ```properties # 设置根日志级别 log4j.rootLogger=INFO, file # 单独设置特定类的日志级别 log4j.logger.org.apache.flink.runtime.dispatcher=ERROR log4j.logger.com.mycompany.flink.jobs=DEBUG # 控制台输出配置 log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p %c{1} - %m%n ``` --- ### 三、查看运行时日志 #### 日志文件位置: - **作业管理器日志**:`$FLINK_HOME/log/flink-<user>-jobmanager-<hostname>.log` - **任务管理器日志**:`$FLINK_HOME/log/flink-<user>-taskmanager-<hostname>.log` #### 通过Web UI查看: 访问 `http://<jobmanager-host>:8081` → 导航到 "Task Managers" → 选择具体实例 → 查看 "Logs" 标签页 --- ### 四、最佳实践建议 1. **生产环境限制**: - 避免在 `flatMap/map/filter` 等高频操作中打印INFO级日志 - 使用 `if (LOG.isDebugEnabled())` 包裹调试日志 2. **异常处理**: ```java try { // 业务逻辑 } catch (Exception e) { LOG.error("Process failed with record: {}", record, e); // 必须打印堆栈 throw e; // 保证故障恢复机制触发 } ``` 3. **性能敏感场景**: - 使用计数器替代日志:`getRuntimeContext().getMetricGroup().counter("errors")` --- ### 五、常见问题排查 **Q:日志不显示?** - 检查log4j配置是否加载正确 - 确认JVM参数未覆盖日志配置 - 查看是否配置了多个日志框架冲突 **Q:日志文件?** - 配置滚动策略: ```properties log4j.appender.file=org.apache.log4j.RollingFileAppender log4j.appender.file.MaxFileSize=100MB log4j.appender.file.MaxBackupIndex=10 ``` 通过合理配置日志级别和输出策略,可以在调试便利性和系统性能之间取得平衡。建议在开发环境使用DEBUG级别,生产环境使用WARN/ERROR级别。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值