Job logs
- Data flow
- Changing the job logs local location
- Uploading logs to object storage
- How to remove job logs
- New incremental logging architecture
Job logs
在 GitLab 12.5 中从作业跟踪重命名为作业日志 .
作业日志由 GitLab Runner 在处理作业时发送. 您可以在作业页面,管道,电子邮件通知等中查看日志.
Data flow
通常,作业日志有两种状态: log
和archived log
. 在下表中,您可以看到日志经过的阶段:
Phase | State | Condition | 数据流 | 储存路径 |
---|---|---|---|---|
1:打补丁 | log | 作业运行时 | GitLab Runner => Puma =>文件存储 | #{ROOT_PATH}/gitlab-ci/builds/#{YYYY_mm}/#{project_id}/#{job_id}.log |
2:覆盖 | log | 工作完成后 | GitLab Runner => Puma =>文件存储 | #{ROOT_PATH}/gitlab-ci/builds/#{YYYY_mm}/#{project_id}/#{job_id}.log |
3:归档 | 存档日志 | 工作完成后 | Sidekiq 将日志移至工件文件夹 | #{ROOT_PATH}/gitlab-rails/shared/artifacts/#{disk_hash}/#{YYYY_mm_dd}/#{job_id}/#{job_artifact_id}/job.log |
4:上传 | 存档日志 | 归档日志后 | Sidekiq 将存档日志移至对象存储 (如果已配置) | #{bucket_name}/#{disk_hash}/#{YYYY_mm_dd}/#{job_id}/#{job_artifact_id}/job.log |
ROOT_PATH
因环境而异. 对于 Omnibus GitLab,它将是/var/opt/gitlab
;对于从源代码进行的安装,它将是/home/git/gitlab
.
Changing the job logs local location
要更改作业日志的存储位置,请执行以下步骤.
在所有安装中;
编辑
/etc/gitlab/gitlab.rb
并添加或修改以下行:gitlab_ci['builds_directory'] = '/mnt/to/gitlab-ci/builds'
保存文件并重新配置 GitLab,以使更改生效.
在源安装中:
Edit
/home/git/gitlab/config/gitlab.yml
and add or amend the following lines:gitlab_ci:
# The location where build logs are stored (default: builds/).
# Relative paths are relative to Rails.root.
builds_path: path/to/builds/
保存文件并重新启动 GitLab,以使更改生效.
Uploading logs to object storage
归档日志被视为作业工件 . 因此,当您设置对象存储集成时 ,作业日志将与其他作业工件一起自动迁移到该对象 .
请参阅数据流中的 “阶段 4:上传”以了解该过程.
How to remove job logs
没有办法自动使旧的作业日志过期,但是如果它们占用太多空间,可以安全地将其删除. 如果您手动删除日志,则 UI 中的作业输出将为空.
例如,要删除所有超过 60 天的作业日志,请在您的 GitLab 实例中的 Shell 中运行以下命令:
危险:此命令将永久删除日志文件,并且是不可逆的.
find /var/opt/gitlab/gitlab-rails/shared/artifacts -name "job.log" -mtime +60 -delete
New incremental logging architecture
版本历史
注意:此功能默认为关闭. 有关如何启用或禁用它的信息,请参见下文.
通过将过程与对象存储设置相结合,我们可以完全绕过本地文件存储. 如果将 GitLab 安装为云原生,例如在 Kubernetes 上,这是一个有用的选项.
数据流与数据流部分中描述的相同,只是有所变化: 前两个阶段的存储路径不同 . 这种增量日志架构将日志块存储在 Redis 中,并将其存储在持久性存储(对象存储或数据库)中,而不是文件存储中. Redis 用作一流的存储,它最多可存储 128KB 数据. 一旦发送了完整的块,就将其刷新到持久性存储(对象存储(临时目录)或数据库). 一段时间后,Redis 和持久性存储中的数据将被归档到对象存储 .
数据存储在以下 Redis 命名空间中: Gitlab::Redis::SharedState
.
这是详细的数据流:
- GitLab Runner 从 GitLab 选择工作
- GitLab Runner 向 GitLab 发送一条日志
- GitLab 将数据追加到 Redis
- 一旦 Redis 中的数据达到 128KB,就将数据刷新到持久性存储(对象存储或数据库).
- 重复上述步骤,直到作业完成.
- 作业完成后,GitLab 会安排 Sidekiq 工作人员存档日志.
- Sidekiq worker 将日志归档到对象存储,并在 Redis 和永久存储(对象存储或数据库)中清除日志.
Enabling incremental logging
在 Rails 控制台中将发出以下命令:
# Omnibus GitLab
gitlab-rails console
# Installation from source
cd /home/git/gitlab
sudo -u git -H bin/rails console -e production
要检查是否启用了增量日志记录(跟踪):
Feature.enabled?(:ci_enable_live_trace)
要启用增量日志记录(跟踪):
Feature.enable(:ci_enable_live_trace)
注意:过渡期将得到适当处理. 即将到来的日志将使用增量体系结构生成,而正在进行的日志将保留在旧体系结构中,这意味着将不会使用增量体系结构强制重新生成正在进行的日志.
要禁用增量日志记录(跟踪):
Feature.disable('ci_enable_live_trace')
注意:过渡期将得到适当处理. 即将发生的日志将使用旧体系结构生成,而持续的增量日志将保留在增量体系结构中,这意味着持续的增量日志将不会用旧体系结构强制重新生成.
Potential implications
在某些情况下,将数据存储在 Redis 上可能会导致数据丢失:
- 情况 1:Redis 中的所有数据被意外刷新
- 可以通过重新发送日志来恢复增量日志(所有版本的 GitLab Runner 均支持此功能).
- 未归档增量日志的已完成作业将丢失日志数据的最后一部分(〜128KB).
- 情况 2:当 Sidekiq 工作人员无法归档时(例如,存在一个阻止归档过程,Sidekiq 不一致等的错误)
- 当前,Redis 中的所有日志数据将在一周后删除. 如果 Sidekiq 工作人员无法在到期日之前完成操作,则部分日志数据将丢失.
可能出现的另一个问题是,它可能会消耗 Redis 实例上的所有内存. 如果作业数为 1000,则将消耗 128MB(128KB * 1000).
而且,它可能会给数据库复制带来压力. 生成INSERT
以表明我们有日志块. 一旦我们收到多个数据块,便发出具有 128KB 数据的UPDATE
.