Logging cho Rails app với PapertrailApp/Unicorn

fk5vT72

Khi xây dựng 1 Rails app và sẽ host bằng server Unicorn, ta cần cài đặt hệ thống log để có thể theo dõi diễn biến hoạt động của website trên production.

Basic 1

Development, ban đầu, cấu hình của Rails app sẽ như sau:

# config/environments/production.rb
...
config.logger = Logger.new(STDOUT)
...

Rails server sẽ log các msg ra STDOUT, tức là của nó xuống file log/production.log.

Trên Production, ta thường dùng unicorn vì thay vì rails s:

# config/unicorn.rb
...
stderr_path "#{current_directory}/log/unicorn.stderr.log"
stdout_path "#{current_directory}/log/unicorn.stdout.log"
...

Basic 2

Bên cạnh local log file, ta có thể dùng logging service như PapertrailApp, với ưu điểm là có thể truy cập qua browser mà ko cần truy cập vào server production.

Screen Shot 2015-04-10 at 6.24.15 pm

PapertrailApp có thể đc cấu hình dễ dàng:

# Gemfile
...
gem 'remote_syslog_logger'
...


# config/environments/production.rb
...
config.logger = RemoteSyslogLogger.new('logs2.papertrailapp.com', ENV['PAPERTRAIL_PORT'], :program => "Appname")
...

Advanced

Nhược điểm của cách làm trên:

  • Không lưu trữ log trên local, nhất là khi PapertrailApp hết quota
  • Khả năng tuỳ biến kém
  • Logger phụ thuộc vào app, cùng chạy trên Ruby

Một hệ thống logger tối ưu hơn sẽ khắc phục được các nhược điểm trên:

   APP ----> log files ----> remote_syslog ----> PapertrailApp

Như vậy, remote_syslog sẽ xử lý các file log và gửi cho PapertrailApp, không ảnh hưởng đến performance của Rails app và cung cấp nhiều tuỳ biến hơn.

Cài đặt remote_syslog (guide):

wget https://github.com/papertrail/remote_syslog2/releases/download/v0.13/remote_syslog_linux_amd64.tar.gz
tar xzf ./remote_syslog*.tar.gz
cd remote_syslog
sudo cp ./remote_syslog /usr/local/bin

Cấu hình remote_syslog:

# cat /etc/log_files.yml
files:
  - /home/rails/current/log/unicorn.stderr.log
  - /home/rails/current/log/unicorn.stdout.log
hostname: techlist.asia
destination:
  host: logs2.papertrailapp.com
  port: 12345
  protocol: tls
new_file_check_interval: "10"

Chạy và kiểm tra pid của remote_syslog:

sudo remote_syslog
ps auxww | grep remote_syslog
strace -tt -s 500 -fp 1234

Kiểm tra trong strace nếu có báo connection timeout thì có lẽ kết nối bị chặn bởi Firewall, cần mở cổng 514. Ngoài ra, ta có thể tạo thêm init.d để stop/start/restart remote_syslog dễ dàng hơn (link)

Đặt lại cấu hình logger để log ra STDOUT:

# config/environments/production.rb
...
config.logger = Logger.new(STDOUT)
...

Summary

Với cấu hình như trên, chúng ta vừa có thể xem đc log ở PapertrailApp, vừa tiếp tục lưu trữ log ngay trên máy. Một ưu điểm quan trọng khác là ta có thể gộp nhiều log files lại để đưa lên PapertrailApp, chẳng hạn như cron log, sidekiq log, v.v.