การบันทึกแนวทางปฏิบัติที่ดีที่สุด [ปิด]


323

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

กรอบ

คุณใช้กรอบอะไร

  • log4net
  • System.Diagnostics.Trace
  • System.Diagnostics.TraceSource
  • การบันทึกบล็อกแอปพลิเคชัน
  • อื่น ๆ ?

หากคุณใช้การติดตามคุณใช้ Trace.Correlation.StartLogicalOperation หรือไม่

คุณเขียนโค้ดนี้ด้วยตนเองหรือคุณใช้รูปแบบการเขียนโปรแกรมเชิงคุณภาพเพื่อทำมัน? ต้องการแบ่งปันข้อมูลโค้ดหรือไม่

คุณให้ความละเอียดในรูปแบบใด ๆ กับแหล่งที่มาของร่องรอย เช่น WPF TraceSources อนุญาตให้คุณกำหนดค่าในระดับต่างๆ:

  • System.Windows - การตั้งค่าสำหรับ WPF ทั้งหมด
  • System.Windows.Animation - แทนที่เฉพาะสำหรับ Animation

ฟัง

คุณใช้บันทึกผลลัพธ์ใด

  • ไฟล์ข้อความ
  • ไฟล์ XML
  • บันทึกเหตุการณ์
  • อื่น ๆ ?

หากใช้ไฟล์คุณใช้โรลลิ่งล็อกหรือเพียงไฟล์เดียว? คุณจะทำให้บันทึกพร้อมใช้งานเพื่อให้ผู้คนบริโภคได้อย่างไร

กำลังดู

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

  • Notepad
  • หาง
  • ผู้ชมเหตุการณ์
  • ผู้จัดการศูนย์ปฏิบัติการระบบ / ผู้จัดการปฏิบัติการ Microsoft
  • ตัวแสดงการติดตามบริการ WCF
  • อื่น ๆ ?

หากคุณกำลังสร้างโซลูชัน ASP.NET คุณยังใช้การตรวจสอบสถานะสุขภาพ ASP.NET หรือไม่ คุณรวมเอาท์พุทการติดตามในเหตุการณ์การตรวจสอบสุขภาพหรือไม่? สิ่งที่เกี่ยวกับ Trace.axd

แล้วเคาน์เตอร์วัดประสิทธิภาพแบบกำหนดเองล่ะ


3
มันจะมีประโยชน์ถ้าคนที่ปิดคำถามเช่นนี้ด้วย 300 upvotes สามารถแนะนำรูปแบบ wiki หรือโพสต์บน programmers.stackexchange หรือ Quora อื่นหากคำถามประเภทนี้ไม่เป็นที่ต้อนรับ เห็นได้ชัดว่าคำถามนี้สร้างสรรค์มากจริงๆมันไม่เหมาะกับเกณฑ์ที่ StackOverflow ต้องการ programmers.stackexchange.com/questions/57064/…มี 24 upvotes บางที StackOverflow หายไปบางอย่าง
Niall Connaughton

หากคำถามนี้ละเมิดรูปแบบคำถาม & คำตอบแสดงว่ามีบางสิ่งผิดพลาดในรูปแบบคำถาม & คำตอบและไม่ใช่คำถามนี้ บางครั้งการตัดสินใจว่าคำถามควรถูกปิดหรือไม่ควรเป็นฟังก์ชั่นของคำตอบที่ให้คำถามปลายเปิดบางคำถามเชิญอภิปราย
Matthias Wolf

1
คำถามนี้ - โดยเฉพาะคำตอบที่ดีที่สุด - อาจสร้างรากฐานที่ยอดเยี่ยมสำหรับโพสต์บล็อกหากมีคนต้องการใช้เป็นเช่นนี้ ... ตามวัตถุประสงค์ของคำถามมันไม่เหมาะจริงๆ - มันมีโครงสร้างอย่างชัดเจนว่าเป็นโพลสำรวจความคิดเห็น - แต่ มีข้อมูลที่ดีด้านล่างจึงล็อค
Shog9

คำตอบ:


232

อัปเดต:สำหรับส่วนขยายไปยัง System.Diagnostics ให้ผู้ฟังบางคนหายไปที่คุณอาจต้องการดู Essential.Diagnostics บน CodePlex ( http://essentialdiagnostics.codeplex.com/ )


กรอบ

ถาม: คุณใช้กรอบอะไร

A: System.Diagnostics.TraceSource สร้างขึ้นใน. NET 2.0

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

มีบางพื้นที่ที่ฟังก์ชันการทำงานเพิ่มเติมมีประโยชน์หรือบางครั้งมีฟังก์ชั่นการใช้งานอยู่ แต่ไม่ได้รับการบันทึกไว้อย่างดีอย่างไรก็ตามนี่ไม่ได้หมายความว่ากรอบการบันทึกทั้งหมด (ซึ่งถูกออกแบบมาให้ขยายได้) ควรถูกโยนทิ้งไป (NLog, log4net, Common.Logging และแม้กระทั่งการบันทึก EntLib)

แทนที่จะเปลี่ยนวิธีที่คุณเพิ่มคำสั่งการบันทึกลงในแอปพลิเคชันของคุณและคิดค้นวงล้อใหม่เพียงขยายกรอบงาน System.Diagnostics ในไม่กี่แห่งที่คุณต้องการ

ดูเหมือนว่าฉันจะกรอบอื่น ๆ แม้ EntLib เพียงแค่ประสบจากโรคที่ไม่ได้คิดค้นที่นี่และฉันคิดว่าพวกเขาได้สูญเสียเวลาอีกครั้งประดิษฐ์พื้นฐานที่ทำงานได้ดีอย่างสมบูรณ์ใน System.Diagnostics (เช่นวิธีที่คุณเขียนคำสั่งบันทึก) แทนที่จะเติมช่องว่างเล็กน้อยที่มีอยู่ ในระยะสั้นอย่าใช้พวกเขา - พวกเขาไม่ต้องการ

คุณสมบัติที่คุณอาจไม่รู้จัก:

  • การใช้ TraceEvent มากเกินไปที่ใช้สตริงรูปแบบและ args สามารถช่วยให้ประสิทธิภาพการทำงานเป็นพารามิเตอร์ที่ถูกเก็บไว้เป็นการอ้างอิงแยกต่างหากจนกว่าหลังจาก Filter.ShouldTrace () ได้สำเร็จ ซึ่งหมายความว่าจะไม่มีการเรียก ToString () ค่าพารามิเตอร์ที่มีราคาแพงจนกระทั่งหลังจากที่ระบบได้ยืนยันข้อความจะถูกบันทึกจริง
  • Trace.CorrelationManager ช่วยให้คุณสามารถเชื่อมโยงคำสั่งบันทึกเกี่ยวกับการดำเนินการทางตรรกะเดียวกัน (ดูด้านล่าง)
  • VisualBasic.Logging.FileLogTraceListener เหมาะสำหรับการเขียนไปยังล็อกไฟล์และรองรับการหมุนไฟล์ แม้ว่าในเนมสเปซ VisualBasic มันสามารถใช้ในโครงการ C # (หรือภาษาอื่น ๆ ) ได้อย่างง่ายดายเพียงแค่รวม DLL
  • เมื่อใช้ EventLogTraceListener ถ้าคุณเรียกใช้ TraceEvent ที่มีอาร์กิวเมนต์หลายตัวและด้วยสตริงรูปแบบที่ว่างเปล่าหรือเป็นโมฆะ args จะถูกส่งโดยตรงไปยัง EventLog.WriteEntry () หากคุณใช้ทรัพยากรข้อความที่แปลแล้ว
  • เครื่องมือ Service Trace Viewer (จาก WCF) มีประโยชน์สำหรับการดูกราฟของไฟล์บันทึกที่สัมพันธ์กันของกิจกรรม (แม้ว่าคุณจะไม่ได้ใช้ WCF) สิ่งนี้สามารถช่วยแก้ไขข้อบกพร่องที่ซับซ้อนซึ่งมีหลายเธรด / กิจกรรมที่เกี่ยวข้อง
  • หลีกเลี่ยงค่าใช้จ่ายโดยการล้างผู้ฟังทั้งหมด (หรือลบค่าเริ่มต้น); ค่าเริ่มต้นจะส่งผ่านทุกอย่างไปยังระบบติดตาม (และจะต้องมีค่าใช้จ่าย ToString () ทั้งหมด)

พื้นที่ที่คุณอาจต้องการดูการขยาย (ถ้าจำเป็น):

  • ฟังการสืบค้นฐานข้อมูล
  • ฟังคอนโซลการติดตามสี
  • ตัวรับฟังการสืบค้นกลับ MSMQ / Email / WMI (หากจำเป็น)
  • ใช้ FileSystemWatcher เพื่อโทรหา Trace.Refresh สำหรับการเปลี่ยนแปลงการกำหนดค่าแบบไดนามิก

คำแนะนำอื่น ๆ :

ใช้ id เหตุการณ์ที่มีโครงสร้างและเก็บรายการอ้างอิง (เช่นบันทึกไว้ใน enum)

การมีรหัสเหตุการณ์ที่ไม่ซ้ำกันสำหรับแต่ละเหตุการณ์ (สำคัญ) ในระบบของคุณมีประโยชน์มากสำหรับการสร้างความสัมพันธ์และการค้นหาปัญหาเฉพาะ ง่ายต่อการติดตามกลับไปยังรหัสเฉพาะที่บันทึก / ใช้รหัสเหตุการณ์และสามารถทำให้ง่ายต่อการให้คำแนะนำสำหรับข้อผิดพลาดทั่วไปเช่นข้อผิดพลาด 5178 หมายความว่าสายอักขระการเชื่อมต่อฐานข้อมูลของคุณผิด ฯลฯ

รหัสเหตุการณ์ควรเป็นไปตามโครงสร้างบางประเภท (คล้ายกับทฤษฎีรหัสตอบกลับที่ใช้ในอีเมลและ HTTP) ซึ่งช่วยให้คุณสามารถจัดการได้ตามหมวดหมู่โดยไม่ทราบรหัสเฉพาะ

เช่นตัวเลขแรกสามารถแสดงรายละเอียดของคลาสทั่วไป: 1xxx สามารถใช้สำหรับการดำเนินการ 'เริ่ม', 2xxx สำหรับพฤติกรรมปกติ, 3xxx สำหรับการติดตามกิจกรรม, 4xxx สำหรับการเตือน, 5xxx สำหรับข้อผิดพลาด, 8xxx สำหรับการดำเนินการ 'หยุด', 9xxx สำหรับข้อผิดพลาดร้ายแรง เป็นต้น

ตัวเลขที่สองสามารถแสดงรายละเอียดพื้นที่เช่น 21xx สำหรับข้อมูลฐานข้อมูล (41xx สำหรับคำเตือนฐานข้อมูล 51xx สำหรับข้อผิดพลาดฐานข้อมูล) 22xx สำหรับโหมดการคำนวณ (42xx สำหรับคำเตือนการคำนวณ ฯลฯ ) 23xx สำหรับโมดูลอื่น ฯลฯ

รหัสเหตุการณ์ที่กำหนดไว้แล้วยังช่วยให้คุณใช้ในตัวกรองได้

ถาม: หากคุณใช้การติดตามคุณใช้ Trace.Correlation.StartLogicalOperation หรือไม่

ตอบ: Trace.CorrelationManager มีประโยชน์อย่างมากสำหรับการเชื่อมโยงคำสั่งบันทึกในสภาพแวดล้อมแบบมัลติเธรดใด ๆ (ซึ่งค่อนข้างทุกวันนี้)

อย่างน้อยคุณต้องตั้งค่า ActivityId หนึ่งครั้งสำหรับการดำเนินการทางตรรกะแต่ละรายการเพื่อให้สัมพันธ์กัน

Start / Stop และ LogicalOperationStack นั้นสามารถใช้สำหรับบริบทสแต็กที่เรียบง่าย สำหรับบริบทที่ซับซ้อนมากขึ้น (เช่นการดำเนินการแบบอะซิงโครนัส) โดยใช้ TraceTransfer กับ ActivityId ใหม่ (ก่อนที่จะเปลี่ยน) จะอนุญาตให้มีความสัมพันธ์กัน

เครื่องมือ Service Trace Viewer อาจมีประโยชน์สำหรับการดูกราฟกิจกรรม (แม้ว่าคุณจะไม่ได้ใช้ WCF)

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

ตอบ: คุณอาจต้องการสร้างคลาสของขอบเขตเช่น LogicalOperationScope ซึ่ง (a) ตั้งค่าบริบทเมื่อสร้างและ (b) รีเซ็ตบริบทเมื่อกำจัด

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

  using( LogicalOperationScope operation = new LogicalOperationScope("Operation") )
  {
    // .. do work here
  }

ในการสร้างขอบเขตสามารถตั้งค่า ActivityId ได้ก่อนหากจำเป็นให้เรียกใช้ StartLogicalOperation จากนั้นบันทึกข้อความ TraceEventType.Start ในการกำจัดมันสามารถบันทึกข้อความหยุดแล้วโทร StopLogicalOperation

ถาม: คุณมีรูปแบบของความละเอียดมากกว่าแหล่งที่มีการสืบค้นหรือไม่? เช่น WPF TraceSources อนุญาตให้คุณกำหนดค่าในระดับต่างๆ

ตอบ: ใช่แหล่งข้อมูลการสืบค้นกลับหลายแห่งนั้นมีประโยชน์ / สำคัญเนื่องจากระบบมีขนาดใหญ่ขึ้น

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

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

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

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

หากคุณต้องการการควบคุมแบบละเอียดยิ่งขึ้นให้เพิ่มสวิตช์บูลีนแต่ละตัวเพื่อเปิด / ปิดการติดตามปริมาณสูงเฉพาะเช่นการทิ้งข้อความดิบ (หรือสามารถใช้แหล่งที่มาการติดตามที่แยกต่างหากคล้ายกับ WCF / WPF)

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

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


ฟัง

ถาม: คุณใช้บันทึกผลลัพธ์ใด

ขึ้นอยู่กับประเภทของแอปพลิเคชันที่คุณเขียนและสิ่งที่บันทึกไว้ โดยทั่วไปแล้วสิ่งต่าง ๆ จะไปในที่ต่าง ๆ (เช่นหลายเอาต์พุต)

โดยทั่วไปฉันแบ่งประเภทผลลัพธ์เป็นสามกลุ่ม:

(1) เหตุการณ์ - บันทึกเหตุการณ์ของ Windows (และไฟล์การติดตาม)

เช่นถ้าเขียนเซิร์ฟเวอร์ / บริการแนวทางปฏิบัติที่ดีที่สุดใน Windows คือการใช้บันทึกเหตุการณ์ของ Windows (คุณไม่มี UI ที่จะรายงาน)

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

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

ในทางตรงกันข้ามแอปพลิเคชัน Windows GUI โดยทั่วไปจะรายงานสิ่งเหล่านี้ต่อผู้ใช้ (แม้ว่าพวกเขาอาจบันทึกลงในบันทึกเหตุการณ์ของ Windows)

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

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

(2) กิจกรรม - ไฟล์บันทึกของแอปพลิเคชันหรือตารางฐานข้อมูล (และไฟล์ติดตาม)

นี่เป็นกิจกรรมปกติที่ระบบทำเช่นหน้าเว็บที่ให้บริการการซื้อขายในตลาดหุ้นการสั่งซื้อการดำเนินการคำนวณเป็นต้น

การติดตามกิจกรรม (เริ่มหยุด ฯลฯ ) มีประโยชน์ที่นี่ (ที่ความถูกต้องที่เหมาะสม)

นอกจากนี้ยังเป็นเรื่องธรรมดามากที่จะใช้ Application Log เฉพาะ (บางครั้งเรียกว่า Audit Log) โดยปกติจะเป็นตารางฐานข้อมูลหรือไฟล์บันทึกแอปพลิเคชันและมีข้อมูลที่มีโครงสร้าง (เช่นชุดของฟิลด์)

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

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

เช่นเดียวกับบันทึกของแอปพลิเคชันที่กำหนดเองกิจกรรมก็มักจะมีตัวนับการแสดงผลที่เกี่ยวข้องเช่นจำนวนธุรกรรมต่อวินาที

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

(3) Debug Trace - ไฟล์ข้อความหรืออาจเป็น XML หรือฐานข้อมูล

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

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

ความแตกต่างอย่างมากระหว่างข้อมูลนี้และไฟล์ล็อกแอปพลิเคชันคือมันไม่มีโครงสร้าง ขณะที่ล็อกแอปพลิเคชันอาจมีฟิลด์สำหรับถึงจากจำนวนเงิน ฯลฯ การติดตามการดีบักแบบ Verbose อาจเป็นสิ่งที่โปรแกรมเมอร์ใส่เช่น "การตรวจสอบค่า X = {value}, Y = false" หรือความคิดเห็น / เครื่องหมายสุ่มเช่น " เสร็จแล้วลองอีกครั้ง "

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

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

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

ตอบ: สำหรับไฟล์โดยทั่วไปคุณต้องการกลิ้งไฟล์ล็อกจากมุมมองที่สามารถจัดการได้ (ด้วย System.Diagnostics เพียงใช้ VisualBasic.Logging.FileLogTraceListener)

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

หากคุณไม่สามารถเข้าถึงระบบไฟล์ได้ง่ายการดีบักการติดตามไปยังฐานข้อมูลอาจทำได้ง่ายกว่า [เช่นใช้ฐานข้อมูล TraceListener]

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

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

ระบบจำนวนมากในทุกวันนี้รวมการรายงานความล้มเหลวอัตโนมัติไปยังเซิร์ฟเวอร์กลาง (หลังจากตรวจสอบกับผู้ใช้เช่นเหตุผลด้านความเป็นส่วนตัว)


กำลังดู

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

ตอบ: หากคุณมีบันทึกหลายรายการด้วยเหตุผลที่แตกต่างกันคุณจะใช้ผู้ดูหลายคน

Notepad / vi / Notepad ++ หรือแก้ไขข้อความอื่น ๆ เป็นพื้นฐานสำหรับบันทึกข้อความธรรมดา

หากคุณมีการดำเนินการที่ซับซ้อนเช่นกิจกรรมที่มีการถ่ายโอนแน่นอนคุณต้องใช้เครื่องมือพิเศษเช่น Service Trace Viewer (แต่ถ้าคุณไม่ต้องการมันก็เป็นโปรแกรมแก้ไขข้อความที่ง่ายกว่า)

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

โดยทั่วไปบันทึกเหตุการณ์ของ Windows ยังทำให้เหตุการณ์สำคัญเหล่านี้สามารถใช้ในการตรวจสอบเครื่องมือเช่น MOM หรือ OpenView

อื่น ๆ -

หากคุณเข้าสู่ฐานข้อมูลสามารถกรองและจัดเรียงข้อมูลได้ง่าย (เช่นซูมเข้ากับรหัสกิจกรรมเฉพาะ (ด้วยไฟล์ข้อความคุณสามารถใช้ Grep / PowerShell หรือคล้ายกับตัวกรองใน GUID ที่ต้องการ)

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

เมื่อใช้บริการในการแก้ปัญหา / ทดสอบฉันมักจะโฮสต์ในแอปพลิเคชันคอนโซลเพื่อความเรียบง่ายฉันพบว่า logger สีมีประโยชน์ (เช่นสีแดงสำหรับข้อผิดพลาดสีเหลืองสำหรับคำเตือน ฯลฯ ) คุณต้องใช้ฟังการติดตามที่กำหนดเอง

โปรดทราบว่าเฟรมเวิร์กไม่ได้รวมตัวบันทึกคอนโซลที่มีสีหรือตัวบันทึกฐานข้อมูลดังนั้นในตอนนี้คุณจะต้องเขียนสิ่งเหล่านี้หากคุณต้องการ (ไม่ยากเกินไป)

มันทำให้ฉันรำคาญจริง ๆ ว่าหลายเฟรมเวิร์ก (log4net, EntLib ฯลฯ ) เสียเวลาคิดค้นล้อและนำการบันทึกขั้นพื้นฐานไปใช้ใหม่การกรองและการบันทึกไฟล์ข้อความไฟล์บันทึกเหตุการณ์ Windows และไฟล์ XML แต่ละไฟล์เป็นของตนเอง วิธีที่แตกต่าง (คำสั่งบันทึกจะแตกต่างกันในแต่ละ); แต่ละตัวได้นำเวอร์ชันของตัวเองไปใช้แล้วเช่นตัวบันทึกฐานข้อมูลเมื่อส่วนใหญ่มีอยู่แล้วและสิ่งที่จำเป็นต้องมีก็คือตัวรับฟังการติดตามอีกสองสามรายการสำหรับ System.Diagnostics พูดคุยเกี่ยวกับความพยายามซ้ำซ้อน

ถาม: หากคุณกำลังสร้างโซลูชัน ASP.NET คุณยังใช้การตรวจสอบสถานะสุขภาพ ASP.NET หรือไม่ คุณรวมเอาท์พุทการติดตามในเหตุการณ์การตรวจสอบสุขภาพหรือไม่? สิ่งที่เกี่ยวกับ Trace.axd

สิ่งเหล่านี้สามารถเปิด / ปิดได้ตามต้องการ ฉันพบว่า Trace.axd ค่อนข้างมีประโยชน์สำหรับการดีบักวิธีที่เซิร์ฟเวอร์ตอบสนองต่อบางสิ่ง แต่โดยทั่วไปไม่ได้มีประโยชน์ในสภาพแวดล้อมที่ใช้งานหนักหรือการติดตามระยะยาว

ถาม: เคาน์เตอร์วัดประสิทธิภาพที่กำหนดเองเป็นอย่างไร

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

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

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


FYI: ฉันพบปัญหาที่ microsoft ติดตามไปยังไฟล์ขัดข้อง หากคุณมีหลายกระบวนการ (หรือเธรด) เขียนไปยังไฟล์เดียวกันและพวกเขาชนกันคุณจะได้รับข้อผิดพลาดการล็อคการเข้าถึงแบบเอกสิทธิ์ของระบบไฟล์ในล็อกไฟล์
Jay

1
โครงสร้างพื้นฐาน System.Diagnostics เป็นเธรดที่ปลอดภัย ลักษณะการทำงานเริ่มต้นสำหรับเฟรมเวิร์กในการล็อกอย่างไรก็ตามคุณสามารถแทนที่ TraceListener.IsThreadSafe หากคุณจัดเตรียมการล็อกของคุณเอง ดูmsdn.microsoft.com/en-us/library/... สำหรับหลายกระบวนการคุณมักจะเขียนไปยังไฟล์แยกกัน แต่โปรดสังเกตว่า Service Trace Viewer สามารถโหลดไฟล์ติดตามหลายไฟล์ (เช่นจากหลายเครื่อง) และเชื่อมโยงกับไฟล์เหล่านั้นผ่านทาง ActivityId
Sly Gryphon

1
คุณสามารถแนะนำวิธีใช้ TraceEvent () เพื่อบันทึกข้อยกเว้นได้หรือไม่
Dmitriy Sosunov

1
ไม่ใช่หนึ่งในข้อเสียเปรียบที่สำคัญของSystem.Diagnostics.Traceมันที่ได้รับการตกแต่งด้วย[Conditional("TRACE")]ซึ่งทำให้ไม่สามารถใช้งานได้ในสภาพแวดล้อมการผลิตซึ่งคุณไม่ค่อยได้คอมไพล์โค้ดกับTRACEแฟล็ก
Asbjørn Ulsberg

2
@asbjornu การกำหนดค่าเริ่มต้นของการสร้างรุ่นใน Visual Studio มีการติดตามที่กำหนดไว้ (เป็น DEBUG ที่ปิดใช้งานสำหรับรุ่นที่วางจำหน่าย); ถ้าคุณสร้างจากบรรทัดคำสั่งคุณต้องเปิดใช้งาน
Sly Gryphon

40

ฉันต้องเข้าร่วมคอรัสเพื่อแนะนำ log4net ในกรณีของฉันมาจากความยืดหยุ่นของแพลตฟอร์ม (เดสก์ท็อป. Net / Compact Framework, 32/64-bit) มุมมอง

อย่างไรก็ตามการห่อใน API ส่วนตัวของฉลากเป็นการต่อต้านรูปแบบที่สำคัญ log4net.ILoggerเป็น. Net จากCommons Logging wrapper APIอยู่แล้วดังนั้นการมีเพศสัมพันธ์จึงถูกย่อให้เล็กที่สุดสำหรับคุณและเนื่องจากมันเป็นห้องสมุด Apache ซึ่งปกติแล้วไม่ได้เป็นข้อกังวลเพราะคุณไม่ยอมแพ้การควบคุมใด ๆ : แยกหากคุณ ต้อง.

ห้องสมุด wrapper บ้านส่วนใหญ่ที่ฉันเคยเห็นยังมีข้อบกพร่องอย่างน้อยหนึ่งข้อ:

  1. การใช้ตัวบันทึกแบบซิงเกิลโกลบอล (หรือจุดเข้าใช้งานแบบคงที่) ซึ่งสูญเสียความละเอียดของรูปแบบตัวบันทึกต่อหนึ่งคลาสที่แนะนำเพื่อไม่ให้เกิดการเลือกแบบอื่น
  2. การไม่เปิดเผยExceptionอาร์กิวเมนต์ที่เป็นตัวเลือกซึ่งนำไปสู่ปัญหาหลายประการ:
    • มันทำให้นโยบายการบันทึกข้อยกเว้นยากต่อการดูแลรักษามากขึ้นดังนั้นจึงไม่มีสิ่งใดที่จะทำอย่างสม่ำเสมอพร้อมกับข้อยกเว้น
    • แม้ว่าจะมีนโยบายที่สอดคล้องกัน แต่การจัดรูปแบบข้อยกเว้นให้กับสตริงจะสูญเสียข้อมูลก่อนกำหนด ฉันได้เขียนILayoutมัณฑนากรที่กำหนดเองที่ดำเนินการเจาะลึกรายละเอียดเกี่ยวกับข้อยกเว้นเพื่อพิจารณาห่วงโซ่ของเหตุการณ์
  3. ความล้มเหลวในการเปิดเผยคุณสมบัติIsLevelEnabledซึ่งละทิ้งความสามารถในการข้ามรหัสการจัดรูปแบบเมื่อพื้นที่หรือระดับของการบันทึกถูกปิด

1
ฉันได้รับมอบหมายให้ทำ refactoring เสื้อคลุมในบ้าน (น่ากลัว) รอบ ๆ log4j ให้เป็นสิ่งที่น่ากลัวน้อยกว่า (มันก็ค่อนข้างแย่ แต่นั่นก็เป็นผลมาจากการขัดรองเท้าตามข้อกำหนดที่ฉันได้รับใน log4j) ฉันพยายามกำจัดจุดเข้าใช้คงที่ทั่วโลก แต่ถูกยิงลง ฉันไม่เข้าใจประเด็นจริงๆ ในการตั้งค่าของเรา log4j มีการขยายและบิดเบี้ยวอย่างมากจนมันถูกใช้เป็นตัวกระจายเหตุการณ์เท่านั้น เราใช้มันเพราะมีคนถามว่า "เราจะใช้ log4j เพื่อสิ่งนี้ได้อย่างไร" ไม่ว่าจะใช้ log4 ไม่ว่าตรงหรือเขียนกรอบของคุณเอง ถนนสายกลางเจ็บปวด
Adam Jaskiewicz

25
ฉันไม่เห็นด้วยกับคำแนะนำของคุณที่จะไม่ห่อ log4net การห่อด้วย API แบบบางผู้ให้บริการช่วยให้ผู้ใช้ไลบรารีคลาสของคุณสามารถเสียบเฟรมเวิร์กการบันทึกที่ชื่นชอบได้ แน่นอนว่า YMMV แต่การอธิบายว่ามันเป็น "แอนตี้ - แพทเทิร์นหลัก" เป็นเรื่องที่ไม่เชื่อฟัง ความจริงที่ว่ามีไลบรารี wrapper ที่มี "litany of faults" ไม่ใช่อาร์กิวเมนต์ที่ดีสำหรับ wrapper ที่เขียนได้ดี
Joe

1
การเรียกบางสิ่งบางอย่างการต่อต้านแบบไม่ได้หมายความว่ามันเป็นความคิดที่ไม่ดี 100% เสมอ - เพียงแค่มันสร้างแนวโน้มที่จะวาดภาพตัวเองในมุมหนึ่ง นอกจากนี้ ILog / LogManager เป็นตัวย่อขนาดเล็กที่เป็นลายลักษณ์อักษรอย่างดีในรูปของคอมมอนส์ - การบันทึกที่รวมอยู่ในแอสเซมบลี log4net แต่ไม่มีเหตุผลที่มันไม่สามารถแยกออกมาและกลายเป็นการคอมมอนส์ที่เหมาะสมสำหรับ CLR
Jeffrey Hantin

18

ฉันไม่ได้พัฒนาบ่อยใน asp.net แต่เมื่อพูดถึงคนตัดไม้ฉันคิดว่าวิธีปฏิบัติที่ดีที่สุดมากมายเป็นสากล นี่คือความคิดสุ่มของฉันเกี่ยวกับการบันทึกที่ฉันได้เรียนรู้ในช่วงหลายปีที่ผ่านมา:

กรอบ

  • ใช้เฟรมเวิร์ก Abstraction Abstraction - เช่น slf4j (หรือหมุนของคุณเอง) เพื่อให้คุณแยกการใช้งาน Logger จาก API ของคุณ ฉันได้เห็นเฟรมเวิร์กของตัวบันทึกจำนวนหนึ่งมาแล้วและคุณก็ยังดีกว่าที่จะสามารถนำเอากรอบใหม่มาใช้ได้โดยไม่ต้องยุ่งยากอะไรมาก
  • ลองค้นหาเฟรมเวิร์กที่รองรับรูปแบบเอาต์พุตที่หลากหลาย
  • ลองค้นหาเฟรมเวิร์กที่สนับสนุนตัวกรองปลั๊กอิน / กำหนดเอง
  • ใช้เฟรมเวิร์กที่สามารถกำหนดค่าด้วยไฟล์ภายนอกเพื่อให้ลูกค้า / ผู้บริโภคของคุณสามารถปรับแต่งเอาต์พุตบันทึกได้อย่างง่ายดายเพื่อให้สามารถอ่านได้โดยแอปพลิเคชันการจัดการบันทึกเชิงพาณิชย์ได้อย่างง่ายดาย
  • อย่าไปเกินระดับการบันทึกที่กำหนดเองมิฉะนั้นคุณอาจไม่สามารถย้ายไปยังเฟรมเวิร์กการบันทึกที่แตกต่างกัน

เอาท์พุทคนตัดไม้

  • พยายามหลีกเลี่ยงการบันทึกสไตล์ XML / RSS สำหรับการบันทึกที่อาจประสบความล้มเหลวเป็นหายนะ สิ่งนี้มีความสำคัญเนื่องจากหากสวิตช์ไฟถูกปิดโดยที่คนตัดไม้ของคุณกำลังเขียน</xxx>แท็กปิดบันทึกของคุณจะไม่ทำงาน
  • บันทึกหัวข้อ มิฉะนั้นอาจเป็นเรื่องยากในการติดตามการไหลของโปรแกรมของคุณ
  • หากคุณต้องทำให้บันทึกของคุณเป็นสากลคุณอาจต้องการให้นักพัฒนาลงชื่อเข้าใช้ภาษาอังกฤษเท่านั้น (หรือภาษาที่คุณเลือก)
  • บางครั้งการมีตัวเลือกในการแทรกคำสั่งการบันทึกลงในแบบสอบถาม SQL สามารถช่วยชีวิตในสถานการณ์การดีบัก เช่น:
    - เรียกคลาส: com.foocorp.foopackage.FooClass: 9021
    เลือก * จาก foo;
  • คุณต้องการบันทึกระดับชั้น ตามปกติคุณไม่ต้องการอินสแตนซ์ของตัวบันทึกแบบสแตติกเช่นกัน - มันไม่คุ้มค่ากับการเพิ่มประสิทธิภาพขนาดเล็ก
  • การทำเครื่องหมายและการจัดหมวดหมู่ข้อยกเว้นที่บันทึกไว้บางครั้งมีประโยชน์เพราะไม่ใช่ข้อยกเว้นทั้งหมดที่สร้างขึ้นเท่ากัน ดังนั้นการรู้ชุดย่อยของข้อยกเว้นที่สำคัญเวลาจะเป็นประโยชน์ถ้าคุณมีการตรวจสอบบันทึกที่ต้องการส่งการแจ้งเตือนเมื่อมีสถานะวิกฤติ
  • ตัวกรองที่ซ้ำซ้อนจะช่วยประหยัดการมองเห็นและฮาร์ดดิสก์ของคุณ คุณต้องการที่จะเห็นคำสั่งการบันทึกเดียวกันซ้ำแล้วซ้ำอีก 10 ^ 10,000,000 ครั้งหรือไม่? การได้รับข้อความเช่นนี้จะเป็นการดีกว่าไหม: This is my logging statement - Repeated 100 times

ดูคำถามของฉันด้วย


5
ฟิลเตอร์ทำสำเนาเป็นความคิดที่ดี
พอล Stovell

ฉันเคยเห็นด้วยกับปัญหาแท็กที่เสีย แต่ตัวเขียน XML ที่ดีที่สุดส่วนใหญ่ไม่ได้ใช้ XML แบบเต็ม (เช่นไม่มีอิลิเมนต์ราก) ดังนั้นพวกเขาจึงสามารถเข้าสู่ระบบได้โดยไม่โหลด XML DOM ในกรณีที่ผิดปกติมีปัญหาเกิดขึ้นจากรายการที่เขียนบางส่วนคุณสามารถแก้ไขได้ด้วยตนเอง
Paul Stovell

ฉันกลับไปมาบนการบันทึก XML มาหลายปีแล้ว ตอนนี้ดูเหมือนว่าฉันจะมากเกินไป หากฉันต้องการฟีด RSS ของสถานะของแอปพลิเคชันฉันคิดว่ามันถูกนำไปใช้กับยูทิลิตี้การตรวจสอบบันทึก
Elijah

ฉันเห็นด้วยกับ RSS ฉันกำลังคิดเกี่ยวกับเครื่องมือสร้างภาพที่ช่วยให้คุณเข้าใจรายการได้ดีขึ้น กับไฟล์ข้อความโดยทั่วไปคุณต้องการเก็บรายการหนึ่งบรรทัด; แต่บางครั้งคุณต้องการรวมร่องรอยสแต็กหรือวัตถุที่ต่อเนื่องกัน นั่นคือสิ่งที่บันทึก XML (ที่ใช้โดย WCF) มาในสะดวก
พอล Stovell

+1 สำหรับการกล่าวถึงเครื่องมือของการสืบค้น SQL นี่เป็นประโยชน์อย่างมากสำหรับความสัมพันธ์ของการติดตามฐานข้อมูลและการติดตามแอปพลิเคชัน ฉันกำลังทำด้วยตนเองใน DAL ของฉัน แต่ฉันสงสัยว่ามีการสนับสนุนเครื่องมือชนิดใดสำหรับเทคนิคนี้
Constantin

17

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

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

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

เรากำลังใช้ห้องสมุด Apache Commons-logging ที่ล้อมรอบ Log4J

หวังว่านี่จะช่วยได้!

* แก้ไข *

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


ขอบคุณสำหรับคำตอบ. คุณสร้างเด็ก loggers ด้วยตนเองในรหัส (เช่นพวกเขารหัสยาก) หรือผ่านสิ่งอัตโนมัติ / โดยนัยบางชนิด?
Paul Stovell

ไม่ ... ถ้าเราเพิ่มการกำหนดค่าการบันทึกลงในไฟล์ logging.properties สำหรับแพ็คเกจหรือคลาสพวกเขาจะถูกบันทึกตามการกำหนดค่านั้น แต่แพ็คเกจหรือคลาสที่ไม่ได้กำหนดค่าเฉพาะจะถูกบันทึกในระดับเริ่มต้น
Steve Moyer

9

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

เราเลือกด้วยเหตุผลดังต่อไปนี้:

  • การกำหนดค่า / กำหนดค่าอย่างง่าย ๆ บนสภาพแวดล้อมต่างๆ
  • จำนวนของตัวสร้างที่สร้างไว้ล่วงหน้าที่ดี
  • หนึ่งใน CMS ที่เราใช้นั้นมีอยู่แล้วภายใน
  • มีระดับการบันทึกและการกำหนดค่าที่ดีรอบตัวพวกเขา

ฉันควรพูดถึงนี่พูดจากมุมมองการพัฒนา ASP.NET

ฉันเห็นข้อดีบางประการในการใช้งานการติดตามที่อยู่ในกรอบงาน. NET แต่ฉันไม่ได้ขายทั้งหมดโดยส่วนใหญ่เป็นเพราะส่วนประกอบที่ฉันทำงานด้วยไม่ได้ทำการโทรติดตามจริงๆ สิ่งเดียวที่ฉันใช้บ่อย ๆ ก็คือSystem.Net.Mailสิ่งที่ฉันสามารถบอกได้

ดังนั้นเราจึงมีไลบรารี่ที่ล้อมรอบ log4net และภายในโค้ดของเราเราต้องการสิ่งนี้:

Logger.Instance.Warn("Something to warn about");
Logger.Instance.Fatal("Something went bad!", new Exception());

try {
  var i = int.Parse("Hello World");
} catch(FormatException, ex) {
  Logger.Instance.Error(ex);
}

ภายในวิธีการที่เราทำการตรวจสอบเพื่อดูว่ามีการเปิดใช้งานระดับการบันทึกหรือไม่ดังนั้นคุณไม่มีการโทรซ้ำซ้อนไปยัง log4net API (ดังนั้นหากไม่ได้เปิดใช้งานการดีบักคำสั่งการดีบักจะถูกละเว้น) แต่เมื่อฉันได้รับเวลา ฉันจะอัปเดตเพื่อแสดงสิ่งเหล่านั้นเพื่อให้คุณสามารถทำการตรวจสอบด้วยตัวเอง วิธีนี้จะช่วยป้องกันการประเมินผลเมื่อไม่ควรทำเช่น:

Logger.Instance.Debug(string.Format("Something to debug at {0}", DateTime.Now);

สิ่งนี้จะกลายเป็น:

if(Logger.DebugEnabled) Logger.Instance.Debug(string.Format("Something to debug at {0}", DateTime.Now);

(ประหยัดเวลาในการประมวลผลเล็กน้อย)

โดยค่าเริ่มต้นเราเข้าสู่ระบบที่สองสถานที่:

  1. ระบบไฟล์ของเว็บไซต์ (ในนามสกุลไฟล์ที่ไม่ได้ให้บริการ)
  2. ส่งอีเมลผิดพลาด & ร้ายแรง

ไฟล์จะถูกทำในลักษณะหมุนวนในแต่ละวันหรือ 10mb (IIRC) เราไม่ใช้ EventLog เนื่องจากอาจต้องการความปลอดภัยสูงกว่าที่เรามักจะต้องการให้ไซต์

ฉันพบว่า Notepad ใช้งานได้ดีสำหรับการอ่านบันทึก


เฟรมเวิร์กการบันทึกเป็นหนึ่งในไม่กี่กรณีที่ซิงเกิลตันไม่ถูกต้อง
mmcdole

อาจเป็นได้ถ้าคุณต้องการให้บริบทรอบตัวบันทึกของคุณ แต่มันจะช่วยจัดการกับภาวะพร้อมกันได้
Aaron Powell

7
ฉันจะฉ้อโกงซิงเกิล แน่นอนคุณสามารถมีอินสแตนซ์เดียวซึ่งผ่านรอบ (โดยเฉพาะอย่างยิ่งในคอนเทนเนอร์ IOC / DI) ฉันก็จะพยายามที่จะย้ายเข้าสู่ระบบเข้าสู่ interceptor ....
yfeldblum

2
ไม่ใช่แฟนของอินสแตนซ์เดียวเช่นกัน ฉันชอบที่จะให้คนตัดไม้ที่มีชื่อไม่เหมือนใครในแต่ละชั้นเรียนดังนั้นการเปลี่ยนการบันทึกขึ้นหรือลงบนแต่ละโมดูลนั้นง่ายมาก
Jeffrey Hantin

8

คุณใช้กรอบอะไร

เราใช้การผสมผสานของบล็อกแอปพลิเคชันการบันทึกและตัวช่วยการบันทึกแบบกำหนดเองที่ทำงานกับบิตเฟรมเวิร์ก. Net LAB ได้รับการกำหนดค่าให้ส่งออกไฟล์บันทึกที่ค่อนข้างครอบคลุมรวมถึงไฟล์การติดตามทั่วไปแยกต่างหากสำหรับการเข้า / ออกวิธีการบริการและไฟล์ข้อผิดพลาดเฉพาะสำหรับปัญหาที่ไม่คาดคิด การกำหนดค่ารวมถึงวันที่ / เวลา, เธรด, pId เป็นต้นสำหรับความช่วยเหลือในการดีบักรวมถึงรายละเอียดข้อยกเว้นแบบเต็มและสแต็ก (ในกรณีที่มีข้อยกเว้นที่ไม่คาดคิด)

ผู้ช่วยการบันทึกที่กำหนดเองใช้ประโยชน์จาก Trace.Correlation และมีประโยชน์อย่างยิ่งในบริบทของการเข้าสู่ระบบใน WF ตัวอย่างเช่นเรามีเครื่องสถานะที่เรียกลำดับของเวิร์กโฟลว์ตามลำดับ ในแต่ละกิจกรรมที่เรียกใช้เหล่านี้เราจะบันทึกการเริ่มต้น (โดยใช้ StartLogicalOperation) จากนั้นในตอนท้ายเราจะหยุดการดำเนินการทางตรรกะด้วยตัวจัดการเหตุการณ์ส่งคืนแบบ gereric

สิ่งนี้ได้รับการพิสูจน์แล้วว่ามีประโยชน์สองสามครั้งเมื่อพยายามดีบั๊กความล้มเหลวในลำดับธุรกิจที่ซับซ้อนเนื่องจากช่วยให้เราสามารถกำหนดสิ่งต่าง ๆ เช่นการตัดสินใจในสาขา If / Else ฯลฯ ได้รวดเร็วยิ่งขึ้นตามลำดับการดำเนินกิจกรรม

คุณใช้บันทึกผลลัพธ์ใด

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

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

เราใช้ Notepad และ WCF Service Trace Viewer ขึ้นอยู่กับว่ากลุ่มใดที่เรากำลังดูอยู่ ตัวดูการติดตามบริการ WCF นั้นมีประโยชน์จริง ๆ หากคุณตั้งค่าเอาต์พุตของคุณอย่างถูกต้องและสามารถอ่านผลลัพธ์ได้ง่ายขึ้นมาก ที่กล่าวว่าถ้าฉันรู้คร่าวๆว่าข้อผิดพลาดอยู่ที่ใด - แค่อ่านไฟล์ข้อความที่มีคำอธิบายประกอบอย่างดีก็ดี

บันทึกจะถูกส่งไปยังไดเรกทอรีเดียวซึ่งจะแบ่งออกเป็น sub-dirs ตามบริการต้นทาง dir รูตจะถูกเปิดเผยผ่านเว็บไซต์ที่มีการควบคุมการเข้าถึงโดยกลุ่มผู้ใช้ที่สนับสนุน สิ่งนี้ทำให้เราสามารถดูบันทึกการผลิตได้โดยไม่ต้องใส่คำขอและผ่านกระบวนการเทปสีแดงที่มีความยาวสำหรับข้อมูลการผลิต


6

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

จริงๆแล้วมีเฟรมเวิร์กการบันทึกและเครื่องมือสำหรับ. NET จำนวนมาก มีภาพรวมและการเปรียบเทียบของเครื่องมือที่แตกต่างกันอยู่ในDotNetLogging.com


5

มีคำแนะนำดีๆมากมายในคำตอบ

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


1

เราใช้ log4net ในเว็บแอปพลิเคชันของเรา

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

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

แก้ไข:

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


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

1

เท่าที่เกี่ยวข้องกับการบันทึกเชิงกว้างฉันขอแนะนำ PostSharp ในคำถาม SO อื่น -

การบันทึกเชิงภาพที่มี Unity \ T4 \ อย่างอื่น

ลิงค์ที่ให้ไว้ในคำตอบนั้นควรค่าแก่การเยี่ยมชมหากคุณกำลังประเมินเฟรมเวิร์กการบันทึก

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