วิธีที่ดีที่สุดในการเปิดใช้งานการหมุนบันทึกในแอพการผลิต Ruby on Rails คืออะไร?
มันคือการใช้ logrotate บนเซิร์ฟเวอร์ที่โฮสต์หรือมีชุดตัวเลือกที่จะใช้เมื่อเริ่มต้นตัวบันทึกจากแอป
วิธีที่ดีที่สุดในการเปิดใช้งานการหมุนบันทึกในแอพการผลิต Ruby on Rails คืออะไร?
มันคือการใช้ logrotate บนเซิร์ฟเวอร์ที่โฮสต์หรือมีชุดตัวเลือกที่จะใช้เมื่อเริ่มต้นตัวบันทึกจากแอป
คำตอบ:
คุณสามารถกำหนดค่ารางเพื่อใช้เครื่องมือบันทึกระบบ
ตัวอย่างในconfig / สภาพแวดล้อม / production.rb
# Use a different logger for distributed setups
config.logger = SyslogLogger.new
ด้วยวิธีนี้คุณเข้าสู่ syslog และสามารถใช้เครื่องมือ 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
ตามความคิดเห็นที่แนะนำ
logrotate
โซลูชันนี่เป็นคำตอบของ @ amit-saxena ที่คุ้มค่า - แนะนำให้ใช้copytruncate
มากกว่าcreate
คำสั่ง
copytruncate
, create
ไม่มีผลดังนั้นคุณควรจะลบออกจากตัวอย่างของคุณ
su your_rails_user your_rails_group
กับเจ้าของและกลุ่มของไฟล์บันทึกของคุณ (เช่นกระบวนการ Rails / Passenger) หรือ logrotate (เวอร์ชั่นล่าสุด) อาจบ่นเกี่ยวกับการอนุญาต
หากคุณใช้ 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 หลีกเลี่ยงสิ่งนี้โดยเก็บไฟล์เดียวกับไฟล์ที่ใช้งานอยู่
logrotate --force $CONFIG_FILE
โดยระบุตำแหน่งไฟล์กำหนดค่าเพื่อเรียกใช้ด้วยตนเอง
สำหรับ 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
config.paths['log'].first
ฉันใส่Rails.root.join('log', "#{Rails.env}.log")
config.logger = ActiveSupport::Logger.new(config.log_file, 1, 20*1024*1024)
50.megabytes
เหมือนกัน50 * 1024 * 1024
แต่เข้าใจได้ง่ายกว่า ดูActiveSupport ส่วนขยายหลักสำหรับรายละเอียดเพิ่มเติม
Rails.application.config.paths['log'].first
ส่งคืนไฟล์นี้อย่างแน่นอน
สำหรับRails 5หากคุณต้องการการหมุนเวียนบันทึกประจำวันคุณต้องการสิ่งนี้:
config.logger = ActiveSupport::Logger.new(config.paths['log'].first, shift_age = 'daily')
ตามเอกสารที่คุณสามารถใช้daily
, หรือweekly
monthly
สำหรับทุกบันทึก: บันทึกทางรถไฟ, บันทึก Rpush, ... คุณสามารถใช้ไฟล์นี้ในไฟล์ config ของบริการ:
config.log_file = 'log/rpush.log'
config.logger = ActiveSupport::Logger.new(config.log_file, 1, 20*1024*1024)
มันหมายถึง: บันทึกเพียง 1 ไฟล์บันทึกก่อนหน้าหลังจากแยก ขนาดบันทึกหลักไม่เกิน 20 MB
เปิดใช้งานเพื่อส่งบันทึกไปยัง 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