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

Ref https://pixabay.com/th/การวิเคราะห์-ข้อมูล-นวัตกรรม-3088958/

จาก 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 โดยระบุชื่อไฟ์ไปตรงๆเลยครับ
  • ของใหม่ – มีการปรับที่ RollingLogFileAppender ให้ Log มันเข่ียนแยกตามไฟล์ โดยใช้ Log4Net Pattern String ครับ ซึ่งมีการกำหนด Pattern จาก Process Id ของ exe ที่ เปิดอยู่ในหน้าจอ Task Manager ครับ โดยดึง Process Id จาก Config [%processid] ส่วนวันที่อันนี้ผมเพิ่มเองครับ จะได้ดู Log ง่ายๆ โดยกำหนด Config ดังนี้ %utcdate{yyyy-MM-dd}

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

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

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

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