我在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)
但是日志变得越来越大而没有被轮换。
答案 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')
注意:今天的日志没有任何日期,只有明天(如果每天轮换),旧日志将被“轮换”,并将日期附加到文件名之后。