如何旋转我的Rails 5日志?

时间:2017-10-31 21:16:30

标签: ruby-on-rails linux logging ruby-on-rails-5 logrotate

我在Ubuntu 14.04上运行Rails 5。有没有办法在不依赖Linux logrotate系统的情况下轮换我的日志?我有这个设置......

myuser@myapp:~$ cat /etc/logrotate.d/myapp
/home/rails/myapp/log/*.log {
  daily
  missingok
  rotate 2
  compress
  delaycompress
  notifempty
  copytruncate
}

但我的日志永远不会旋转。看他们有多臃肿......

myuser@myapp:~$ ls -al /home/rails/myapp/log/
total 3958356
drwxr-xr-x  2 rails rails       4096 Jul  3 22:31 .
drwxr-xr-x 15 rails rails       4096 Sep 21 17:21 ..
-rw-rw-r--  1 rails rails          0 Jun 22 10:22 development.log
-rw-rw-r--  1 rails rails      14960 Jun  1 22:39 development.log.1
-rw-rw-r--  1 rails rails          0 Oct 22  2016 .keep
-rw-r--r--  1 rails rails  198362787 Oct 31 16:28 production.log
-rw-r--r--  1 rails rails    8615654 Jul  3 22:31 production.log.1
-rw-r--r--  1 rails rails  640621243 Jun 29 13:16 production.log.2.gz
-rw-rw-r--  1 rails rails 2856792698 Oct 31 17:12 sidekiq.log
-rw-rw-r--  1 rails rails  348853619 Jul  3 22:31 sidekiq.log.1
-rw-rw-r--  1 rails rails          0 Jul  3 22:31 test.log
-rw-rw-r--  1 rails rails      54246 Jul  3 22:31 test.log.1

是否有另一种方法可以让日志轮换,还是有办法修复我已包含的配置?

编辑:以下是设置的cron脚本

myuser@myapp:~$ cat /etc/cron.daily/logrotate
#!/bin/sh

# Clean non existent log file entries from status file
cd /var/lib/logrotate
test -e status || touch status
head -1 status > status.clean
sed 's/"//g' status | while read logfile date
do
    [ -e "$logfile" ] && echo "\"$logfile\" $date"
done >> status.clean
mv status.clean status

test -x /usr/sbin/logrotate || exit 0
/usr/sbin/logrotate /etc/logrotate.conf

编辑:根据评论,我尝试将其添加到我的config / environment / production.rb文件......

config.logger = ActiveSupport::Logger.new(config.paths['log'].first, 1, 50 * 1024 * 1024)

但是日志变得越来越大而没有被轮换。

3 个答案:

答案 0 :(得分:8)

通过遵循12因素方法(Treat logs as event streams),你可以"应该"将此任务委托给主管。

例如,通过使用immortal,它将为您完成所有轮换过程,而不依赖于操作系统。

基本配置文件(run.yml)可能如下所示:

cmd: bundle exec unicorn -c unicorn.rb
cwd: /arena/app-1
env:
    DEBUG: 1
    ENVIRONMENT: production
log:
    file: /var/log/app-1.log
    age: 86400 # seconds
    num: 7     # int
    size: 1    # MegaBytes
    timestamp: true # will add timesamp to log

如果你想拆分日志stderr & stdout,可以使用它:

cmd: bundle exec unicorn -c unicorn.rb
cwd: /arena/app-1
env:
    DEBUG: 1
    ENVIRONMENT: production
log:
  file: /var/log/app.log
  age: 86400 # seconds
  num: 7     # int
  size: 1    # MegaBytes
stderr:
  file: /var/log/app-error.log
  age: 86400 # seconds
  num: 7     # int
  size: 1    # MegaBytes
  timestamp: true # will add timesamp to log

作为旁注,来自12-factor site

  

十二因素应用程序进程永远不应该守护或写入PID文件。相反,依靠操作系统的进程管理器来管理输出流,响应崩溃的进程,并处理用户启动的重启和关闭。

[免责声明:我是immortal]的作者,其背后的一个想法确实是大规模覆盖应用程序的自动化,而无需担心日志不正确时填满磁盘通过仅修改run.yml文件而不需要root权限,以最简单的方式部署(启动/重启)旋转。

答案 1 :(得分:1)

推荐使用STDOUT进行应用日志记录是一个糟糕的主意。当不欢迎使用UNIX守护程序时,十二因子应用程序高度专注于基于容器的部署,您不应该原样购买。

标准输出没有结构,只是一个纯文本接口。尽管这对于UNIX多进程通信非常有意义,但是对于日志记录却很糟糕。唯一正确的日志记录界面始终是 syslog 系统日志。我们的Rails应用程序同时利用了两者的优势,您可以使用STDOUT(针对开发人员环境),系统日志进行配置,也可以通过日志记录进行结构化日志记录。

这样,您可以将请求,会话或相关性ID之类的内容与所有消息一起嵌入。日志可以轻松地通过电线发送到日志服务器。如果使用此方法,则日志文件轮换完全没有问题。最后,您可以与诸如ElasticSearch(或ELK堆栈)之类的中央日志记录解决方案集成,以进行进一步的数据分析。

实际上,这需要一些工作,但是不幸的是,Rails开发人员对此非常抱负-他们使用超级简单且不灵活的Ruby记录器,他们还将输入参数发送到INFO级别日志,并拒绝使其成为可配置选项(某些API在我们的应用中有大量输入,因此会泛滥日志)。但这就是它-您可以在应用程序中覆盖它,并为Rails提供适当的日志记录堆栈。我们的解决方案:

答案 2 :(得分:1)

您可以使用ruby Logger类和shift_age方法来选择轮换频率:每天,每周或每月。

shift_age: 要保留的旧日志文件数或轮换频率(每天,每周或每月)。 默认值为0,将禁用日志文件轮换。

https://ruby-doc.org/stdlib-2.4.0/libdoc/logger/rdoc/Logger.html#method-c-new

要在Rails中使用它,您可以在config/application.rb中插入以下行:

config.logger = ActiveSupport::Logger.new("log/#{Rails.env}.log", shift_age = 'daily')

注意:今天的日志没有任何日期,只有明天(如果每天轮换),旧日志将被“轮换”,并将日期附加到文件名之后。