แนวปฏิบัติที่ดีที่สุดสำหรับการสร้างไลบรารีตัวบันทึกโดยใช้ log4net เป็น

เป้าหมายของฉันคือการสร้างไลบรารี log4net ที่สามารถแชร์ข้ามหลายโครงการได้

ในโซลูชันของฉันซึ่งอยู่ใน. net 4.0 ฉันสร้างไลบรารีคลาสชื่อ Logger และอ้างอิงจากโครงการเว็บ

ตอนนี้ฉันสร้าง logger.config ในไลบรารีคลาสและใส่การกำหนดค่าทั้งหมดลงในไฟล์ logger.config แล้วฉันก็ใช้

[assembly: log4net.Config.XmlConfigurator(Watch = true, ConfigFile = "Logger.config")]

เมื่อฉันเรียกใช้เว็บแอป ไม่มีอะไรถูกบันทึก ดังนั้นฉันจึงเพิ่มโค้ดบรรทัดนี้ใน web.config

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

ซึ่งให้ข้อมูลการดีบักและข้อมูลข้อผิดพลาดแก่ฉัน

ล้มเหลวในการค้นหาส่วนการกำหนดค่า 'log4net' ในไฟล์ .config ของแอปพลิเคชัน ตรวจสอบไฟล์ .config ของคุณเพื่อดูองค์ประกอบและ ส่วนการกำหนดค่าควรมีลักษณะดังนี้:

ฉันย้ายการกำหนดค่าจาก logger.config ไปที่ web.config และดูเหมือนว่าทุกอย่างจะทำงานได้ดี

ฉันไม่ต้องการการกำหนดค่า log4net ใน web.config แต่มี logger.config เป็นวิธีที่สะอาดกว่า เป้าหมายคือการทำให้โปรเจ็กต์อื่นใช้ไลบรารีนี้และไม่ต้องกังวลกับการกำหนดค่าในทุกโปรเจ็กต์

ตอนนี้คำถามคือ ฉันจะทำเช่นนี้ได้อย่างไร? ผมทำอะไรผิดหรือเปล่า? ข้อเสนอแนะพร้อมตัวอย่างโค้ดจะเป็นประโยชน์ต่อทุกคน

โปรดทราบ ฉันกำลังใช้แผนผังโครงสร้าง IOC เพื่อรักคนตัดไม้อีกครั้งก่อนที่จะเข้าสู่ระบบ


person VolleyBall Player    schedule 31.05.2012    source แหล่งที่มา
comment
ฉันขอแนะนำว่าอย่าสร้างไลบรารีตัวบันทึก - เพียงใช้ log4net โดยตรง อาจสร้างวิธีการขยายสองสามวิธีใน ILog หากคุณต้องการจริงๆ   -  person default.kramer    schedule 06.06.2012
comment
คุณได้ลองวางไฟล์ logger.config ลงในโฟลเดอร์ bin ของคุณหรือไม่?   -  person mithun_daa    schedule 06.06.2012
comment
ฉันสงสัยว่าคุณไม่ได้กำหนดค่าไฟล์ปรับแต่งเป็น Copy Always หรือ Copy หากใหม่กว่าในบิลด์ ไฟล์ประเภทเหล่านั้นมักจะถูกตั้งค่าเป็นห้ามคัดลอก   -  person pms1969    schedule 12.06.2012
comment
ไฟล์ logger.config ของคุณอยู่ที่ไหน? ใน Logger Class Library หรือในโครงการที่ใช้งาน นอกจากนี้ คุณจะแก้ไขคนตัดไม้จาก IOC ของคุณอย่างไร   -  person Maciej    schedule 12.06.2012


คำตอบ (3)


ฉันเชื่อว่าคุณกำลังพยายามสร้างวงล้อขึ้นมาใหม่ มีเครื่องมือหลายอย่างในการสรุปตัวบันทึกจากโค้ดของคุณ เพื่อแยกเฟรมเวิร์กตัวบันทึกออกจากโค้ดของคุณ:

http://slf.codeplex.com/

http://netcommon.sourceforge.net/

สิ่งเหล่านี้พบได้บ่อยที่สุดในแอปพลิเคชัน .Net

ตอนนี้ถ้าคุณยืนกรานที่จะใช้นามธรรมของคุณเอง (ซึ่งถูกต้อง) นี่คือข้อเสนอแนะของฉัน:

ก่อนอื่น ฉันคิดว่าคุณจะมีบางอย่างเช่น:

interface ILogger
{
    void Debug(string message);
    void Info(string message);
    void Warn(string message);
    …..
}

ตกลง ดังนั้นในโค้ดของคุณ คุณจะใส่การอ้างอิงตัวบันทึกของคุณแบบซิงเกิลตัน เช่น:

x.For<ILogger>().Singleton().Use<MyLogger>();

ตอนนี้ ฉันมักจะชอบแบบแผนมากกว่าการกำหนดค่า แต่ในกรณีของตัวบันทึก การกำหนดค่าผ่านไฟล์กำหนดค่าเป็นข้อได้เปรียบที่ยิ่งใหญ่ เพราะเมื่อโค้ดของคุณอยู่ในการใช้งานจริง คุณจะต้องการการเปลี่ยนแปลงกฎการบันทึกในบางครั้งโดยการปิดการใช้งานหรือเปิดใช้งานตัวบันทึก เปลี่ยนแปลง ระดับบันทึก และเปิด/ปิดการใช้งานตัวบันทึกที่มีชื่อ

วิธีที่ง่ายที่สุดและนำมาใช้ซ้ำได้มากที่สุดที่ฉันพบว่าทำได้สำเร็จคือการวางการกำหนดค่าในไฟล์ภายนอกตามที่คุณแสดงความคิดเห็น จากนั้นฉันก็ไม่ต้องกังวลกับการเรียก XmlConfigurator ในโค้ด เพราะมันง่ายกว่าสำหรับฉันเพียงแค่เพิ่มการตั้งค่าแอปพลิเคชันสองสามรายการลงใน ไฟล์ปรับแต่งของฉันเช่นนี้

<!-- Relative to the application root path -->
<add key="log4net.Config" value="Logger.log4net"/>
<add key="log4net.Config.Watch" value="True"/>

แค่นั้นแหละ. การตั้งค่าแอปพลิเคชันเหล่านั้นจะแทนที่การกำหนดค่า log4net ของคุณ และง่ายต่อการบำรุงรักษา ไฟล์ปรับแต่งของคุณจะมีลักษณะดังนี้:

<?xml version="1.0" encoding="utf-8" ?>

<!-- This section contains the log4net configuration settings -->
<log4net>

  <!-- Define some output appenders -->

  <appender name="LogFileAppender" type="log4net.Appender.FileAppender" >
    <file value="webapp-log.txt" />
    <appendToFile value="true" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" />
    </layout>
  </appender>

  <!-- Setup the root category, add the appenders and set the default priority -->

  <root>
    <level value="DEBUG" />
    <appender-ref ref="LogFileAppender" />
  </root>

</log4net>

หากต้องการกำหนดค่าผู้ผนวกเพิ่มเติม: คลิกที่นี่

ในโปรเจ็กต์ของคุณ คุณเพียงต้องการการอ้างอิงถึงองค์ประกอบนามธรรมของตัวบันทึก และเฉพาะในโปรเจ็กต์เว็บ (หรือแอปพลิเคชัน Windows เหมือนกัน) ให้เพิ่มไฟล์กำหนดค่า log4net และเฉพาะการตั้งค่าแอปพลิเคชันเหล่านั้น

เนื่องจากคุณกำลังสร้างส่วนประกอบที่นำมาใช้ซ้ำได้ ฉันขอแนะนำให้คุณตั้งค่าเซิร์ฟเวอร์ Nuget ภายในในองค์กรของคุณ (เป็นเพียงแอปพลิเคชัน IIS) และใช้เพื่อปรับใช้ส่วนประกอบของคุณ ในกรณีนี้คือไลบรารีที่มีตัวบันทึก นอกจากนี้ มันจะดีกว่าถ้าคุณสร้างแพ็คเกจ Nuget อื่นที่มีเฉพาะการตั้งค่าแอปพลิเคชันและไฟล์การกำหนดค่า log4net ดังนั้นคุณจึงสามารถติดตั้งแพ็คเกจ Nuget นี้เฉพาะในโครงการเว็บของคุณเท่านั้น

person Jupaol    schedule 10.06.2012
comment
Log4net เป็นปัญหา ฉันจะอัปโหลดเอกสารที่มีความคิดเห็นและข้อความที่ส่งออก ฉันจะให้ค่าหัวแก่คุณเพราะคุณอยู่ใกล้ที่สุดและใกล้เคียงกับสิ่งที่ฉันกำลังมองหา - person VolleyBall Player; 12.06.2012

บางทีสำหรับเว็บแอปพลิเคชันของคุณ คุณสามารถลองโหลดไฟล์การกำหนดค่าใน application_start ของคุณ (globabal.asax.cs)

    void Application_Start(object sender, EventArgs e)
    {
        log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo(Server.MapPath("Logger.config")));
    }
person Hyralex    schedule 09.06.2012

คุณอาจต้องการลองสิ่งนี้: http://forums.asp.net/t/1739162.aspx/1 หรือ อันหนึ่งนี้ เว็บแอปพลิเคชันจะดูเฉพาะ webconfig หลักและกำหนดค่าจากพื้นที่/โฟลเดอร์ หากคุณมี ตามค่าเริ่มต้น คุณควรตรวจสอบให้แน่ใจว่าคุณได้รวมการกำหนดค่าที่จำเป็นทั้งหมดตามด้านล่างใน appConfig ใหม่ของคุณสำหรับ log4net:

  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>

  <log4net>
    <appender name="FileAppender" type="log4net.Appender.FileAppender">
      <file value="logfile.txt"/>
      <appendToFile value="true"/>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] – %message%newline"/>
      </layout>
    </appender>
    <root>
      <level value="DEBUG"/>
      <appender-ref ref="FileAppender"/>
    </root>
  </log4net>

ปล. ตรวจสอบคำตอบนี้ด้วย: web.config สามารถอ่านได้จาก เป็นไฟล์ xml ภายนอกหรือไม่ ตรวจสอบให้แน่ใจว่าคุณปรับใช้ไฟล์กำหนดค่าด้วย หาก web.config ไม่ได้รวมไว้

person radu florescu    schedule 07.06.2012