如何捕获Airflow WebServer访问者信息并生成访问日志?
如何记录Airflow WebServer的登录用户及时间
Stack Exchange社区里确实有开发者解决过这类需求,核心思路是借助Airflow WebServer基于Flask框架的特性,通过钩子或信号监听实现登录事件捕获,以下是具体可行方案:
方法1:利用Flask-Login的登录信号监听
Airflow默认使用Flask-Login处理用户认证,可直接监听user_logged_in信号触发日志记录:
- 找到Airflow的
webserver_config.py配置文件(若不存在可从官方示例文件复制生成) - 添加以下代码:
from flask_login import user_logged_in import logging from datetime import datetime # 配置专属日志处理器 login_logger = logging.getLogger('airflow_login') login_logger.setLevel(logging.INFO) file_handler = logging.FileHandler('/path/to/airflow_login.log') formatter = logging.Formatter('%(asctime)s - %(message)s') file_handler.setFormatter(formatter) login_logger.addHandler(file_handler) # 定义登录事件回调函数 def log_login(sender, user, **extra): login_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S') login_logger.info(f"User {user.username} logged in at {login_time}") # 注册信号监听 user_logged_in.connect(log_login)
- 重启Airflow WebServer,之后用户登录时,指定日志文件会自动记录用户名和登录时间。
方法2:Flask全局请求钩子
如果需要捕获所有WebServer访问(不仅限于登录),可使用Flask的before_request钩子:
在webserver_config.py中添加:
from flask import request import logging from datetime import datetime from airflow.www.security import get_current_user access_logger = logging.getLogger('airflow_web_access') access_logger.setLevel(logging.INFO) file_handler = logging.FileHandler('/path/to/airflow_web_access.log') access_logger.addHandler(file_handler) @app.before_request def log_web_access(): user = get_current_user() if user and user.is_authenticated: access_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S') access_logger.info(f"Authenticated user {user.username} accessed {request.path} at {access_time}")
此方案会记录已登录用户的所有Web页面访问路径、用户名及时间。
注意事项
- 确保Airflow版本为2.x及以上,上述方案基于Airflow 2.x的Flask-Login实现
- 日志文件路径需配置Airflow进程可读写的权限
- 若使用自定义认证后端(如LDAP、OAuth),需确保
get_current_user()能正确获取用户信息
内容的提问来源于stack exchange,提问作者Terence
相关产品推荐
相关产品推荐

