Log4net ไม่ได้เขียนบันทึกในไฟล์บันทึก


159

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

ฉันได้เพิ่มสิ่งต่อไปนี้ในไฟล์ web.config:

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

<log4net>
    <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
            <file value="D:\MyData\Desktop\LogFile.txt" />
            <appendToFile value="true" />
            <encoding value="utf-8" />
            <layout type="log4net.Layout.SimpleLayout" />
    </appender>


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

ภายในไฟล์ ASAX ทั่วโลกฉันได้เพิ่ม:

ILog logger = LogManager.GetLogger(typeof(MvcApplication));

และภายในเมธอด Application_Start:

logger.Info("Starting the application...");

ทำไมบันทึกการทดสอบ "การเริ่มต้นแอปพลิเคชัน ... " ไม่ถูกเพิ่มลงในไฟล์บันทึก

คำตอบ:


316

คุณโทรมา

log4net.Config.XmlConfigurator.Configure();

ที่ไหนสักแห่งที่จะทำให้ log4net อ่านการกำหนดค่าของคุณ? เช่นใน Global.asax:

void Application_Start(object sender, EventArgs e) 
{
    // Code that runs on application startup

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

4
ขอบคุณมากที่ฉันมีบรรทัดต่อไปนี้: log4net.Config.BasicConfigurator.Configure (); ฉันจะเรียกสิ่งนี้ว่าฉันใช้การกำหนดค่า c # แทน web.config เพื่อกำหนดค่า log4net หรือไม่ นี่คือ "กำหนดค่า" - วิธีการโทรในลักษณะใด ๆ ที่จำเป็นเพราะในบทเรียนจำนวนมากฉันไม่พบบรรทัดของรหัสนี้
john84

9
มีหลายวิธีที่จะบอก log4net ที่จะมองหาการกำหนดค่าให้ดูlogging.apache.org/log4net/release/manual/configuration.html การเรียก XmlConfigurator.Configure () จะทำให้ log4net ค้นหาการกำหนดค่าใน <app.exe> ​​.config หรือ web.config BasicConfigurator.Configure จะ (ตามเอกสาร SDK): "เริ่มต้นระบบการบันทึก log4net โดยใช้ ConsoleAppender ที่จะเขียนไปยัง Console.Out"
Andreas Paulsson

FYI - คุณยังสามารถใช้ log4net.Config.BasicConfigurator ได้หากคุณไม่ต้องการให้มันเป็นไฟล์ เอาต์พุตถูกส่งไปยังคอนโซล
silverArc

1
ฉันกำลังกำหนดค่าในAssemblyInfoไฟล์ โพสต์เป็นคำตอบด้านล่าง
LCJ

Argh พบคำถามเหล่านี้มากมายและทุกที่ที่ไม่สามารถพูดถึงตำแหน่งที่จะค้นหาล็อกไฟล์จริง ... เห็นได้ชัดว่าทุกคนรู้แล้วหรือไม่
MrFox

50

ใช้หน้าคำถามที่พบบ่อยนี้: Apache log4net คำถามที่พบบ่อย

ประมาณ 3/4 วิธีจะบอกวิธีเปิดใช้งานการดีบัก log4net โดยใช้การติดตามแอปพลิเคชัน นี่จะบอกคุณว่าปัญหาของคุณอยู่ที่ไหน

พื้นฐานคือ:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings>
        <add key="log4net.Internal.Debug" value="true"/>
    </appSettings>
</configuration>

และคุณเห็นร่องรอยในเอาต์พุตมาตรฐาน


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

1
ขอบคุณคำตอบนี้ฉันสามารถระบุได้ว่าrootส่วนของฉันอ้างถึงคนตัดไม้ผิด !!
seebiscuit

เคล็ดลับที่ดี ฉันพบว่าการเข้าถึงถูกปฏิเสธสำหรับผู้ใช้ asp.net
Blue Clouds

หากไม่สามารถใช้งานได้กับบางคนโปรดลองใช้วิธีนี้: <log4net> <internal> <Debug value = "true"> </Debug> </internal> </internal> </log4net>
himanshupareek66

35

ตามที่ @AndreasPaulsson แนะนำเราจำเป็นต้องกำหนดค่า ฉันกำลังกำหนดค่าในAssemblyInfoไฟล์ ฉันระบุที่configuration file nameนี่

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

9
จะเกิดอะไรขึ้นถ้าฉันมีทั้งนี้และ log4net.Config.XmlConfigurator.Configure (); โหลด
n00b

1
@ n00b จากนั้นเราสามารถแสดงความคิดเห็นบรรทัดนี้จริง ๆ เท่านั้นด้วยวิธีนี้มันทำงานกับฉัน "log4net.Config.XmlConfigurator.Configure ();" และอีกสิ่งหนึ่ง: ฉันเพิ่มสิ่งนี้ในการตั้งค่า web.config ของฉันด้วย <add key = "log4net.Internal.Debug" value = "true" />
himanshupareek66

33

ตรวจสอบให้แน่ใจว่าได้เลือกตัวเลือก"คัดลอกเสมอ"สำหรับ [log4net] .config

ป้อนคำอธิบายรูปภาพที่นี่


1
นี่คือการแก้ไขสำหรับฉัน ฉันลืมการตั้งค่านี้เสมอ
Ju66ernaut

25

ตรวจสอบให้แน่ใจว่ากระบวนการ (บัญชี) ที่ไซต์ทำงานอยู่นั้นมีสิทธิ์ในการเขียนไปยังไดเรกทอรีผลลัพธ์

ใน IIS 7 และสูงกว่านี้มีการกำหนดค่าในกลุ่มแอปพลิเคชันและโดยปกติจะเป็นAppPool Identityซึ่งโดยปกติจะไม่ได้รับอนุญาตให้เขียนไปยังไดเรกทอรีทั้งหมด

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


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

@ john84 - คุณได้รับการยกเว้นหรือไม่ คุณเคยดูบันทึกเหตุการณ์หรือไม่?
Oded

สิ่งสำคัญเช่นเดียวกับที่ฉันเพิ่งค้นพบโดยมีบริการ Windows ทำงานภายใต้บัญชีที่เฉพาะเจาะจง
Bob Mc

ขอบคุณมากที่ช่วยฉันมาก
Abbas

20

แทรก:

 [assembly: log4net.Config.XmlConfigurator(Watch = true)]

ในตอนท้ายของไฟล์AssemblyInfo.cs


นี่คือความช่วยเหลือของฉัน ทำโครงการฟอร์มบนเดสก์ท็อปและวาง log4net.Config.XmlConfigurator.Configure (); ในหลักไม่ได้ช่วย ขอบคุณ
Tomas Hesse

สิ่งนี้ช่วยฉัน ฉันมีการกำหนดค่าใน web.config แต่ log4net ดูเหมือนจะไม่รับการเปลี่ยนแปลงที่ทำ ฉันเพิ่ม "นาฬิกา = true" เพื่อแอตทริบิวต์ที่และ anithing เริ่มทำงาน
Albe

3

สำหรับฉันฉันย้ายที่ตั้งของ logfiles และมันก็ต่อเมื่อฉันเปลี่ยนชื่อของไฟล์เป็นอย่างอื่นมันเริ่มต้นอีกครั้ง

ดูเหมือนว่ามี logfile ที่มีชื่อเดียวกันนี้อยู่แล้วจะไม่มีอะไรเกิดขึ้น

หลังจากนั้นฉันเปลี่ยนชื่อไฟล์เก่าและเปลี่ยนชื่อไฟล์บันทึกในการกำหนดค่าอีกครั้งกลับไปเป็นเหมือนเดิม


2

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

ดังนั้นระวังช่องว่างในชื่อโครงการ ฉันเรียนรู้บทเรียนของฉัน


1
คุณมีปัญหานี้ที่ไหน Log4Net ทำงานได้ดีในโครงการหนึ่ง แต่ไม่ใช่ในโครงการอื่น ... ไม่รู้ว่าทำไม Tks
Pascal


1

ตรวจสอบให้แน่ใจว่ามีรหัสบรรทัดต่อไปนี้ในไฟล์ AssemblyInfo.cs

[ชุดประกอบ: log4net.Config.XmlConfigurator (ConfigFile = "Web.config", Watch = true)]

และตรวจสอบบรรทัดนี้ใน Application_start () วิธีการ

log4net.Config.XmlConfigurator.Configure();

0

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

var logRepo = LogManager.GetRepository(Assembly.GetEntryAssembly());
XmlConfigurator.Configure(logRepo, new FileInfo("log4net.config"));

หลังจากกระบวนการลงทะเบียนคุณสามารถโทรคำจำกัดความด้านล่างเพื่อโทรหาคนตัดไม้:

private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

log.Error("Sample log");

0

สำหรับฉันฉันต้องย้าย Logger ไปยังแพ็คเกจ Nuget ต้องเพิ่มโค้ดด้านล่างในโครงการแพ็คเกจ NuGet

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config")]

ดูhttps://gurunadhduvvuru.wordpress.com/2020/04/30/log4net-issues-when-moved-it-to-a-nuget-package/สำหรับรายละเอียดเพิ่มเติม


พยายามหลีกเลี่ยงลิงก์เป็นคำตอบ พวกเขาอาจไม่ทำงาน อาจแก้ไขคำตอบของคุณเพื่อรวมข้อมูลสรุปไว้ในลิงค์
Derek C.

0

มีสองสามวิธีในการใช้ log4net ฉันพบว่ามันมีประโยชน์ในขณะที่ฉันกำลังค้นหาวิธีแก้ไข วิธีแก้ไขมีอธิบายไว้ที่นี่: https://www.hemelix.com/log4net/

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.