log4net ไม่ทำงาน


123

สวัสดีฉันมีการกำหนดค่านี้ใน web.config ของฉัน

<log4net>
    <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
        <param name="File" value="mylog.log" />
        <param name="AppendToFile" value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <param name="Header" value="" />
            <param name="Footer" value="" />
            <param name="ConversionPattern" value="%d [%t] %-5p %m%n" />
        </layout>
    </appender>
    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
        <layout type="log4net.Layout.PatternLayout">
            <param name="Header" value="[Header]\r\n" />
            <param name="Footer" value="[Footer]\r\n" />
            <param name="ConversionPattern" value="%d [%t] %-5p %m%n" />
        </layout>
    </appender>
    <root>
        <level value="DEBUG" />
        <appender-ref ref="LogFileAppender" />
        <appender-ref ref="ConsoleAppender" />
    </root>
</log4net>

แต่ log4net ไม่ทำงาน โครงการของฉันรวบรวมได้ดีและฉันไม่ได้รับข้อผิดพลาดในการดีบักเช่นกัน บรรทัดที่ฉันบอกให้log.debug("somemessage")ทำงานได้ดี แต่ฉันไม่พบmylog.logไฟล์แล้วมันอยู่ที่ไหน?


อย่าลืมตรวจสอบสิ่งนี้ด้วย: stackoverflow.com/a/24617269/114029
Leniel Maccaferri

คำตอบ:


298

gotcha อย่างหนึ่งสำหรับประเภทนี้คือต้องแน่ใจว่าได้เพิ่มXmlConfiguratorแอตทริบิวต์ลงในแอสเซมบลีโดยวางบรรทัดต่อไปนี้ในAssemblyInfo.cs:

[assembly: log4net.Config.XmlConfigurator]

มิฉะนั้น log4net จะไม่เปิดใช้งาน


5
วิธีนี้ใช้ในโครงการของฉัน แต่มันหยุดทำงานอย่างใดอย่างหนึ่ง ฉันต้องใช้วิธีนี้stackoverflow.com/a/1479343/193634เพื่อให้มันใช้งานได้อีกครั้ง
Rosdi Kasim

ฉันเพิ่งลองอีกครั้งและใช้งานได้ดี เป็นไปได้มากว่าคุณไม่ได้อ้างอิง / โหลดแอสเซมบลีที่มีAssemblyInfoทันทีที่คุณคิด
Kirk Woll

สำหรับผู้ที่ใช้ ELMAH appender นี่คือวิธีที่จะไป ฉันมี 'log4net.Config.XmlConfigurator.Configure ();' ใน global.asax.cs และใช้งานได้ดีสำหรับตัวผนวกไฟล์ แต่ไม่ใช่สำหรับตัวผนวก ELMAH
user3885927

ฉันได้ตรวจสอบคำตอบนี้แล้วและพบว่าฉันจำเป็นต้องปรับแต่งด้วย `[assembly: log4net.Config.XmlConfigurator (Watch = true)]`
David Savage

49

ฉันเดาว่า log4net ไม่ได้บันทึกเลยหรือไฟล์ไม่ได้จบลงอย่างที่คุณคาดหวัง

ประการแรกคุณได้โทร

XmlConfigurator.Configure()

ที่ใดก็ได้ในรหัสของคุณ? หากข้อมูลโค้ด xml ด้านบนอยู่ในไฟล์คอนฟิกูเรชันของแอปพลิเคชันการเรียกนี้จะทำเคล็ดลับ หากข้อมูลโค้ด xml อยู่ในไฟล์ของตัวเองคุณจะต้องใช้.Configure(string)โอเวอร์โหลดที่ใช้พา ธ ไปยังไฟล์ หากไม่มีการเรียกนี้ (หรือเห็นได้ชัดว่าแอตทริบิวต์ระดับแอสเซมบลีที่กล่าวถึงโดย Kirk Woll) log4net จะไม่ถูกบันทึกเลย

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


33

มี gotcha ขนาดเล็กอีกตัวดูที่นี่: http://logging.apache.org/log4net/release/manual/configuration.html#dot-config

[assembly: log4net.Config.XmlConfigurator]วิธีการไม่ได้ทำงานกับ app.config หากคุณกำหนดค่า log4net จาก app.config คุณต้องใช้log4net.Config.XmlConfigurator.Configure()เมธอด


สำหรับบันทึกทั้งสองวิธีใช้ได้ผลกับฉันในแอปพลิเคชันคอนโซล
rageit

ฉันยืนยันวิธีแก้ปัญหาข้างต้น - ฉันต้องเรียกใช้ log4net.Config.XmlConfigurator.Configure (); ในโค้ดของฉัน (ซึ่งใช้ app.config เพื่อให้ log4net ทำงานได้อย่างมีประสิทธิภาพบรรทัดที่พิมพ์ได้อย่างมีประสิทธิภาพคือบรรทัดที่ตามมาจากการดำเนินการของเมธอด Configure ()
luisa rosi

19

นี่คือรายการตรวจสอบของฉันเมื่อ log4net พิสูจน์ว่าบิดพลิ้ว:

  • ตรวจสอบให้แน่ใจว่าไฟล์ log4net.config ถูกคัดลอกไปยัง bin \ folder เมื่อสร้าง (ตั้งค่าเป็น 'Copy if newer' ในคอมไพเลอร์)
    • เมื่อจัดการกับโค้ดที่ติดตั้งตรวจสอบให้แน่ใจว่า log4net.config มาพร้อมกับการขับขี่ (ตั้งค่าเป็น 'เนื้อหา' ในคอมไพเลอร์)
  • ตรวจสอบให้แน่ใจว่าผู้ใช้ที่กระบวนการทำงานตามที่มีสิทธิ์ในการเขียนไปยังโฟลเดอร์ที่จะเขียนบันทึก
  • หากมีข้อสงสัยให้สิทธิ์ที่สำส่อน c: \ temp \ และรับทุกอย่างเพื่อเข้าสู่ระบบที่นั่น ()
  • เปิด Sysinternal / Dbgview.exe เพื่อดูว่ามันบอกอะไรคุณหรือไม่

3
"ตรวจสอบให้แน่ใจว่าไฟล์ log4net.config ถูกคัดลอกไปยัง bin \ folder เมื่อสร้าง (ตั้งค่าเป็น 'Copy if newer' ในคอมไพเลอร์)" -> บันทึกวันของฉัน! ขอบคุณมาก!
Hoang Nguyen Huu

8

สำหรับการเพิ่มโครงการ ASP.NET MVC

log4net.Config.XmlConfigurator.Configure();

ไปยัง Global.asax.cs ยังช่วย:

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        AuthConfig.RegisterAuth();

        log4net.Config.XmlConfigurator.Configure();
    }
}

1
มีปัญหาแปลก ๆ เกี่ยวกับเรื่องนี้ในการผลิตและในคอมพิวเตอร์ของเจ้านายของฉันคนตัดไม้ทำงานได้ดีเช่นนี้ แต่ไม่ใช่จนกว่าคำตอบของฉัน Kirk จะทำงานบนคอมพิวเตอร์ของฉัน แค่คิดว่าฉันจะบอกให้คนอื่นรู้ในกรณีที่พวกเขามีปัญหาที่คล้ายกัน (โครงการ MVC btw)
Shelby115

@ Shelby115 ขอบคุณมาก! ฉันพยายามใส่รายการ log4Net ของฉันใน ELMAH ฉันมีทุกอย่างถูกต้องใน web.config ฉันมี 'log4net.Config.XmlConfigurator.Configure ();' อยู่แล้ว ใน global.asax.cs ของฉัน แต่มันไม่ทำงาน มาที่โพสต์ SO นี้และเพิ่มบรรทัดไปยัง assemblyInfo.cs ตาม Kirk's มันยังไม่ได้ผล!. หลังจากอ่านความคิดเห็นของคุณฉันได้ลบรายการก่อนหน้านี้ออกจาก global.asax.cs และมันก็เริ่มทำงาน ฉันใช้เวลาหลายชั่วโมงกับเรื่องนี้และความคิดเห็นของคุณก็ช่วยได้มาก ขอบคุณอีกครั้ง!
user3885927

รายการใน global.asax.cs ทำงานได้ดีสำหรับ file appender แต่ไม่ใช่สำหรับตัวผนวก ELMAH วิธีของ Kirk ใช้กับ ELMAH appender (โดยเฉพาะฉันต้องลบออกในรูปแบบ global.asax.cs)
user3885927

คุณอาจต้องการตรวจสอบให้แน่ใจว่า log4net มีสิทธิ์ในการเขียนไปยังไดเร็กทอรีที่กำหนดค่าสำหรับล็อกไฟล์
Oladipo Olasemo

@ Shelby115 แดงต้องรักมันเมื่อคุณลืมวิธีแก้ปัญหาและความคิดเห็นของคุณเองช่วยแก้ปัญหาของคุณ การมาถึงหน้าที่มีคำตอบที่คุณโหวตแล้วก็เป็นตัวบ่งชี้ที่ดีเช่นกัน
Shelby115

7

นี่คือขั้นตอนที่ทำให้การบันทึกไฟล์ของฉันทำงานได้ในที่สุด:

  • -Check AssemblyInfo.cs มีแอตทริบิวต์ต่อไปนี้ [assembly: log4net.Config.XmlConfigurator] สิ่งนี้โหลด log4net
  • ตรวจสอบไดเร็กทอรีบันทึกว่ามีสิทธิ์ในการเขียน
  • ตรวจสอบว่าคนตัดไม้มีรูปแบบที่ระบุ ทำได้โดยการตรวจสอบแต่ละองค์ประกอบในการกำหนดค่าของคุณว่ามีองค์ประกอบเค้าโครงระบุไว้ เช่น:

<appender name="MainLogger"... <layout type="log4net.Layout.SimpleLayout"/>

  • สุดท้ายลองเปิดการบันทึกภายใน log4net เพื่อเปิดใช้งานการบันทึกคอนโซลและตรวจสอบคอนโซล การทำเช่นนี้เพิ่มที่คุณ<add key="log4net.Internal.Debug" value="true"/>appSettings

<add key = "log4net.Internal.Debug" value = "true" /> สิ่งนี้ช่วยฉันในการแก้ไขปัญหา ขอบคุณ
Ravi Khambhati

สิทธิ์ของไดเรกทอรีคือสิ่งที่ทำให้ฉันได้รับ
Omar Himada

6

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

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

สำหรับวัตถุประสงค์ในการทดสอบคุณอาจต้องการสร้างไฟล์บนดิสก์ด้วยตนเองที่ควรเขียนและเปิดสิทธิ์สำหรับทุกคนที่จะเขียนมัน ถ้าคนตัดไม้เริ่มเขียนมันคุณจะรู้ว่ามันได้รับอนุญาตตามการกำหนดค่ามากกว่า


2

ในด้านของฉันฉันลืมทำเครื่องหมายไฟล์กำหนดค่าที่จะคัดลอกในขณะที่กำลังคอมไพล์แอป

คัดลอกไฟล์กำหนดค่าไปยังไดเร็กทอรีเอาต์พุต

เพียงคลิกขวาที่ไฟล์ log4net.config เลือกคุณสมบัติจากนั้นเลือก Copy to Output Directory เพื่อเป็น Copy XXXX


1

ฉันลองทำทุกข้อแล้ว แต่ไม่ได้ผล การเพิ่มบรรทัดนี้ในส่วนของ app.config ใช้ได้ผล configSectionsสำหรับฉัน

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net, Version=1.2.15.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a" />

ตรวจสอบให้แน่ใจว่าVersionและPublicKeyTokenถูกต้อง


0
<param name="File" value="mylog.log" />

กำลังพูดว่า "เขียน mylog.log ไปยังโฟลเดอร์จริง" ซึ่งหมายความว่าหากเว็บแอปของคุณอยู่ภายใต้ IIS บันทึกจะถูกเขียนไปที่ C: \ inetpub \ wwwroot \ appname \ mylog.log

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

เรียกใช้ VS ในโหมดดีบักด้วยเพื่อดูว่ามีข้อยกเว้น (Debug-> exceptions-> CLR exceptions, check Thrown)


0

ในกรณีของฉันฉันลืมตั้งค่าคุณสมบัติไฟล์ log4Net.config เป็น "เนื้อหา" ดังนั้นไฟล์จึงไม่รวมอยู่ในการปรับใช้ ดังนั้นให้ความสนใจกับมัน:

Compile action : Content

0

น่าเสียดายที่ไม่มีข้อใดช่วย การกำหนดค่าที่ชัดเจนในคลาสที่จะบันทึกเพิ่มเติมจากคำแนะนำการตั้งค่าก่อนหน้านี้เป็นเคล็ดลับสำหรับฉัน

string assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
log4net.Config.XmlConfigurator.Configure(new FileInfo(assemblyFolder + "/log4net.config"));

-7

หลังจากผ่านไปหลายชั่วโมงฉันก็รู้ว่าทำไมมันถึงไม่ได้ผลสำหรับฉัน ...

ฉันมี:

public static class Program
{

    private static CommunicationManager _bcScanner = new CommunicationManager();
    private static ILog _log = LogManager.GetLogger(typeof(Program));
    private static SocketServer socketListener;

แต่ควรเป็น:

public static class Program
    {
        private static ILog _log = LogManager.GetLogger(typeof(Program));
        private static CommunicationManager _bcScanner = new CommunicationManager();
        private static SocketServer socketListener;

ดังนั้นตรวจสอบให้แน่ใจว่า ILog อยู่ในบรรทัดแรก ....


1
นี่ไม่ใช่สาเหตุแน่นอน ไม่สำคัญว่าเมื่อคุณเริ่มต้นอ็อบเจ็กต์ ILog ตราบใดที่คุณทำเช่นนั้นก่อนที่จะโทรไปยังวิธีการบันทึกเช่น _log.Info; _log.error ฯลฯ
Oladipo Olasemo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.