[C#] ให้ Log4net เขียน Log แยกตาม Process Id ของ Application

จาก Blog ตอนก่อนของ Site ได้ Deploy ตัว .Net App ไว้ที่ Windows Server ไว้ที่ Drive C: แล้วให้ User Remote เข้ามาใช้งานครับ แต่พอเวลามีปัญหามันดัน Write Log ไม่ได้ครับ เพราะ Application ทุกตัวที่ที่รันขึ้นมา ดันเขียน Log ลงไปที่ Path และไฟล์ชื่อเดียวกันครับ ทำให้ User สามารถเปิดโปรแกรมใช้งานได้แค่ 1 Instance เท่านั้นครับ เมื่อทาง Dev ต้องการหาสาเหตุของ Defect บางข้อครับ แต่เรื่องนี้มันก็ขัดใจสำหรับ User มากๆ ที่ไม่สามารทำงานได้ครับ

สำหรับทางแก้ - ใช้ Log4Net มันเขียน Log File ตาม Process Id ของ exe ที่เปิดอยู่ครับ โดยสามารถไปแก้ที่ตัว Appender ได้ ดังนี้

  • ของเดิม - ที่ RollingLogFileAppender เขียน Log โดยระบุชื่อไฟ์ไปตรงๆเลยครับ
    <file value="C:\\Ext\\Log\\EXTENSION_LOG.txt" />
  • ของใหม่ - มีการปรับที่ RollingLogFileAppender ให้ Log มันเข่ียนแยกตามไฟล์ โดยใช้ Log4Net Pattern String ครับ ซึ่งมีการกำหนด Pattern จาก Process Id ของ exe ที่ เปิดอยู่ในหน้าจอ Task Manager ครับ โดยดึง Process Id จาก Config [%processid] ส่วนวันที่อันนี้ผมเพิ่มเองครับ จะได้ดู Log ง่ายๆ โดยกำหนด Config ดังนี้ %utcdate{yyyy-MM-dd}
    <file type="log4net.Util.PatternString" value="C:\\Ext\\Log\\EXTENSION_LOG-%utcdate{yyyy-MM-dd}-[%processid].txt" />

สำหรับตัว Appender เต็มๆครับ

โดยการเดิม [%processid]  ลงไปใน value ที่กำหนด Path และชื่อไฟล์ ในส่วนของ PatternString

<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
    <file type="log4net.Util.PatternString" value="C:\\Ext\\Log\\EXTENSION_LOG-%utcdate{yyyy-MM-dd}-[%processid].txt" />
    <appendToFile value="true" />
    <rollingStyle value="Composite" />
    <datePattern value="yyyyMMdd" />
    <maxSizeRollBackups value="10" />
    <maximumFileSize value="1MB" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level (%file:%line) [%property{NDC}] - %message%newline" />
    </layout>
</appender>

ตัวอย่างชื่อของ Log File ที่ได้มาครับ

  • EXTENSION_LOG-2018-04-16-[4588] โดยเป็น Log ของ Application Extension ณ วันที่ 2018-04-16 และมี Process Id = 4588

Discover more from naiwaen@DebuggingSoft

Subscribe to get the latest posts to your email.