แนวทางปฏิบัติที่ดีที่สุดสำหรับการใช้ Markers ใน SLF4J / Logback


128

เราใช้ชุดค่าผสม SLF4J + Logback ที่โปรเจ็กต์ของเรามาระยะหนึ่งแล้วและค่อนข้างพอใจกับมัน แต่กลยุทธ์การบันทึกของเราค่อนข้างง่ายโดยใช้คนตัดไม้ตามคลาสที่ตรงไปตรงมาและไม่มีของแปลก ๆ เช่น MDC หรือ Markers

สิ่งที่ฉันอยากรู้คือมีใครในชุมชนใช้คุณสมบัติเหล่านี้จริงหรือไม่และจะใช้เพื่อปรับปรุงการบันทึก / การกรองอย่างไร

ฉันสนใจเป็นพิเศษว่าจะใช้[1]เครื่องหมายสำหรับการบันทึกได้อย่างไร พวกเขาโจมตีฉันว่าเป็นคุณลักษณะที่ค่อนข้างเรียบร้อยสำหรับการเพิ่มบริบททางความหมายลงในการบันทึกเช่นในขณะที่ชั้นเรียนอาจจัดการกับข้อกังวลหลายประการเราอาจใช้เครื่องหมายงาน / ข้อกังวลเฉพาะเพื่อแยกแยะข้อความบันทึก

อะไรคือแนวทางปฏิบัติที่ดีที่สุดอนุสัญญาหรือกลยุทธ์ในการสร้างและใช้เครื่องหมายในการบันทึก

ปรับปรุง:ผมคิดว่าสิ่งที่ผมรู้สึกหลังจากที่เป็นไม่มากทำไมการใช้เครื่องหมาย แต่เป็นวิธีการที่ส่วนหนึ่ง - จะมีแนวทางปฏิบัติที่ดีของตัวบ่งชี้การตั้งชื่อ (เช่นการใช้ข้อความธรรมดาที่มีช่องว่างหรือขีด / ขีด / เครื่องหมายวรรคตอนคั่นคำหลักชื่อลักษณะ ) ควรมีกลุ่ม "ชื่อมาตรฐาน" ประเภทหนึ่งซึ่งตั้งชื่อตามหน้าที่ทางธุรกิจ คำถามที่ฉันสามารถหาได้ด้วยตัวเอง แต่ถ้าฉันต้องการใช้คุณสมบัติเหล่านี้อย่างเป็นระบบและแนะนำให้รู้จักกับทีมนักพัฒนาก็ควรมีแนวทางที่เป็นทางการเกี่ยวกับ ...


[1] - โดยการถามถึงวิธีใช้เครื่องหมายฉันไม่ได้ถามถึงวิธีใช้ API จริงๆ (มันค่อนข้างตรงไปตรงมา) - ฉันค่อนข้างจะอ้างถึงระดับทั่วไปของวิธีตั้งค่าการบันทึกโดยใช้เครื่องหมายอย่างสม่ำเสมอ

คำตอบ:


98

ก่อนอื่นตามที่ @darioo กล่าวไว้:

  • MDC ใช้สำหรับเชื่อมโยงหลายเหตุการณ์กับ "เอนทิตี" เพียงไม่กี่รายการ
  • [Markers] ใช้สำหรับกิจกรรม "พิเศษ" ที่คุณต้องการกรองออกจากกิจกรรมปกติ

ดังนั้นการยืนยันว่าคุณต้องการใช้ MDC สำหรับสิ่งนี้ เครื่องหมายมีไว้เพื่อเน้นเหตุการณ์ "พิเศษ" - การกรองหากคุณต้องการ - แทนที่จะเป็น "การแบ่งส่วน" ตัวอย่างเช่นคุณอาจแบ่งตามผู้ใช้บางราย แต่กรองตามข้อยกเว้นที่ไม่คาดคิด ในกรณีนี้คุณจะต้องสร้างมิติข้อมูลผู้ใช้ MDC และเครื่องหมายที่ไม่คาดคิด Exception


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

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

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

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

เท่าที่จะตัดสินใจเกี่ยวกับนโยบายนี้ก็หมายถึงการกำหนดในกรณีที่ได้รับเครื่องหมายหรือ MDC มิติความต้องการที่จะได้รับการว่าจ้าง รักษาสิ่งนี้ให้แน่น (รวมศูนย์โดยเจตนา) แต่อนุญาตให้มีข้อเสนอแนะจากนักพัฒนาหากพวกเขารู้สึกว่าชุดมิติข้อมูลและเครื่องหมายไม่เพียงพอสำหรับงานที่ทำอยู่ แก้ไข / เพิ่มมิติข้อมูลและ / หรือคุณลักษณะตามความเหมาะสม

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


7
คำตอบที่ดี ฉันขอยืนยันว่า MDC ซึ่งเป็นโครงสร้างข้อมูลตามเธรดสามารถใช้ในการกรองได้เช่นกัน
Ceki

คำตอบที่ดี แต่ESL Employeeคืออะไร?
DerMike

ขอบคุณ. ภาษาอังกฤษเป็นภาษาที่สอง.
user359996

76

ก่อน MDC.

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

...[Sandy][abcd] clicked on "change profile"
...[Joe][1234] clicked on "weather reports"
...[Joe][1234] clicked on "Europe"
...[Sandy][abcd] clicked on "logout"
...[Joe][1234] clicked on "logout"
...[Sandy][efgh] logged in

ที่นี่คุณใช้ MDC ในสองที่: สำหรับชื่อผู้ใช้และสำหรับรหัสเซสชัน ด้วยวิธีนี้คุณสามารถ grep เซสชันของผู้ใช้คนหนึ่งได้อย่างง่ายดายเพื่อดูทุกสิ่งที่พวกเขาทำ

ประการที่สองเครื่องหมาย

โดยปกติแล้วเครื่องหมายจะใช้สำหรับสถานการณ์ "พิเศษ" เช่นการส่งอีเมลไปยังผู้ดูแลระบบสำหรับข้อผิดพลาดร้ายแรงบางประการ ข้อผิดพลาดทั้งหมดไม่ได้อยู่ในหมวดหมู่เดียวกันเสมอไป บางอย่างต้องจัดการด้วยวิธีที่เหมาะสม

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

หลักการง่ายๆ:

  • MDC ใช้สำหรับเชื่อมโยงหลายเหตุการณ์กับ "เอนทิตี" เพียงไม่กี่รายการ
  • เครื่องหมายใช้สำหรับกิจกรรม "พิเศษ" ที่คุณต้องการกรองออกจากกิจกรรมปกติ

3
นี่เป็นคำตอบที่ดี แต่ครอบคลุมเฉพาะกรณีการใช้งานที่เป็นไปได้สำหรับการใช้เครื่องหมายเท่านั้น วิธีที่ฉันเห็นนี้มีคุณสมบัติการบันทึกเฟรมเวิร์ก (เช่น MDC และ Markers) เพื่อให้ข้อมูลเมตาเพิ่มเติมสำหรับการแบ่งส่วนและการแบ่งส่วนบันทึกในภายหลัง (เช่นอีเมลผู้ดูแลระบบหรือกรณีการบันทึกแยกต่างหากที่คุณกล่าวถึง) สิ่งที่ฉันคิดว่าหลังจากนั้นคือวิธีการสร้างเครื่องหมาย (ควรมี "สระมาตรฐาน" ของเครื่องหมายมีรูปแบบการตั้งชื่อที่ควรคำนึงถึงหรือไม่ ฯลฯ )
Roland Tepp

3
@Roland: ฉันได้เพิ่มตัวอย่างบางส่วนแล้ว แต่ฉันไม่สามารถเพิ่มตัวอย่างทั้งหมดได้เนื่องจากเป็นไปตามคำจำกัดความไม่ จำกัด หากคุณเข้าใจแรงจูงใจและเหตุผลของเครื่องหมายการใช้สิ่งเหล่านี้จะถูก จำกัด ด้วยจินตนาการและสามัญสำนึกของคุณ
darioo

32

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

  1. ทริกเกอร์ : ผู้ตรวจสอบบางคนอาจได้รับคำสั่งให้ดำเนินการต่อหน้าเครื่องหมายบางอย่าง ตัวอย่างเช่นSMTPAppenderสามารถกำหนดค่าให้ส่งอีเมลเมื่อใดก็ตามที่เหตุการณ์การบันทึกถูกทำเครื่องหมายด้วยNOTIFY_ADMINเครื่องหมายโดยไม่คำนึงถึงระดับการบันทึก ดูการทริกเกอร์โดยใช้เครื่องหมายในเอกสารการบันทึกการย้อนกลับ คุณยังรวมระดับการบันทึกและเครื่องหมายสำหรับการทริกเกอร์ได้ด้วย

  2. การกรอง : คุณสามารถใช้สี / ทำเครื่องหมายบันทึกที่เกี่ยวข้องกับการคงอยู่ทั้งหมดของคุณ (ในไฟล์คลาสต่างๆและหลายไฟล์) ด้วยสี "DB" จากนั้นคุณสามารถกรอง "DB": ปิดใช้งานการบันทึกยกเว้นคำสั่งบันทึกที่มี DB ดูบทเกี่ยวกับตัวกรองในเอกสารการบันทึกย้อนกลับสำหรับข้อมูลเพิ่มเติม (ค้นหา MarkerFilter)


11

เช่นเดียวกับภาคผนวกหากคุณใช้ logstash และเปิดใช้งานการบันทึก json ไว้อาจมีการใช้ Marker อื่น ๆ - สำหรับตัวแปรการบันทึกเพื่อเชื่อมโยงกับข้อความบันทึกเฉพาะ ซึ่งมีความสม่ำเสมอและง่ายต่อการแยกวิเคราะห์มากกว่าการรวมไว้ในเนื้อหาข้อความ มีประโยชน์มากหากเหมาะกับการใช้งานของคุณ

ดูรายละเอียดที่นี่:

https://github.com/logstash/logstash-logback-encoder#loggingevent_custom_event

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