flink log日志管理使用详解
文章目录
- flink log日志管理使用详解
- 如何使用日志记录
- 配置Log4j 2
- 与Log4j 1的兼容性
- 配置Log4j 1
- 配置logback
- 开发者最佳实践
- 参考链接
如何使用日志记录
所有的Flink进程都会创建一个包含该进程中各种事件消息的日志文本文件。这些日志提供了对Flink内部工作原理的深入了解,可以用于检测问题(以WARN/ERROR消息形式)并帮助调试。
可以通过WebUI的Job-/TaskManager页面访问日志文件。所使用的资源提供程序(如YARN)可能提供了额外的访问方式。
Flink中的日志记录使用SLF4J日志接口。这使您可以使用任何支持SLF4J的日志框架,而无需修改Flink源代码。
默认情况下,使用Log4j 2作为底层日志框架。
配置Log4j 2
Log4j 2使用属性文件进行控制。
Flink发行版附带了以下log4j属性文件,位于conf目录中,如果启用了Log4j 2,则会自动使用这些文件:
- log4j-cli.properties:由命令行界面使用(例如,flink run)
- log4j-session.properties:在启动Kubernetes/Yarn会话集群时命令行界面使用(即kubernetes-session.sh/yarn-session.sh)
- log4j-console.properties:如果Job-/TaskManagers在前台运行,则使用它们(例如Kubernetes)
- log4j.properties:默认情况下用于Job-/TaskManagers
Log4j定期扫描此文件以检查更改,并在必要时调整日志记录行为。默认情况下,检查间隔为30秒,并由Log4j属性文件中的monitorInterval设置控制。
与Log4j 1的兼容性
Flink附带了Log4j API桥接器,允许继续使用针对Log4j 1类工作的现有应用程序。
如果您有自定义的Log4j 1属性文件或依赖于Log4j 1的代码,请查阅官方的Log4j兼容性和迁移指南。
配置Log4j 1
要将Flink与Log4j 1一起使用,必须确保:
- org.apache.logging.log4j:log4j-core、org.apache.logging.log4j:log4j-slf4j-impl和org.apache.logging.log4j:log4j-1.2-api不在类路径上
- log4j:log4j、org.slf4j:slf4j-log4j12、org.apache.logging.log4j:log4j-to-slf4j和org.apache.logging.log4j:log4j-api在类路径上
在IDE中,这意味着您必须替换pom中定义的这些依赖项,并可能对传递依赖项添加排除项。
对于Flink发行版,这意味着您必须:
- 从lib目录中删除log4j-core、log4j-slf4j-impl和log4j-1.2-api jar包
- 将log4j、slf4j-log4j12和log4j-to-slf4j jar包添加到lib目录中
- 将conf目录中的所有log4j属性文件替换为与Log4j1兼容的版本
配置logback
要将Flink与logback一起使用,必须确保:
- org.apache.logging.log4j:log4j-slf4j-impl不在类路径上
- ch.qos.logback:logback-core和ch.qos.logback:logback-classic在类路径上
在IDE中,这意味着您必须替换pom中定义的这些依赖项,并可能对传递依赖项添加排除项。
对于Flink发行版,这意味着您必须:
- 从lib目录中删除log4j-slf4j-impl jar包
- 将logback-core和logback-classic jar包添加到lib目录中
Flink发行版附带了以下logback配置文件,位于conf目录中,如果启用了logback,则会自动使用这些文件:
- logback-session.properties:在启动Kubernetes/Yarn会话集群时命令行界面使用(即kubernetes-session.sh/yarn-session.sh)
- logback-console.properties:如果Job-/TaskManagers在前台运行,则使用它们(例如Kubernetes)
- logback.xml:默认情况下用于命令行界面和Job-/TaskManagers
Logback 1.3+需要SLF4J 2,目前还不支持。
开发者最佳实践
可以通过调用org.slf4j.LoggerFactory#LoggerFactory.getLogger并将自己类的Class作为参数来创建一个SLF4J记录器。
我们强烈建议将此记录器存储在一个私有的静态final字段中。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Foobar {
private static final Logger LOG = LoggerFactory.getLogger(Foobar.class);
public static void main(String[] args) {
LOG.info("Hello world!");
}
}
为了从SLF4J中获得最大效益,推荐使用其占位符机制。使用占位符可以避免在日志级别设置得很高以至于不会记录消息时进行不必要的字符串构造。
占位符的语法如下:
LOG.info("This message contains {} placeholders. {}", 2, "Yippie");
占位符也可以与异常一起使用,这些异常将被记录。
catch(Exception exception){
LOG.error("An {} occurred.", "error", exception);
}