Xoay vòng nhật ký sản xuất Ruby on Rails


172

Cách tốt nhất để kích hoạt xoay vòng nhật ký trên ứng dụng sản xuất Ruby on Rails là gì?

Có phải bằng cách sử dụng logrotate trên máy chủ lưu trữ hoặc có một tập hợp các tùy chọn để sử dụng khi khởi tạo logger từ ứng dụng không?


Tôi thấy rằng đã có một câu trả lời về điều này, nhưng tôi muốn hỏi môi trường của bạn là gì. Bản thân tôi sử dụng phương pháp syslog + logrotate, nhưng rõ ràng là loại môi trường (dù là dành riêng, được chia sẻ; loại * ix OS nào đang lưu trữ, hoặc là một loại khác, v.v.) sẽ có một số ảnh hưởng ở đây.
ylluminate

Câu trả lời:


203

Tùy chọn 1: syslog + logrotate

Bạn có thể cấu hình đường ray, để sử dụng các công cụ nhật ký hệ thống.

Một ví dụ trong config / môi trường / production.rb .

# Use a different logger for distributed setups
config.logger = SyslogLogger.new

Bằng cách đó, bạn đăng nhập vào syslog và có thể sử dụng các công cụ logrotate mặc định để xoay vòng các bản ghi.

Tùy chọn 2: nhật ký Rails bình thường + logrotate

Một tùy chọn khác là chỉ cần cấu hình logrotate để chọn các bản ghi còn lại của đường ray. Trên Ubuntu và Debian, ví dụ, trong một tệp có tên /etc/logrotate.d/rails_example_com.

/path/to/rails.example.com/tmp/log/*.log {
    weekly
    missingok
    rotate 52
    compress
    delaycompress
    notifempty
    copytruncate
}

Theo đề xuất dưới đây, trong Rails, bạn nên sử dụng copytruncate, để tránh phải khởi động lại ứng dụng Rails.

Chỉnh sửa: đã xóa "sharedscripts / endcript" vì chúng không được sử dụng ở đây và gây ra sự cố theo nhận xét. Và loại bỏ create 640 root admtheo nhận xét đề nghị.


3
Để sử dụng logrotate, dòng "config.logger = SyslogLogger.new" trong cấu hình / môi trường / sản xuất.rb có nên được bình luận hay không?
robertwbradford

2
Nó vẫn nên được bình luận, để các tệp nhật ký được viết bằng (ví dụ): /var/www/myrailsapp/civerse/log/production.log
Luca Spiller

3
Nếu sử dụng logrotategiải pháp, câu trả lời của @ amit-saxena đáng giá - gợi ý sử dụng copytruncatetheo createchỉ thị.
Tom Harrison

3
Khi bạn sử dụng copytruncate, createkhông có tác dụng, vì vậy có lẽ bạn nên xóa nó khỏi ví dụ của mình
Michaël Witrant

3
Bạn cũng có thể phải thêm dòng su your_rails_user your_rails_groupvới chủ sở hữu và nhóm tệp nhật ký của mình (ví dụ: các tệp của quy trình Rails / Hành khách) hoặc (phiên bản gần đây của?) Logrotate có thể khiếu nại về quyền.
oseiskar

56

Nếu bạn đang sử dụng logrotate thì bạn có thể chọn một trong các tùy chọn hiển thị bên dưới bằng cách đặt tệp conf trong thư mục /etc/logrotate.d/.

# Rotate Rails application logs based on file size
# Rotate log if file greater than 20 MB
/path/to/your/rails/applicaton/log/*.log {
    size=20M
    missingok
    rotate 52
    compress
    delaycompress
    notifempty
    copytruncate
}

Hoặc là

# Rotate Rails application logs weekly
/path/to/your/rails/applicaton/log/*.log {
  weekly
  missingok
  rotate 52
  compress
  delaycompress
  notifempty
  copytruncate
}

Xin lưu ý rằng copytruncate tạo một bản sao lưu của nhật ký hiện tại và sau đó xóa tệp nhật ký để tiếp tục viết. Cách khác là sử dụng tạo sẽ thực hiện xoay vòng bằng cách đổi tên tệp hiện tại và sau đó tạo tệp nhật ký mới có cùng tên với tệp cũ. Tôi thực sự khuyên bạn nên sử dụng copytruncate trừ khi bạn biết rằng bạn cần tạo. Lý do tại sao Rails vẫn có thể tiếp tục trỏ đến tệp nhật ký cũ mặc dù tên của nó đã thay đổi và họ có thể yêu cầu khởi động lại để xác định vị trí tệp nhật ký mới. copytruncate tránh điều này bằng cách giữ cùng một tệp với tệp đang hoạt động.


Nhưng tôi không nên khởi động lại đường ray mỗi lần chạy logrotate?
lzap

2
Cắt bớt tệp nhật ký gốc tại chỗ sau khi tạo một bản sao, thay vì di chuyển tệp nhật ký cũ và tùy ý tạo một tệp nhật ký mới, Nó có thể được sử dụng khi một số chương trình không thể được yêu cầu đóng tệp logfile của nó và do đó có thể tiếp tục ghi (nối thêm) vào tệp nhật ký trước đó mãi mãi. Lưu ý rằng có một lát cắt thời gian rất nhỏ giữa việc sao chép tệp và cắt bớt tệp, vì vậy một số dữ liệu đăng nhập có thể bị mất. Khi tùy chọn này được sử dụng, tùy chọn tạo sẽ không có hiệu lực, vì tệp nhật ký cũ vẫn giữ nguyên vị trí.
lzap

1
Bạn không cần phải khởi động lại đường ray nếu bạn đang sử dụng copytruncate vì nó vẫn trỏ đến cùng một tệp nhật ký.
amit_saxena

Có cấu hình yêu cầu bạn phải nêu khi nào để xoay các bản ghi? chẳng hạn như "hàng tuần" hoặc "kích thước = 20M"? Hoặc bạn có thể bỏ qua điều đó, trong trường hợp bạn chỉ muốn chạy logrotate bằng tay?
Damainman

1
Tôi không chắc chắn nếu tôi hiểu chính xác câu hỏi của bạn, nhưng bạn cần chỉ định một tiêu chí cho xoay vòng nhật ký tự động. Nếu bạn không muốn nó tự động, đừng đặt tệp vào thư mục /etc/logrotate.d/, hãy giữ nó ở một nơi khác. Sau đó, bạn có thể chạy logrotate --force $CONFIG_FILEbằng cách chỉ định vị trí tệp cấu hình để chạy thủ công.
amit_saxena

31

Đối với Rails 5, đây là điều tôi phải làm để giới hạn kích thước nhật ký và không thay đổi đầu ra máy chủ trong bảng điều khiển:

Theo tài liệu , nếu bạn muốn giới hạn kích thước của thư mục nhật ký, hãy đặt tệp này vào tệp môi trường của bạn ('Development.rb' / 'sản xuất.rb').

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

Với điều này, các tệp nhật ký của bạn sẽ không bao giờ phát triển lớn hơn 50Mb. Bạn có thể thay đổi kích thước theo sở thích của riêng bạn. '1' trong tham số thứ hai có nghĩa là 1 tệp nhật ký lịch sử sẽ được lưu giữ, do đó bạn sẽ có tới 100Mb nhật ký - nhật ký hiện tại và đoạn trước là 50Mb.

Nguồn cho giải pháp này .


2
Đối số đầu tiên là tên tệp, nói một cách đơn giản, tức là 'log / Development.log'. Vì vậy, tôi muốn cách lâu hơn, nhưng minh bạch. Thay vì config.paths['log'].firsttôi đặtRails.root.join('log', "#{Rails.env}.log")
Mikhail Chuprynski

1
@ZiaUlRehmanMughal Có, nó hoạt động với Rails 4. Tôi đang sử dụng Rails 4.2.3, với cấu hình như thế này: config.logger = ActiveSupport::Logger.new(config.log_file, 1, 20*1024*1024)
ThiênSuBS

1
Để làm cho điều này dễ đọc hơn, điều đáng nói là bạn có thể dựa vào các phần mở rộng byte ActiveSupport: 50.megabytesgiống như 50 * 1024 * 1024, nhưng dễ hiểu hơn nhiều. Xem phần mở rộng lõi ActiveSupport để biết thêm chi tiết.
Pierre-Adrien Buisson

1
Đến đây một lần nữa sau khi một số googling (cuộc sống lập trình viên: D). Tôi đã tự hỏi nếu chúng ta có thể cấu hình dòng này để xoay tất cả các tệp nhật ký trong thư mục nhật ký? Rõ ràng dòng này sẽ chỉ xoay dòng đầu tiên.
Zia Ul Rehman Mughal

Lưu ý rằng điều này sẽ chỉ xoay bạn tệp log / Rails.application.config.paths['log'].first
produc.log

5

Đối với Rails 5 , nếu bạn muốn xoay vòng nhật ký hàng ngày, bạn chỉ cần điều này:

  config.logger = ActiveSupport::Logger.new(config.paths['log'].first, shift_age = 'daily')

Theo tài liệu , bạn có thể sử dụng daily, weeklyhoặc monthly.


2

Đối với mỗi nhật ký: Nhật ký Rails, Nhật ký Rpush, ... Bạn có thể sử dụng như thế này trong tệp cấu hình dịch vụ của mình:

 config.log_file = 'log/rpush.log'
 config.logger = ActiveSupport::Logger.new(config.log_file, 1, 20*1024*1024)

Nó có nghĩa là: chỉ lưu 1 tệp nhật ký trước khi chia. Kích thước nhật ký chính không bao giờ quá 20 MB.


-9

Cho phép gửi nhật ký tới loggly bằng cách sử dụng rails logglier như sau trong tệp môi trường / sản xuất của tôi. phiên bản đường ray là 4.1.0

RailsApplication::Application.configure do
require 'logglier'
config.logger = Logglier.new(<https://logs-01.loggly.com/inputs/inputkey>)
log.info("hello from logglier")
end

Vui lòng gợi ý cho tôi vài thứ cần làm ... mã này không hoạt động
riya khana

Phiên bản Rails là 4.1.0 và phiên bản của Ruby là 2.1.1
riya khana
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.