ปัญหาในการบันทึกข้อมูลจากหลายอินสแตนซ์เพื่อแยกไฟล์บันทึก

จากประสบการณ์การบันทึกตามปกติของฉัน ฉันเพียงแค่สร้างอินสแตนซ์ ILog ในแต่ละคลาสโดยใช้บางอย่างเช่น mylog = LogManager.GetLogger( name) ซึ่งทำให้ฉันมี Logger ที่ไม่ซ้ำกันต่ออินสแตนซ์ ทุกอย่างบันทึกเป็นไฟล์เดียวกันและใช้งานได้ดี

อย่างไรก็ตาม ตอนนี้ฉันมีสถานการณ์ที่ต้องการบันทึกเป็นสองไฟล์แยกกัน ฉันทำสิ่งนี้สำเร็จด้วย logging.xml ต่อไปนี้:

<?xml version="1.0" encoding="utf-8"?>
<log4net>
  <appender name="Console" type="log4net.Appender.ConsoleAppender">
    <filter type="log4net.Filter.LevelRangeFilter">
      <param name="LevelMin" value="INFO"/>
      <param name="LevelMax" value="FATAL"/>
    </filter>
    <layout type="log4net.Layout.PatternLayout">
      <!-- Pattern to output the caller's file name and line number -->
      <conversionPattern value="%date{yyyy-MM-dd-HH_mm_ss.fff} [%thread] %-5level %logger - %message%newline" />
    </layout>
  </appender>

  <appender name="File" type="log4net.Appender.FileAppender">
    <file type="log4net.Util.PatternString" value="%property{LogName}" />
    <appendToFile value="true" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date{yyyy-MM-dd-HH_mm_ss.fff} [%thread] %-5level %logger - %message%newline" />
    </layout>
  </appender>

  <root>
    <level value="DEBUG" />
    <appender-ref ref="Console" />
    <appender-ref ref="File" />
  </root>
</log4net>

และในโค้ดด้านหลัง ฉันตั้งชื่อของ FileAppender ตามอินสแตนซ์โดยตั้งชื่อที่ไม่ซ้ำกัน:

log4net.GlobalContext.Properties["LogName"] = unique_path_here;

ถ้าฉันสร้างอินสแตนซ์วัตถุหนึ่งชื่อ "test1" ไฟล์ "test1.log" จะถูกสร้างขึ้น เมื่อฉันสร้างอินสแตนซ์อ็อบเจ็กต์อื่นที่เรียกว่า "test2" ไฟล์ "test2.log" จะถูกสร้างขึ้น ดูเหมือนว่าทุกอย่างจะทำงานได้ดี จนกระทั่งฉันเริ่มเรียกเมธอดในแต่ละอ็อบเจ็กต์ เมื่อฉันสลับการโทร ข้อมูลสำหรับวัตถุหนึ่งจะถูกเขียนไปยังไฟล์ของวัตถุอื่นในตอนแรก แต่จากนั้นข้อมูลจะถูกบันทึกลงในไฟล์ที่ถูกต้อง ตัวอย่างเช่น ต่อไปนี้เป็นตัวอย่างง่ายๆ ของสิ่งที่เกิดขึ้น:

  1. test1.log() -> เขียนไปที่ test1.log
  2. test2.log() -> เขียนไปที่ test2.log
  3. test1.log() -> เขียนบรรทัดไปที่ test2.log จากนั้นส่วนที่เหลือจะถูกเขียนไปที่ test1.log
  4. test2.log() -> เขียนผ้าสำลีไปที่ test1.log จากนั้นส่วนที่เหลือจะถูกเขียนไปที่ test2.log

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

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


person Dave    schedule 11.12.2012    source แหล่งที่มา


คำตอบ (1)


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

แก้ไข -- นั่นไม่ใช่อย่างนั้น ฉันแทนที่คุณสมบัติใน logging.xml ด้วย <File value="TEMP" /> จากนั้นในโค้ดด้านหลัง ฉันโหลด FileAppender และตั้งค่าคุณสมบัติ File ให้เป็นพาธที่ถูกต้อง พฤติกรรมก็เหมือนกัน :(

แก้ไข - วิธีแก้ไขคือสร้าง FileAppender ต่ออินสแตนซ์ แทนที่จะเป็น Logger ต่ออินสแตนซ์ ฉันไม่แน่ใจว่าทำไมฉันจึงใช้เวลานานมากกว่าจะได้ข้อสรุปนั้น แต่ในที่สุดฉันก็ทำได้ และตอนนี้ดูเหมือนว่าจะได้ผลแล้ว

person Dave    schedule 11.12.2012