449.md 7.6 KB
Newer Older
Lab机器人's avatar
readme  
Lab机器人 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
# Job logs

> 原文:[https://docs.gitlab.com/ee/administration/job_logs.html](https://docs.gitlab.com/ee/administration/job_logs.html)

*   [Data flow](#data-flow)
*   [Changing the job logs local location](#changing-the-job-logs-local-location)
*   [Uploading logs to object storage](#uploading-logs-to-object-storage)
*   [How to remove job logs](#how-to-remove-job-logs)
*   [New incremental logging architecture](#new-incremental-logging-architecture)
    *   [Enabling incremental logging](#enabling-incremental-logging)
    *   [Potential implications](#potential-implications)

# Job logs[](#job-logs "Permalink")

> 在 GitLab 12.5 中[从作业跟踪重命名为作业日志](https://gitlab.com/gitlab-org/gitlab/-/issues/29121) .

作业日志由 GitLab Runner 在处理作业时发送. 您可以在作业页面,管道,电子邮件通知等中查看日志.

## Data flow[](#data-flow "Permalink")

通常,作业日志有两种状态: `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 将存档日志移至[对象存储](#uploading-logs-to-object-storage) (如果已配置) | `#{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[](#changing-the-job-logs-local-location "Permalink")

要更改作业日志的存储位置,请执行以下步骤.

**在所有安装中;**

1.  编辑`/etc/gitlab/gitlab.rb`并添加或修改以下行:

    ```
    gitlab_ci['builds_directory'] = '/mnt/to/gitlab-ci/builds' 
    ```

2.  保存文件并[重新配置 GitLab,](restart_gitlab.html#omnibus-gitlab-reconfigure)以使更改生效.

**在源安装中:**

1.  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/ 
    ```

2.  保存文件并[重新启动 GitLab,](restart_gitlab.html#installations-from-source)以使更改生效.

## Uploading logs to object storage[](#uploading-logs-to-object-storage "Permalink")

归档日志被视为[作业工件](job_artifacts.html) . 因此,当您[设置对象存储集成时](job_artifacts.html#object-storage-settings) ,作业日志将与其他作业工件一起自动迁移到[该对象](job_artifacts.html#object-storage-settings) .

请参阅[数据流中的](#data-flow) "阶段 4:上传"以了解该过程.

## How to remove job logs[](#how-to-remove-job-logs "Permalink")

没有办法自动使旧的作业日志过期,但是如果它们占用太多空间,可以安全地将其删除. 如果您手动删除日志,则 UI 中的作业输出将为空.

例如,要删除所有超过 60 天的作业日志,请在您的 GitLab 实例中的 Shell 中运行以下命令:

**危险:**此命令将永久删除日志文件,并且是不可逆的.

```
find /var/opt/gitlab/gitlab-rails/shared/artifacts -name "job.log" -mtime +60 -delete 
```

## New incremental logging architecture[](#new-incremental-logging-architecture "Permalink")

版本历史

*   在 GitLab 10.4 中[引入](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/18169) .
*   [公布为一般可](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/46097)在 GitLab 11.0\.

**注意:**此功能默认为关闭. 有关如何[启用或禁用](#enabling-incremental-logging)它的信息,请参见下文.

通过将过程与对象存储设置相结合,我们可以完全绕过本地文件存储. 如果将 GitLab 安装为云原生,例如在 Kubernetes 上,这是一个有用的选项.

数据流与[数据流部分中](#data-flow)描述的相同,只是有所变化: *前两个阶段的存储路径不同* . 这种增量日志架构将日志块存储在 Redis 中,并将其存储在持久性存储(对象存储或数据库)中,而不是文件存储中. Redis 用作一流的存储,它最多可存储 128KB 数据. 一旦发送了完整的块,就将其刷新到持久性存储(对象存储(临时目录)或数据库). 一段时间后,Redis 和持久性存储中的数据将被归档到[对象存储](#uploading-logs-to-object-storage) .

数据存储在以下 Redis 命名空间中: `Gitlab::Redis::SharedState` .

这是详细的数据流:

1.  GitLab Runner 从 GitLab 选择工作
2.  GitLab Runner 向 GitLab 发送一条日志
3.  GitLab 将数据追加到 Redis
4.  一旦 Redis 中的数据达到 128KB,就将数据刷新到持久性存储(对象存储或数据库).
5.  重复上述步骤,直到作业完成.
6.  作业完成后,GitLab 会安排 Sidekiq 工作人员存档日志.
7.  Sidekiq worker 将日志归档到对象存储,并在 Redis 和永久存储(对象存储或数据库)中清除日志.

### Enabling incremental logging[](#enabling-incremental-logging "Permalink")

在 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[](#potential-implications "Permalink")

在某些情况下,将数据存储在 Redis 上可能会导致数据丢失:

1.  **情况 1:Redis 中的所有数据被意外刷新**
    *   可以通过重新发送日志来恢复增量日志(所有版本的 GitLab Runner 均支持此功能).
    *   未归档增量日志的已完成作业将丢失日志数据的最后一部分(〜128KB).
2.  **情况 2:当 Sidekiq 工作人员无法归档时(例如,存在一个阻止归档过程,Sidekiq 不一致等的错误)**
    *   当前,Redis 中的所有日志数据将在一周后删除. 如果 Sidekiq 工作人员无法在到期日之前完成操作,则部分日志数据将丢失.

可能出现的另一个问题是,它可能会消耗 Redis 实例上的所有内存. 如果作业数为 1000,则将消耗 128MB(128KB * 1000).

而且,它可能会给数据库复制带来压力. 生成`INSERT`以表明我们有日志块. 一旦我们收到多个数据块,便发出具有 128KB 数据的`UPDATE` .