Omnibus GitLab 日志
GitLab 包含一个高级日志系统,其中 GitLab 中的每个服务和组件都将输出系统日志。以下是用于管理这些日志的 Omnibus 配置设置和工具。
Tail 登录服务器上的控制台
如果你想 tail
,即查看 GitLab 日志的实时日志更新,您可以使用 gitlab-ctl tail
。
# Tail all logs; press Ctrl-C to exit
sudo gitlab-ctl tail
# Drill down to a sub-directory of /var/log/gitlab
sudo gitlab-ctl tail gitlab-rails
# Drill down to an individual file
sudo gitlab-ctl tail nginx/gitlab_error.log
Tail 登录控制台并保存到文件
通常,在控制台中显示日志并将它们保存到文件以供以后调试/分析很有用。您可以使用 tee
实用程序来完成此操作。
# Use 'tee' to tail all the logs to STDOUT and write to a file at the same time
sudo gitlab-ctl tail | tee --append /tmp/gitlab_tail.log
配置默认日志目录
在您的 /etc/gitlab/gitlab.rb
文件中,有许多用于各种类型日志的 log_directory
键。取消注释并更新要放置在其他地方的所有日志的值:
# For example:
gitlab_rails['log_directory'] = "/var/log/gitlab/gitlab-rails"
puma['log_directory'] = "/var/log/gitlab/puma"
registry['log_directory'] = "/var/log/gitlab/registry"
...
运行 sudo gitlab-ctl reconfigure
以使用这些设置配置您的实例。
runit 日志
Omnibus GitLab 中的 runit-managed 服务使用 svlogd
生成日志数据。
- 日志被写入一个名为
current
的文件。 - 此日志会定期使用 TAI64N 格式进行压缩和重命名,例如:
@400000005f8eaf6f1a80ef5c.s
。 - 压缩日志上的文件系统日期戳将与 GitLab 上次写入该文件的时间一致。
-
zmore
和zgrep
允许查看和搜索压缩或未压缩的日志。
阅读 svlogd 文档 以获取有关它生成的文件的更多信息。
您可以使用以下设置通过 /etc/gitlab/gitlab.rb
修改 svlogd 设置:
# Below are the default values
logging['svlogd_size'] = 200 * 1024 * 1024 # rotate after 200 MB of log data
logging['svlogd_num'] = 30 # keep 30 rotated log files
logging['svlogd_timeout'] = 24 * 60 * 60 # rotate after 24 hours
logging['svlogd_filter'] = "gzip" # compress logs with gzip
logging['svlogd_udp'] = nil # transmit log messages via UDP
logging['svlogd_prefix'] = nil # custom prefix for log messages
# Optionally, you can override the prefix for e.g. Nginx
nginx['svlogd_prefix'] = "nginx"
Logrotate
GitLab 内置的 logrotate 服务管理除 runit 捕获的日志之外的所有日志。该服务会轮换、压缩并最终删除 gitlab-rails/production.log
和 nginx/gitlab_access.log
等日志数据。 您可以使用 /etc/gitlab/gitlab.rb
配置 logrotate:
# Below are some of the default settings
logging['logrotate_frequency'] = "daily" # rotate logs daily
logging['logrotate_maxsize'] = nil # logs will be rotated when they grow bigger than size specified for `maxsize`, even before the specified time interval (daily, weekly, monthly, or yearly)
logging['logrotate_size'] = nil # do not rotate by size by default
logging['logrotate_rotate'] = 30 # keep 30 rotated logs
logging['logrotate_compress'] = "compress" # see 'man logrotate'
logging['logrotate_method'] = "copytruncate" # see 'man logrotate'
logging['logrotate_postrotate'] = nil # no postrotate command by default
logging['logrotate_dateformat'] = nil # use date extensions for rotated files rather than numbers e.g. a value of "-%Y-%m-%d" would give rotated files like production.log-2016-03-09.gz
# You can add overrides per service
nginx['logrotate_frequency'] = nil
nginx['logrotate_size'] = "200M"
# You can also disable the built-in logrotate service if you want
logrotate['enable'] = false
自 13.6 版本起,logrotate 服务以不可配置的默认值 notifempty
运行,解决了以下问题:
- 不必要地轮换空日志,并且经常存储许多空日志。
- 对长期故障排除有用的一次性日志在 30 天后被删除,例如数据库迁移日志。
日志现在根据需要由 logrotate 轮换和重新创建,一次性日志仅在更改时轮换。有了这个设置,就可以做一些整理工作:
- 可以删除空的一次性日志,例如
gitlab-rails/gitlab-rails-db-migrate*.log
。 - 由旧版本的 GitLab 轮换和压缩的空日志。这些空日志的大小通常为 20 字节。
手动运行 logrotate
Logrotate 是一项计划作业,但也可以按需触发。
要使用 logrotate
手动触发 GitLab 日志轮换,请使用以下命令:
/opt/gitlab/embedded/sbin/logrotate -fv -s /var/opt/gitlab/logrotate/logrotate.status /var/opt/gitlab/logrotate/logrotate.conf
UDP 日志转发
Omnibus GitLab 可以利用 svlogd 中的 UDP 日志记录功能,也可以使用 UDP 将非 svlogd 日志发送到与 syslog 兼容的远程系统。 要将 Omnibus GitLab 配置为通过 UDP 发送系统日志协议消息,请使用以下设置:
logging['udp_log_shipping_host'] = '1.2.3.4' # Your syslog server
# logging['udp_log_shipping_hostname'] = nil # Optional, defaults the system hostname
logging['udp_log_shipping_port'] = 1514 # Optional, defaults to 514 (syslog)
示例日志消息:
Jun 26 06:33:46 ubuntu1204-test production.log: Started GET "/root/my-project/import" for 127.0.0.1 at 2014-06-26 06:33:46 -0700
Jun 26 06:33:46 ubuntu1204-test production.log: Processing by ProjectsController#import as HTML
Jun 26 06:33:46 ubuntu1204-test production.log: Parameters: {"id"=>"root/my-project"}
Jun 26 06:33:46 ubuntu1204-test production.log: Completed 200 OK in 122ms (Views: 71.9ms | ActiveRecord: 12.2ms)
Jun 26 06:33:46 ubuntu1204-test gitlab_access.log: 172.16.228.1 - - [26/Jun/2014:06:33:46 -0700] "GET /root/my-project/import HTTP/1.1" 200 5775 "https://172.16.228.169/root/my-project/import" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36"
2014-06-26_13:33:46.49866 ubuntu1204-test sidekiq: 2014-06-26T13:33:46Z 18107 TID-7nbj0 Sidekiq::Extensions::DelayedMailer JID-bbfb118dd1db20f6c39f5b50 INFO: start
2014-06-26_13:33:46.52608 ubuntu1204-test sidekiq: 2014-06-26T13:33:46Z 18107 TID-7muoc RepositoryImportWorker JID-57ee926c3655fcfa062338ae INFO: start
使用自定义 NGINX 日志格式
默认情况下,NGINX 访问日志将使用 combined
NGINX 格式的一个版本,旨在隐藏嵌入在查询字符串中的潜在敏感信息。
如果您想使用自定义日志格式字符串,您可以在 /etc/gitlab/gitlab.rb
中指定 - 请参阅 NGINX 文档以获取格式详细信息。
nginx['log_format'] = 'my format string $foo $bar'
mattermost_nginx['log_format'] = 'my format string $foo $bar'
JSON 日志记录
结构化日志可以通过 JSON 导出,供 Elasticsearch、Splunk 或其他日志管理系统解析。从 Omnibus GitLab 12.0 开始,默认情况下为所有支持它的服务启用 JSON 格式。
postgresql['log_destination'] = 'csvlog'
postgresql['logging_collector'] = 'on'
需要重启数据库才能生效。 有关更多详细信息,请参阅 PostgreSQL 文档。
文本记录
已建立日志摄取系统的客户可能不希望使用 JSON 日志格式。可以通过在 /etc/gitlab/gitlab.rb
中设置以下内容,然后运行 gitlab-ctl reconfigure
来配置文本格式:
gitaly['logging_format'] = ''
gitlab_shell['log_format'] = 'text'
gitlab_workhorse['log_format'] = 'text'
registry['log_formatter'] = 'text'
sidekiq['log_format'] = 'default'
gitlab_pages['log_format'] = 'text'
log_formatter
,Gitaly 和 Praefect 都使用 logging_format
)。配置日志级别/详细程度
您可以为 Container Registry、GitLab Shell 和 Gitaly 配置最低日志级别(详细程度):
-
编辑
/etc/gitlab/gitlab.rb
并设置日志级别:registry['log_level'] = 'info' gitlab_shell['log_level'] = 'INFO' gitaly['logging_level'] = 'warn'
-
重新配置极狐GitLab:
sudo gitlab-ctl reconfigure
log_level
,例如 production_json.log
、sidekiq.log
等。