wunderio / updates_log
日志模块更新信息
README
记录Drupal项目更新状态。
为什么?当周围有多个Drupals时,跟踪安全更新可能会很具挑战性。一个选项是按日记录模块的状态,并根据日志创建警报(例如在Slack上)。在SumoLogic这样的集中式日志系统中很有意义。它允许创建所有种类的统计数据和分析。
作为替代方案,有Warden,但它缺少高度可配置的警报。
分发
安装
- 安装模块:
composer require wunderio/updates_log:^2
- 为
update
模块安装核心补丁 bug - 启用模块:
drush en -y updates_log
- 可选:通过使用Config Split,仅在默认分支中启用模块。
- 导出配置:
drush cex -y
- 要验证操作,请运行
drush cron
。在第一次cron执行时,它将报告所有模块的状态从“未知”变为“已知”。检查您的日志!
用法
每小时记录模块状态的变化(如果有的话)
---- -------------- ------------- ---------- ------------------------------------------------------------------------------------------------------
ID Date Type Severity Message
---- -------------- ------------- ---------- ------------------------------------------------------------------------------------------------------
1 01/Jul 15:43 updates_log Info updates_log={"project":"drupal","old":"CURRENT","new":"NOT_SECURE","site":"example.com","env:"prod"}==
---- -------------- ------------- ---------- ------------------------------------------------------------------------------------------------------
old
和 new
表示状态。分别代表旧状态和新的状态。上面的日志可以这样理解:drupal
包在之前的运行中是最新的,现在其状态已更改(发布了安全更新),因此状态从 CURRENT
变为 NOT_SECURE
。
状态代码来自Drupal代码
-
web/core/modules/update/src/UpdateManagerInterface.php
NOT_SECURE
REVOKED
NOT_SUPPORTED
NOT_CURRENT
CURRENT
-
web/core/modules/update/src/UpdateFetcherInterface.php
NOT_CHECKED
UNKNOWN
NOT_FETCHED
FETCH_PENDING
时间
完整的统计日志条目大约每24小时生成一次。
差异日志条目可能每小时生成一次。
状态
updates_log.last
- 只在这里保留最后一次运行的时间戳(每小时)。该值以秒为单位。如果需要观察或更改这些值,请使用以下参考命令:
drush sget updates_log.last
drush sset updates_log.last 1654253832
updates_log_statistics.last
- 只在这里保留最后一次运行的时间戳(每24小时)。该值以秒为单位。与上面显示的类似,应用相同的参考命令。
updates_log.statuses
- 模块“当前”状态保存在此状态变量中。这是执行差异所必需的。要观察其内容,请运行以下命令:drush sget updates_log.statuses --format=json
。
输出
通用格式是 id={json}==
。末尾有两个等号,以标记JSON的结尾。这是必需的,因为在某些日志环境中使用了额外的封装,这使得解析变得不可能。
差异
当模块状态有任何变化时,它们的日志输出如下所示
updates_log={
project: "webform",
old: "NOT_CURRENT",
new: "CURRENT"
site: "example.com"
env: "prod"
}==
每次状态变化都会有一个日志条目。
统计信息
该模块还会每24小时记录一次“统计信息”,快速概述有多少模块以及它们的状态。
updates_log_statistics={
"updates_log": "2.4.0",
"last_check_epoch": 1672835445,
"last_check_human": "2023-01-04T12:30:450GMT",
"last_check_ago": 16,
"site": "project-acme-support",
"env": "prod",
"summary": {
"CURRENT": 31,
"NOT_CURRENT": 0,
"NOT_SECURE": 0,
"NOT_SUPPORTED": 1,
"REVOKED": 0,
"UNKNOWN": 0
},
"details": {
"NOT_SUPPORTED": {
"admin_toolbar": "3.1.0"
}
}
}==
“前缀” (updates_log_statistics=
) 用于帮助过滤和解析日志条目的数据。
站点
site
用于标识项目。它通过使用第一个非空项进行检测。
$settings['updates_log_site']
- 环境变量
PROJECT_NAME
- 环境变量
HOSTNAME
- 环境变量
DRUSH_OPTIONS_URI
+ 主机名提取 "未知"
环境变量
env
用于标识环境(开发、测试、生产等)。它通过使用第一个非空项进行检测。
$settings['updates_log_env']
- 环境变量
ENVIRONMENT_NAME
- 环境变量
WKV_SITE_ENV
- 设置
simple_environment_indicator
+ 颜色移除 "未知"
设置
您可以在 settings.php
中添加 $settings['updates_log_disabled'] = TRUE;
以停止 updates_log 报告。
这对于只想在单一环境中报告更新的站点非常有用。
updates_log 的开发
- 将 drupal-project 作为基础进行克隆
- 将
updates_log
项目克隆到web/modules/custom/updates_log
- 编辑
.lando.yml
以禁用不必要的服务和它们代理(chrome
、elasticsearch
、kibana
、mailhog
、node
) lando start
- 启动开发环境lando composer install
- 安装 GrumPHPlando drush site-install
- 填充数据库lando drush en updates_log
- 启用模块lando drush cron
或- 通过
lando ssh
连接到容器并运行UPDATES_LOG_TEST=1 drush cron
以绕过时间检查
- 通过
lando grumphp run
进行代码扫描lando phpunit --group=updates_log
运行测试
发布制作
- 确保所有更改都有测试
- 确保所有测试都通过
- 确保代码扫描是干净的
- 更新
README.md
- 如有必要,更新 Drupal 项目模板
- 更新
version
在updates_log.info.yml
- 在 GitHub 中创建与相同版本的发布
调试 - 当您看不到预期结果时该怎么办?
使用 UPDATES_LOG_TEST
环境变量来绕过测试的时间要求 UPDATES_LOG_TEST=1 drush cron
或 UPDATES_LOG_TEST=1 drush eval 'updates_log_cron();'
。这适用于(按小时和每日)功能模式。运行此命令后,您应该在日志中获取完整的统计信息,如果存在任何状态变化,这些变化也应该有它们自己的日志条目。
以下是一些其他要尝试的事情
- Drupal
update
模块- 确保
/admin/reports/updates/settings
可以加载,并且已配置。再次保存表单。 - 检查“可用更新”报告的状态。它是红色还是绿色?
drush eval 'var_dump(update_get_available(TRUE));'
- 应返回大型数组。drush eval '$available = update_get_available(TRUE); $project_data = update_calculate_project_data($available); var_dump($project_data);'
drush ev '\Drupal::keyValue("update_fetch_task")->deleteAll();'
- 在update
重新安装后drush sqlq 'truncate batch'
drush sqlq 'truncate queue'
drush pm-uninstall -y update; drush pm-install -y update
drush sdel update.last_check
- 确保
- 更新日志
UPDATES_LOG_TEST=1 drush cron
UPDATES_LOG_TEST=1 drush eval 'updates_log_cron();'
drush sget updates_log.statuses --format=json
drush sget updates_log.last
drush sget updates_log_statistics.last
Drupal 核心错误
存在一个 Drupal 核心错误,在某些情况下不会获取新数据,或不会为某些项目获取数据。有关详细信息,请参阅安装说明。