วิธีติดตามปัญหา log4net


191

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

log4net สร้างผลลัพธ์ประเภทใดบ้างที่ฉันสามารถดูเพื่อลองหาสาเหตุของปัญหาได้หรือไม่

คำตอบ:


294

ก่อนอื่นคุณต้องตั้งค่านี้ในไฟล์กำหนดค่าแอปพลิเคชัน:

<configuration>
   <appSettings>
      <add key="log4net.Internal.Debug" value="true"/>
   </appSettings>
</configuration>

จากนั้นในการกำหนดไฟล์ที่คุณต้องการบันทึกผลลัพธ์คุณสามารถเพิ่มรหัสต่อไปนี้ในไฟล์. config เดียวกัน:

<configuration>
...

<system.diagnostics>
    <trace autoflush="true">
        <listeners>
            <add 
                name="textWriterTraceListener" 
                type="System.Diagnostics.TextWriterTraceListener" 
                initializeData="C:\tmp\log4net.txt" />
        </listeners>
    </trace>
</system.diagnostics>

...
</configuration>

คุณสามารถค้นหาคำอธิบายโดยละเอียดเพิ่มเติมได้ใน 'ฉันจะเปิดใช้งานการดีบักภายใน log4net ได้อย่างไร' ในlog4net คำถามที่พบบ่อยหน้า


10
เพียงตรวจสอบให้แน่ใจว่ากระบวนการที่แอปพลิเคชันของคุณทำงานอยู่นั้นมีสิทธิ์ในพา ธ ที่คุณต้องการสร้างไฟล์ข้อความการบันทึก ("C: \ tmp \ log4net.txt" ในตัวอย่างด้านบน)
NMrt

3
ดูเหมือนว่าการดีบักภายในจะไม่มีการประทับเวลา
snit80

4
ฉันเปลี่ยนจากC:\tmp\log4net.txtเป็นC:\log4net.txtแล้วมันสามารถสร้างไฟล์ข้อความ
Frank Myat พฤ

6
แค่ทราบว่าฉันพบวิธีที่สนุก ตรวจสอบว่าเป็นรายการแรกภายใต้<configSections></configSections> <configuration>มิฉะนั้นคุณจะพบข้อผิดพลาด
Nick

2
นี่ไม่แสดงเวลาสำหรับรายการในล็อกไฟล์ ฉันได้ลองตั้งค่าคุณสมบัติtraceOutputOptions="TimeStamp"และtraceOutputOptions="DateTime"ในaddแท็กแล้ว แต่มันไม่มีอะไรเปลี่ยนแปลงในเนื้อหาไฟล์บันทึก มีใครรู้วิธีตั้งค่า log4net เพื่อแสดงเวลาสำหรับแต่ละบรรทัด / รายการในไฟล์บันทึกการติดตามหรือไม่
Ulysses Alves

43

หากคุณกำลังใช้ไฟล์กำหนดค่า log4net คุณสามารถเปิดการดีบักที่นั่นได้โดยเปลี่ยนโหนดบนสุดเป็น:

<log4net debug="true">

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


6
เมื่อเปิดใช้งานการตั้งค่าสถานะนี้ - คุณจะสามารถดูบันทึกการวินิจฉัยจาก log4net ภายในหน้าต่างแสดงผลของ Visual Studio
Naren

24

นอกเหนือจากคำตอบข้างต้นคุณสามารถใช้บรรทัดนี้เพื่อดูการเข้าสู่ระบบเรียลไทม์แทนการส่งออก c: \ tmp \ log4net.txt

log4net.Util.LogLog.InternalDebugging = true;

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


8

ตรวจสอบให้แน่ใจว่าแอปพลิเคชันรูทที่จุดเข้าใช้งานของคุณบันทึกบางสิ่งใน log4net ให้หนึ่งในสิ่งเหล่านี้:

private static ILog logger = LogManager.GetLogger(typeof(Program));
static void Main(string[] args)
{
    logger.InfoFormat("{0} v.{1} started.", Assembly.GetExecutingAssembly().GetName().Name, Assembly.GetExecutingAssembly().GetName().Version.ToString());

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


1
ช่วยฉันด้วย :-)
costa

2

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


2

ใน log4net 2.0.8 ดูเหมือนว่าเป็นไปไม่ได้ที่จะทำการบันทึกด้วย log4net ใน DLL แยกต่างหาก ถ้าฉันลองสิ่งนี้ผลลัพธ์จะแปลกมาก: ไม่มีการบันทึกอีกต่อไป และการเริ่มต้นของ log4net ด้วยตัวเลือกการแก้ปัญหาไม่แสดงข้อผิดพลาด

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

ใน log4net เวอร์ชั่นถัดไปข้อผิดพลาดนี้อาจได้รับการแก้ไข

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