日志信息格式化
使用 lograge
对日志进行格式化
gem 'lograge'
gem 'logstash-event' # Lograge::Formatters::Logstash.new
#
# Lograge
config.lograge.enabled = true
config.lograge.base_controller_class = ['ActionController::API', 'ActionController::Base']
# 保留原生日志
config.lograge.keep_original_rails_log = true
# 日志文件位置和命名
config.lograge.logger = ActiveSupport::Logger.new "#{Rails.root}/log/lograge_#{Rails.env}.log"
# 日志格式
config.lograge.formatter = Lograge::Formatters::Logstash.new
# 指定接口不记录日志
config.lograge.ignore_actions = %w[NameSpace::YourController#action]
# 可以指定一些参数放到log中(merge)
config.lograge.custom_payload do |controller|
if controller.respond_to?(:current_user, true)
uid = controller.send(:current_user)&.id
elsif controller.respond_to?(:current_admin_user, true)
uid = controller.send(:current_admin_user)&.id
end
request = controller.request
{
request_id: request.uuid,
host: request.host,
ip: request.env['HTTP_X_FORWARDED_FOR'] || request.env['REMOTE_ADDR'],
ua: request.env['HTTP_USER_AGENT'],
uid: uid
}
end
日志分割
使用 logrotate
进行日志分割
$ sudo vim /etc/logrotate.d/yourconfig
# 一份配置可以配置多个文件
# 配置中不可以有注释,实际使用时需要把注释删除
/path/of/your.log {
su deploy deploy # su someuser somegroup 处理报错 skipping "/var/www/xx/shared/log/staging.log" because parent directory has insecure permissions (It's world writable or writable by group which is not "root") Set "su" directive in config file to tell logrotate which user/group should be used for rotation.
daily # 每天执行
rotate 30 # 保留最近30份日志
missingok # 如果日志文件不存在,不报错
notifempty # 如果日志文件为空,不分割
compress # 压缩旧的日志文件
delaycompress # 延迟压缩上一次日志分割的文件
postrotate # 在日志分割之后执行的脚本或命令
/usr/bin/somescript.sh
endscript
olddir /path/of/old # 旧日志位置
}
/path/of/your2.log {
...
}
$ ls /path/of/old
# 文件后缀数字越小,日志日期越新
lograge_staging.log.1 staging.log.1 staging.log.11.gz staging.log.13.gz staging.log.2.gz staging.log.4.gz staging.log.6.gz staging.log.8.gz
lograge_staging.log.2.gz staging.log.10.gz staging.log.12.gz staging.log.17.gz staging.log.3.gz staging.log.5.gz staging.log.7.gz staging.log.9.gz
每天执行日志分割
logrotate 即可每天进行日志分割,无需再使用 cron
使用 cron
$ sudo crontab -e
# 打开的文件中新增以下行,完事保存即可
# 每天午夜0点执行
0 0 * * * /usr/sbin/logrotate /etc/logrotate.d/yourconfig
# 第一个字段(分钟):取值范围为 0-59。
# 第二个字段(小时):取值范围为 0-23。
# 第三个字段(日期):取值范围为 1-31。
# 第四个字段(月份):取值范围为 1-12。
# 第五个字段(星期几):取值范围为 0-7(其中 0 和 7 都可以表示星期日)。