Rails: บันทึกการติดตามสแต็กทั้งหมดของข้อยกเว้น


110

ฉันพยายามหาวิธีที่ถูกต้องในการบันทึกการติดตามสแต็ก ฉันเจอลิงค์นี้ซึ่งระบุว่าlogger.error $ !, $ !. backtraceเป็นวิธีที่จะไป แต่มันไม่ได้ผลสำหรับฉันที่log_errorทำ ตามเอกสารประกอบฉันไม่เห็นว่าการส่งอาร์กิวเมนต์ที่สองไปยังเมธอดข้อผิดพลาดจะใช้ได้ผลอย่างไรเพราะคนตัดไม้ทับทิมที่รางใช้ยอมรับอาร์กิวเมนต์เดียวเท่านั้น

แปลก (หรืออาจจะไม่ใช่) ข้อโต้แย้งที่สองได้รับการยอมรับโดยไม่มีการร้องเรียนจากล่าม อย่างไรก็ตามสิ่งใดก็ตามที่ฉันผ่านไปมันถูกละเว้น

ใครสามารถอธิบายสิ่งที่ฉันขาดหายไป? มีความเข้าใจอย่างถ่องแท้ว่าอาร์กิวเมนต์ข้อผิดพลาดที่สองมีไว้เพื่ออะไรและกินอะไร

คำตอบ:


204

หากคุณดูซอร์สของคลาส BufferedLogger ใน ActiveSupport คุณจะเห็นว่าอาร์กิวเมนต์ที่สองคือ 'progname' สิ่งนี้จะใช้เฉพาะเมื่ออาร์กิวเมนต์แรกเป็นศูนย์และคุณไม่ได้กำหนดบล็อกหรือบล็อกส่งคืนค่าที่ไม่เป็นจริง

โดยพื้นฐานแล้วคุณไม่สามารถใช้พารามิเตอร์ที่สองเพื่อส่งออกข้อมูลเพิ่มเติมได้

สิ่งที่คุณต้องการทำมีลักษณะคล้ายกับ:

begin
  raise
rescue => e
  logger.error e.message
  logger.error e.backtrace.join("\n")
end

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

begin
  raise
rescue => e
  logger.error e.message
  e.backtrace.each { |line| logger.error line }
end

5
ฉันจะเข้าร่วมโดยใช้ "\ r \ n" เพื่อรักษาความเข้ากันได้ข้ามแพลตฟอร์ม
James Watkins

10
คุณจะไม่ใช้$/แทนเพื่อให้เข้ากันได้กับข้ามแพลตฟอร์ม? ปล่อยให้ Ruby ดูแลมันเพราะ\r\nเฉพาะบางแพลตฟอร์มเท่านั้น
vgoff

12
คุณอาจได้รับข้อความของคุณแยกและไม่สามารถอ่านได้เนื่องจากการโทรหาคนตัดไม้หลายครั้งไม่ปลอดภัยต่อเธรด ในขณะที่คนตัดไม้เองก็ปลอดภัย โดยปกติฉันจะเข้าร่วมข้อความของฉันเป็นสตริงเดียวจากนั้นบันทึก
Morozov

ในขณะที่คนตัดไม้ดูเหมือนจะไม่รองรับการขึ้นบรรทัดใหม่ในรายการบันทึกดังนั้นการแยก แต่ใช่คุณคิดถูกและคุณควรตระหนักถึงข้อ จำกัด ของแนวทางนี้
darkliquid

+1 @JackWatson คำตอบที่แปลกมากเพราะมันไม่ปลอดภัย สิ่งสำคัญเพราะเรากำลังพูดถึงเว็บแอปที่นี่
EvAlex

16

นี่คือคำตอบ

begin
  raise
rescue => e
  logger.error ([e.message]+e.backtrace).join($/)
end

9
เครื่องหมายวรรคตอนน้อย:Rails.logger.error [e.message, *e.backtrace].join($/)
artm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.