2009-10-19 27 views
15

Tôi có một lát 1GB từ slicehost và tôi có 4 dự án đang chạy trên hộp đó. Tất cả 4 ứng dụng đều là ứng dụng ruby ​​trên ray. Tôi đã tự hỏi cách tốt nhất để đảm bảo rằng các tệp nhật ký được xoay.Cách tốt nhất để xoay nhật ký cho ứng dụng đường ray

Tôi muốn có 4 tệp nhật ký khác nhau cho mỗi ứng dụng thay vì có một tệp nhật ký lớn cho tất cả 4 ứng dụng.

Tôi đang chạy ubuntu.

Tôi đang chạy hành khách.

+0

Có thể trùng lặp [Xoay vòng bản ghi sản xuất Ruby on Rails] (http://stackoverflow.com/questions/4883891/ruby-on-rails-production-log-rotation) – tirdadc

Trả lời

15

Tôi cũng sử dụng logrotate (bạn sẽ phải cài đặt qua apt-get). Tạo một tệp logrotate mới trong thư mục /etc/logrotate.d/ của bạn. Dưới đây là ví dụ về một trong số của tôi:

# for the rails logs 
/home/apps/*/shared/log/*log { 
    daily 
    rotate 14 
    notifempty 
    missingok 
    compress 
    sharedscripts 
    postrotate 
    /usr/bin/touch /home/apps/application1/current/tmp/restart.txt 
    /usr/bin/touch /home/apps/application2/current/tmp/restart.txt 
    endscript 
} 
# for the apache logs 
/home/apps/logs/*log { 
    daily 
    rotate 14 
    notifempty 
    missingok 
    compress 
    sharedscripts 
    postrotate 
    /etc/init.d/apache2 restart 
    endscript 
} 

Điều này quay cả nhật ký production.log và nhật ký truy cập/lỗi (tôi chạy ứng dụng dưới hành khách).

+0

Cảm ơn bạn đã cung cấp một ví dụ, tôi nghĩ điều đó rất hữu ích. Tại sao bạn khởi động lại ứng dụng của mình sau khi xoay nhật ký? –

+1

Nếu bạn không khởi động lại ứng dụng (hoặc apache cho vấn đề đó), bạn sẽ gặp sự cố với nhật ký không phụ thêm nữa. Tôi có thể sai, nhưng tôi biết đây là một vấn đề trong quá khứ. –

+1

Nếu bạn thêm một tùy chọn copytruncate, thao tác này sẽ sao chép prod.log của bạn thành prod.log.0 và sau đó sẽ cắt bớt prod.log, để nguyên bộ mô tả tệp còn nguyên vẹn và bạn sẽ không phải khởi động lại ứng dụng. Mặc dù vậy, tùy chọn copytruncate có thể mất một chút dữ liệu nhật ký khi xoay các tệp. – Kamilski81

3

Đây là chương trình siêu lập trình và liệu nó có phải trên ServerFault hay SO là gây tranh cãi.

logrotate, gói chuẩn cho một số hệ điều hành và bạn có thể apt-get install logrotate để tải xuống nếu bạn chưa có. Nó có thể được ép buộc để xoay bất kỳ nhật ký nào bạn muốn, sử dụng bất kỳ lịch biểu nào bạn muốn, và với các chính sách khác nhau la la "gzip 7 ngày sau đó rm" cho mỗi tệp.

Điều tra /etc/logrotate.d.

+2

FWIW, nó có vẻ như hoàn toàn hợp lệ chủ đề chương trình với tôi. Tôi có xu hướng nghĩ về SO như là cho lập trình viên và không chỉ lập trình. –

+0

Bạn có xu hướng suy nghĩ về những gì mà Câu hỏi thường gặp nêu ra. Điểm lấy, mặc dù. –

5

tôi chỉ sử dụng được xây dựng trong xoay được cung cấp bởi các đường ray logger:

# in config/application.rb 
config.logger = Logger.new(Rails.root.join('log', "#{Rails.env}.log"), 3, 10.megabytes) 

này sẽ luân phiên các file log một khi họ đạt 10MB và lưu các bản ghi 3 xoay gần đây nhất.

+2

Vấn đề duy nhất với việc sử dụng Logger thay vì BufferedLogger mặc định, khi tôi phát hiện ra một cách khó khăn, đó là nếu bạn đang sử dụng nhiều quy trình/luồng trong máy chủ ứng dụng của mình (Hành khách, Unicorn .. về cơ bản, ngoài Webrick) xen kẽ. – Duke

+0

Hmm, tôi đã thực hiện kiểm tra tải trọng nặng đối với Hành khách với một số quy trình viết một tin nhắn qua một số phương thức gọi tới một Logger đơn giản với tham số xoay và không thấy bất kỳ sự xen kẽ nào. Tôi sẽ theo dõi điều này ngay bây giờ. –

+0

Trong khi tôi chưa thấy thư bị hỏng và xen kẽ, tôi thấy nhật ký được xoay trước khi đạt đến 10M khi hệ thống đang được tải và toàn bộ thư bị hỏng. –

2

Đây là quy trình cài đặt capistrano của tôi. Tôi sao chép tệp này vào tệp triển khai và chỉ chạy nó khi tôi tạo môi trường máy chủ cho ứng dụng hoặc nếu có bất kỳ thay đổi nào đối với cấu hình logrotate.

namespace :setup do 
    task :install_logrotation, :roles => :app do 
    logrotate = <<-BASH 
     #{shared_path}/log/*.log { 
     daily 
     missingok 
     rotate 30 
     compress 
     size 5M 
     delaycompress 
     sharedscripts 
     postrotate 
      #{signal_unicorn("USR1")} 
     endscript 
     } 
    BASH 
    tmpfile = "/tmp/#{application}.logrotate" 

    put(logrotate, tmpfile) 
    run "#{sudo} chown root:root #{tmpfile} && #{sudo} mv -f #{tmpfile} /etc/logrotate.d/#{application}" 
    end 
end 

(Oh, và signal_unicorn chỉ làm một "# {} sudo giết -s # {signal} cat #{unicorn_pid}";. USR1 nói với nó để tải lại tất cả các file của nó vì vậy nó sẽ gắn vào file log mới)

Hãy vui vẻ!

2

Gần đây chúng tôi đã phải giải quyết vấn đề này và nhận ra rằng logrotate là không phải là giải pháp tốt nhất. Sử dụng nó đòi hỏi bạn phải khởi động lại ứng dụng đường ray mỗi khi các bản ghi được xoay, mà có vẻ như một hit hiệu suất không cần thiết.

Giải pháp tốt hơn là ghi đè trình ghi nhật ký đường ray mặc định trong (các) tệp cấu hình của ứng dụng.

# in config/environments/development.rb 
config.logger = Logger.new("#{Rails.env}.log", "daily") 

và sau đó sử dụng tập lệnh làm sạch tệp cũ hơn n ngày. Bạn có thể sử dụng logrotate cho phần này nếu bạn muốn.Chúng tôi sử dụng một nhiệm vụ cào như,

desc "Cleanup application logs older than 30 days" 
task :logs => :environment do 
    require 'fileutils' 
    Dir.glob("#{Rails.root}/log/*.log.*"). 
    select{|f| File.mtime(f) < (Time.now - (60*60*24*30)) }. # older than 30 days 
    each { |f| 
     puts "Removing #{f}" 
     FileUtils.rm f 
    } 
end 
+4

'logrotate'' copytruncate' tùy chọn cho phép cắt tại chỗ của tệp nhật ký gốc, do đó đảm bảo rằng máy chủ đường ray có thể tiếp tục ghi vào nhật ký khi nhật ký được xoay. Vì vậy, nó không phải là cần thiết để khởi động lại đường ray cho vòng quay đăng nhập. –

+0

có 'apachectl graceful' tạo ra hiệu suất đáng chú ý hay không? – timurb

+0

@Shyam Habarakada Chỉ cần xác nhận, tập lệnh này bạn sử dụng để dọn dẹp các nhật ký cũ hơn bạn đặt nó vào trong 'lib/tasks', phải không? – Lykos

0

Để tránh phải khởi động lại ứng dụng, như đã nói ở trên, bạn có thể sử dụng cấu hình logrotate hoàn chỉnh sau:

/etc/logrotate.d/rails

<path_to_rails_app>/log/*.log { 
    daily 
    size 100M 
    missingok 
    notifempty 
    rotate 4 
    compress 
    delaycompress 
    copytruncate 
    nodateext 
} 
Các vấn đề liên quan