Azkaban是一个JavaWeb项目,源码阅读难度相对不大本篇主要介绍Azkaban的日志保存和获取。
闲话不说直接正文!!!!!
阅读源码第一步,找到入口类:
Azkaban是一个gradlew项目,从github下载好源码导入idea中,目录为:
azkaban-web-server:里面主要是一些servlet 和web资源,azkaban-exec-server:主要是一些job和flow运行的方法,azkaban-common:主要是操作数据库的类和方法。
日志保存的入口类:
日志分为:flow日志 和 job的日志
azkaban-3.62.0\azkaban-exec-server\src\main\java\azkaban\execapp\FlowRunner.java
azkaban-3.62.0\azkaban-exec-server\src\main\java\azkaban\execapp\JobRunner.java
当任务运行完毕会分别调用 flowRunner中的closeLogger()方法和finalizeLogFile()方法来完成日志的保存。
这两个方法都调用了同一个方法。
我们进入到这个方法:
azkaban-common/executor/ExecutorLoader.java
executorLoader是一个接口类:
由azkaban-3.62.0\azkaban-common\src\main\java\azkaban\executor\JdbcExecutorLoader.java实现了接口类中的方法。
我们可以看到uploadLogFile方法调用了executionLogsDao中更新数据库的操作,将日志数据保存到数据库中(会将日志数据进行压缩后进行保存)
2.web端日志获取流程
日志获取的入口类:
\azkaban-3.62.0\azkaban-web-server\src\main\java\azkaban\webapp\servlet\ExecutorServlet.java
通过servlet获取前台页面发送过来的ajax请求,
ajaxFetchExecFlowLogs()来接收 flow日志的请求。
ajaxFetchJobLogs来接收获取job日志的请求
ajax
他们都调用了exectorManagerAdapter(azkaban-common\src\main\java\azkaban\executor\ExecutorManagerAdapter.java)接口中的方法来获取日志,
真正实现方法的其实是\azkaban-common\src\main\java\azkaban\executor\ExecutorManager.java 这个类
两个方法都调用了executorLoader接口中的方法,最后调用azkaban-common\src\main\java\azkaban\executor\ExecutionLogsDao.java 中的
fetchLogs()方法来获取日志。
注意:再获取日志是会对获取到的日志进行解压缩,在根据对应的编码格式打印