Ruby on Rails การหมุนบันทึกการผลิต


172

วิธีที่ดีที่สุดในการเปิดใช้งานการหมุนบันทึกในแอพการผลิต Ruby on Rails คืออะไร?

มันคือการใช้ logrotate บนเซิร์ฟเวอร์ที่โฮสต์หรือมีชุดตัวเลือกที่จะใช้เมื่อเริ่มต้นตัวบันทึกจากแอป


ฉันเห็นว่ามีคำตอบอยู่แล้ว แต่ฉันอยากถามว่าสภาพแวดล้อมของคุณคืออะไร ฉันใช้วิธี syslog + logrotate ด้วยตัวเอง แต่เห็นได้ชัดว่าเป็นประเภทของสภาพแวดล้อม (ไม่ว่าจะเป็นการแบ่งสรรใช้ร่วมกันประเภทใด * ix OS ที่โฮสต์อยู่หรืออื่น ๆ ) จะมีผลกระทบบางอย่างที่นี่
ylluminate

คำตอบ:


203

ตัวเลือกที่ 1: syslog + logrotate

คุณสามารถกำหนดค่ารางเพื่อใช้เครื่องมือบันทึกระบบ

ตัวอย่างในconfig / สภาพแวดล้อม / production.rb

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

ด้วยวิธีนี้คุณเข้าสู่ syslog และสามารถใช้เครื่องมือ logrotate เริ่มต้นเพื่อหมุนบันทึก

ตัวเลือกที่ 2: บันทึก Rails + logrotate ปกติ

อีกทางเลือกหนึ่งคือกำหนดค่า logrotate เพื่อรับบันทึกที่เหลือโดยราง บน Ubuntu และ Debian /etc/logrotate.d/rails_example_comว่าจะเป็นตัวอย่างเช่นในไฟล์ที่เรียกว่า

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

ตามคำแนะนำด้านล่างใน Rails ขอแนะนำให้ใช้copytruncateเพื่อหลีกเลี่ยงการเริ่มต้นแอพใหม่ของ Rails

แก้ไข: ลบ "sharedscripts / endscript" ออกเนื่องจากไม่ได้ใช้ที่นี่และทำให้เกิดปัญหาตามความคิดเห็น และลบออกcreate 640 root admตามความคิดเห็นที่แนะนำ


3
เพื่อที่จะใช้ logrotate ควรบรรทัด "config.logger = SyslogLogger.new" ใน config / environment / production.rb ยังคงถูกใส่ความคิดเห็นหรือควรยกเลิกการใส่เครื่องหมาย?
robertwbradford

2
ควรมีการใส่ความคิดเห็นไว้เพื่อให้ไฟล์บันทึกถูกเขียนใน (ตัวอย่าง): /var/www/myrailsapp/current/log/production.log
Luca Spiller

3
หากใช้logrotateโซลูชันนี่เป็นคำตอบของ @ amit-saxena ที่คุ้มค่า - แนะนำให้ใช้copytruncateมากกว่าcreateคำสั่ง
ทอมแฮร์ริสัน

3
เมื่อคุณใช้copytruncate, createไม่มีผลดังนั้นคุณควรจะลบออกจากตัวอย่างของคุณ
Michaël Witrant

3
คุณอาจต้องเพิ่มบรรทัดsu your_rails_user your_rails_groupกับเจ้าของและกลุ่มของไฟล์บันทึกของคุณ (เช่นกระบวนการ Rails / Passenger) หรือ logrotate (เวอร์ชั่นล่าสุด) อาจบ่นเกี่ยวกับการอนุญาต
oseiskar

56

หากคุณใช้ logrotate คุณสามารถเลือกตัวเลือกใดตัวเลือกหนึ่งที่แสดงด้านล่างโดยวางไฟล์ conf ไว้ในไดเรกทอรี /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
}

หรือ

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

โปรดทราบว่าการคัดลอกทำสำเนาสำรองของบันทึกปัจจุบันแล้วล้างไฟล์บันทึกสำหรับการเขียนต่อไป ทางเลือกคือการใช้การสร้างซึ่งจะทำการหมุนโดยการเปลี่ยนชื่อไฟล์ปัจจุบันแล้วสร้างไฟล์บันทึกใหม่ที่มีชื่อเดียวกับไฟล์เก่า ฉันขอแนะนำอย่างยิ่งให้คุณใช้ copytruncate เว้นแต่คุณจะรู้ว่าคุณต้องสร้าง เหตุผลก็คือ Rails อาจยังคงชี้ไปที่ล็อกไฟล์เก่าแม้ว่าชื่อของมันจะเปลี่ยนไปและพวกเขาอาจต้องทำการรีสตาร์ทเพื่อค้นหาไฟล์บันทึกใหม่ copytruncate หลีกเลี่ยงสิ่งนี้โดยเก็บไฟล์เดียวกับไฟล์ที่ใช้งานอยู่


แต่ฉันไม่ควรรีสตาร์ท rails ทุกครั้ง
lzap

2
ตัดทอนไฟล์บันทึกดั้งเดิมหลังจากสร้างสำเนาแทนการย้ายไฟล์บันทึกเก่าและเลือกสร้างไฟล์ใหม่ซึ่งสามารถใช้เมื่อโปรแกรมบางโปรแกรมไม่สามารถบอกให้ปิดล็อกไฟล์และอาจเขียนต่อไป (ต่อท้าย) เพื่อ ไฟล์บันทึกก่อนหน้านี้ตลอดไป โปรดทราบว่ามีการแบ่งเวลาเล็กน้อยในการคัดลอกไฟล์และตัดทอนดังนั้นข้อมูลการบันทึกบางอย่างอาจสูญหาย เมื่อใช้ตัวเลือกนี้ตัวเลือกการสร้างจะไม่มีผลเนื่องจากไฟล์บันทึกเก่ายังคงอยู่
lzap

1
คุณไม่จำเป็นต้องรีสตาร์ทรางถ้าคุณใช้ copytruncate เพราะมันยังชี้ไปยังไฟล์บันทึกเดียวกัน
amit_saxena

การกำหนดค่าต้องการให้คุณระบุว่าจะหมุนบันทึกเมื่อใด เช่น "รายสัปดาห์" หรือ "ขนาด = 20M" หรือคุณละเว้นได้ในกรณีที่คุณต้องการรัน logrotate ด้วยตนเองเท่านั้น?
Damainman

1
ฉันไม่แน่ใจว่าฉันเข้าใจคำถามของคุณถูกต้องหรือไม่ แต่คุณต้องระบุเกณฑ์สำหรับการหมุนบันทึกอัตโนมัติ หากคุณไม่ต้องการให้เป็นแบบอัตโนมัติอย่าวางไฟล์ไว้ในไดเรกทอรี /etc/logrotate.d/ ให้เก็บไว้ที่อื่น จากนั้นคุณสามารถเรียกใช้logrotate --force $CONFIG_FILEโดยระบุตำแหน่งไฟล์กำหนดค่าเพื่อเรียกใช้ด้วยตนเอง
amit_saxena

31

สำหรับ Rails 5 นี่คือสิ่งที่ฉันต้องทำเพื่อ จำกัด ขนาดของบันทึกและไม่เปลี่ยนผลลัพธ์เซิร์ฟเวอร์ในคอนโซล:

ตามเอกสารประกอบหากคุณต้องการ จำกัด ขนาดของโฟลเดอร์บันทึกให้ใส่ไฟล์นี้ในไฟล์สภาพแวดล้อม ('development.rb' / 'production.rb')

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

ด้วยสิ่งนี้ไฟล์บันทึกของคุณจะไม่ใหญ่กว่า 50Mb คุณสามารถเปลี่ยนขนาดได้ตามความต้องการของคุณ '1' ในพารามิเตอร์ที่สองหมายความว่าไฟล์บันทึกประวัติ 1 ไฟล์จะถูกเก็บไว้ดังนั้นคุณจะมีบันทึกได้มากถึง 100Mb - บันทึกปัจจุบันและไฟล์บันทึกก่อนหน้า 50 MB

แหล่งที่มาของการแก้ปัญหานี้


2
อาร์กิวเมนต์แรกคือชื่อไฟล์เพียงแค่พูดคือ 'log / development.log' ฉันชอบอีกต่อไป แต่วิธีโปร่งใส แทนที่จะconfig.paths['log'].firstฉันใส่Rails.root.join('log', "#{Rails.env}.log")
มิคาอิล Chuprynski

1
@ZiaUlRehmanMughal ใช่มันใช้งานได้กับ Rails 4. ฉันใช้ Rails 4.2.3 ด้วย config ดังนี้: config.logger = ActiveSupport::Logger.new(config.log_file, 1, 20*1024*1024)
ThienSuBS

1
เพื่อให้การอ่านง่ายขึ้นคุณควรใช้ส่วนขยายไบต์ ActiveSupport: 50.megabytesเหมือนกัน50 * 1024 * 1024แต่เข้าใจได้ง่ายกว่า ดูActiveSupport ส่วนขยายหลักสำหรับรายละเอียดเพิ่มเติม
Pierre-Adrien Buisson

1
มาที่นี่อีกครั้งหลังจาก googling (โปรแกรมเมอร์ชีวิต: D) ฉันสงสัยว่าเราสามารถกำหนดค่าบรรทัดนี้เพื่อหมุนไฟล์บันทึกทั้งหมดในโฟลเดอร์บันทึกได้หรือไม่ เห็นได้ชัดว่าบรรทัดนี้จะหมุนบรรทัดแรกเท่านั้น
Zia Ul Rehman Mughal

โปรดทราบว่านี่จะหมุนเฉพาะไฟล์บันทึก / การผลิตล็อกเท่านั้นเมื่อRails.application.config.paths['log'].firstส่งคืนไฟล์นี้อย่างแน่นอน
valachi

5

สำหรับRails 5หากคุณต้องการการหมุนเวียนบันทึกประจำวันคุณต้องการสิ่งนี้:

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

ตามเอกสารที่คุณสามารถใช้daily, หรือweeklymonthly


2

สำหรับทุกบันทึก: บันทึกทางรถไฟ, บันทึก Rpush, ... คุณสามารถใช้ไฟล์นี้ในไฟล์ config ของบริการ:

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

มันหมายถึง: บันทึกเพียง 1 ไฟล์บันทึกก่อนหน้าหลังจากแยก ขนาดบันทึกหลักไม่เกิน 20 MB


-9

เปิดใช้งานเพื่อส่งบันทึกไปยัง loggly โดยใช้ Rails logglier ดังต่อไปนี้ในไฟล์ environment / production.rb ของฉัน เวอร์ชั่นรางคือ 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

กรุณาแนะนำฉันว่าจะทำอย่างไร ... รหัสนี้ใช้งานไม่ได้
riya khana

รุ่น Rails คือ 4.1.0 และรุ่น Ruby คือ 2.1.1
riya khana
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.