จากประสบการณ์การบันทึกตามปกติของฉัน ฉันเพียงแค่สร้างอินสแตนซ์ 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" จะถูกสร้างขึ้น ดูเหมือนว่าทุกอย่างจะทำงานได้ดี จนกระทั่งฉันเริ่มเรียกเมธอดในแต่ละอ็อบเจ็กต์ เมื่อฉันสลับการโทร ข้อมูลสำหรับวัตถุหนึ่งจะถูกเขียนไปยังไฟล์ของวัตถุอื่นในตอนแรก แต่จากนั้นข้อมูลจะถูกบันทึกลงในไฟล์ที่ถูกต้อง ตัวอย่างเช่น ต่อไปนี้เป็นตัวอย่างง่ายๆ ของสิ่งที่เกิดขึ้น:
- test1.log() -> เขียนไปที่ test1.log
- test2.log() -> เขียนไปที่ test2.log
- test1.log() -> เขียนบรรทัดไปที่ test2.log จากนั้นส่วนที่เหลือจะถูกเขียนไปที่ test1.log
- test2.log() -> เขียนผ้าสำลีไปที่ test1.log จากนั้นส่วนที่เหลือจะถูกเขียนไปที่ test2.log
หากฉันรันทั้งสองวิธีพร้อมกัน ทุกบรรทัดจะถูกเขียนไปยังไฟล์เดียวหรืออีกไฟล์หนึ่ง แล้วสิ่งที่แปลกจริงๆ ก็คือไฟล์อื่นที่ใช้ส่วนใหญ่ ไม่ เขียนอีกเลย!
ฉันไม่แน่ใจว่าจะดูต่อไปที่ไหน หากฉันสร้างอินสแตนซ์ Logger ผ่าน GetLogger และส่งผ่านชื่อเฉพาะให้กับมัน และนี่คือตัวแปรสมาชิกส่วนตัว เป็นไปได้อย่างไรที่จะเริ่มเขียนไปยังไฟล์ผิด