Airflow删除数据库Log记录是否会同步删除PVC存储日志
问题1:Airflow是否存在删除数据库Log表记录时自动同步删除PVC日志文件的内置机制
不存在。Airflow 2.3.0版本里,元数据库的Log表只存日志关联的任务ID、执行时间、文件路径这类元信息,和PVC上存的实际日志文件是完全分开的,官方根本没做删库表记录就联动删磁盘文件的逻辑,没有触发器、没有钩子、也没有后台任务干这个事。
要是你发现Airflow UI上看不了早于某个时间的日志,先别直接判定是文件被删了——元数据删了之后UI找不到日志的索引路径,一样会显示日志不存在,先去PVC上实际查下文件还在不在。
问题2:自定义清理DAG的逻辑问题
你写的这个DAG有3处明确的问题,其中时间计算逻辑刚好和你说的5月26日的丢失节点完全对上:
- 过滤运行中任务的代码完全没用
你写的排除运行中任务的逻辑是:
这段代码的过滤条件是拿固定字符串if "state" in dir(table): query = query.filter(State.RUNNING != "state")"running"(也就是State.RUNNING的值)和另一个固定字符串"state"比是不是不相等,结果永远为真,根本没去读表里的state字段做判断,等于这个过滤完全没加。现在你用end_date做过滤,运行中的任务end_date是空值,不会被误删,但这个写法是个定时炸弹,后续改过滤条件的时候很容易把正在跑的任务记录删掉。 - 过期时间窗口刚好卡到5月26日
你设的4周保留期固定是28天,要是你跑这个清理DAG的当天是6月23日,往前推28天刚好就是5月26日,和你说的日志丢失时间点完全吻合。
这里有个非常明显的疑点:你代码开头导入了from shutil import rmtree(递归删文件/目录的函数)和from pathlib import Path(路径处理工具),但是贴出来的代码里根本没用到这两个包。正常写代码不会导入没用的依赖,你最好去Airflow上看实际跑的DAG代码是不是有遗漏——大概率你之前写过遍历PVC日志目录、按文件修改时间删4周前日志的逻辑,贴代码的时候没放上来,这才是PVC上日志文件真的被删掉的最可能原因。 - Log表的时间判断字段用错了
你清Log表的时候拿Log.dttm当判断字段,这个字段是日志元数据写入数据库的时间,不是对应任务的结束时间,会把还没到保留期的任务的日志元数据提前删掉,也会漏删一部分已经过期的日志记录。
实操建议
别自己写元数据清理逻辑,Airflow 2.3.0已经自带官方的airflow db clean命令,会自动处理表之间的外键关联、跳过运行中的实例,比自己写的逻辑靠谱得多。清理元数据之前一定要先备份库,日志文件清理最好和元数据清理分开做,单独配保留规则,别混在一个DAG里。
内容的提问来源于stack exchange,提问作者Tau n Ro
相关产品推荐
相关产品推荐

