Log4net กลิ้งชื่อไฟล์รายวันพร้อมวันที่ในชื่อไฟล์


คำตอบ:


103

ในไฟล์กำหนดค่า Log4net ของคุณให้ใช้พารามิเตอร์ต่อไปนี้กับ RollingFileAppender:

<param name="DatePattern" value="dd.MM.yyyy'.log'" />

28
ปรากฏว่าสิ่งนี้ได้รับการเลื่อนขั้นเป็นองค์ประกอบกำหนดค่า: <datePattern value = "dd.MM.yyyy'.log '" /> ไชโย!
longda

3
@mstaessen <preserveLogFileNameExtension value="true" />เป็นไวยากรณ์ที่ถูกต้องและนี่คือคำตอบที่ดี การสูญเสียเกิดขึ้นได้อย่างไรฉันขอถามได้ไหม
Larry B

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

207
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
  <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
  <file value="logs\" />
  <datePattern value="dd.MM.yyyy'.log'" />
  <staticLogFileName value="false" />
  <appendToFile value="true" />
  <rollingStyle value="Composite" />
  <maxSizeRollBackups value="10" />
  <maximumFileSize value="5MB" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
  </layout>
</appender>

1
ฉันคิดว่าคุณควรเน้นประเด็นหลักของพารามิเตอร์ที่จะแก้ปัญหาเหมือนที่ @Mun ทำ อย่างไรก็ตามฉันยังโหวตให้กับคำตอบของคุณ
RDeveloper

1
มันเป็นองค์ประกอบ datePattern ร่วมกับองค์ประกอบ staticLogFileName (และสังเกตแอตทริบิวต์ค่าสำหรับองค์ประกอบไฟล์) ที่เหมาะกับฉัน
Michhes

คำตอบที่สมบูรณ์!
Nagesh

32

สำหรับ RollingLogFileAppender คุณต้องมีองค์ประกอบและค่าเหล่านี้ด้วย:

<rollingStyle value="Date" />
<staticLogFileName value="false" />

3
ใช้งานได้ แต่ต่อท้ายวันที่หลังนามสกุลไฟล์ ตัวอย่างเช่นฉันได้รับไฟล์บันทึกเช่น Error.log20111104 - มีใครรู้วิธีจัดรูปแบบชื่อไฟล์ให้ดีขึ้นบ้างไหม
LostNomad311

วิธีจัดรูปแบบชื่อไฟล์ให้ดีขึ้น: stackoverflow.com/questions/615092/…
LostNomad311

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

22

การใช้ Log4Net 1.2.13 เราใช้การตั้งค่าการกำหนดค่าต่อไปนี้เพื่อให้เวลาวันที่ในชื่อไฟล์

<file type="log4net.Util.PatternString" value="E:/logname-%utcdate{yyyy-MM-dd}.txt" />

ซึ่งจะให้ไฟล์ตามหลักการต่อไปนี้: logname-2015-04-17.txt

ด้วยวิธีนี้คุณควรมีสิ่งต่อไปนี้เพื่อให้แน่ใจว่าคุณถือ 1 บันทึกต่อวัน

<rollingStyle value="Date" />
<datePattern value="yyyyMMdd" />

หากขนาดของไฟล์เป็นปัญหาสิ่งต่อไปนี้จะอนุญาตให้มีไฟล์ขนาด 5MB 500 ไฟล์จนกว่าจะถึงวันใหม่ CountDirectionอนุญาตให้มีการเรียงลำดับไฟล์จากน้อยไปมากหรือมากไปหาน้อยซึ่งไม่เป็นปัจจุบันอีกต่อไป

 <maxSizeRollBackups value="500" />
 <maximumFileSize value="5MB" />
 <rollingStyle value="Composite" />
 <datePattern value="yyyyMMdd" />
 <CountDirection value="1"/>
 <staticLogFileName value="true" />

18

ฉันลงเอยด้วยการใช้ (สังเกตชื่อไฟล์ ".log" และเครื่องหมายคำพูดเดียวรอบ ๆ 'myfilename_'):

  <rollingStyle value="Date" />
  <datePattern value="'myfilename_'yyyy-MM-dd"/>
  <preserveLogFileNameExtension value="true" />
  <staticLogFileName value="false" />
  <file type="log4net.Util.PatternString" value="c:\\Logs\\.log" />

สิ่งนี้ทำให้ฉัน:

myfilename_2015-09-22.log
myfilename_2015-09-23.log
.
.

preserveLogFileNameExtensionใช้ไม่ได้กับ log4net เวอร์ชันก่อนหน้า (เช่น v1.2.10) ตามที่อธิบายไว้ที่นี่
Dmitry Karpenko

13

ฉันได้ลองคำตอบทั้งหมดแล้ว แต่มักจะมีบางอย่างหายไปและไม่ทำงานตามที่ฉันคาดไว้

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

<appender name="RollingActivityLog" type="log4net.Appender.RollingFileAppender">
  <file type="log4net.Util.PatternString" value="C:\temp\LOG4NET_Sample_Activity.log" />
  <appendToFile value="true" />
  <rollingStyle value="Date" />
  <staticLogFileName value="false" />
  <preserveLogFileNameExtension value="true" />
  <datePattern value="-yyyyMMdd" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date %-5level - %message%newline" />
  </layout>
</appender>

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

ตอนนี้ด้วยการตั้งค่านี้คุณจะได้รับไฟล์เช่นนี้:

LOG4NET_Sample_Activity-20171215.log

ซึ่งเป็นสิ่งที่ฉันต้องการ


สรุป:

  • อย่าใส่รูปแบบวันที่ใน<file value=...แอตทริบิวต์เพียงกำหนดในรูปแบบdatePattern.

  • ตรวจสอบให้แน่ใจว่าคุณมีpreserveLogFileNameExtension ค่าtrueชุดแอตทริบิวต์

  • ให้แน่ใจว่าคุณมีstaticLogFileName ค่าfalseชุด

  • ตั้งค่าrollingStyleแอตทริบิวต์ค่าDateไป


คุณยังสามารถตั้งค่า RollingStyle เป็น Composite ซึ่งจะแสดงทั้งวันที่และขนาด
Simon Tewsi

1
ใช้งานได้ดี ฉันจะเพิ่มในการสรุป: ตรวจสอบให้แน่ใจว่าคุณได้ตั้งค่า staticLogFileName เป็นเท็จ
Randall Flagg

5

เพื่อรักษานามสกุลไฟล์:

<log4net>
    <root>
      <level value="DEBUG"/>
      <appender-ref ref="RollingLogFileAppender"/>
    </root>
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <file type="log4net.Util.PatternString" value="D:\\LogFolder\\%date{yyyyMM}\\SchT.log" />
      <appendToFile value="true" />
      <rollingStyle value="Date" />
      <maximumFileSize value="30MB" />
      <staticLogFileName value="true" />
      <preserveLogFileNameExtension value="true"/>
      <datePattern value="ddMMyyyy" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
      </layout>
    </appender>
  </log4net>

ทำไมมี%date{yyyyMM}และvalue="ddMMyyyy" ? รูปแบบวันที่มีผลคืออะไร?
Allan Ruin

ฉันคิดว่า datePattern ใช้สำหรับชื่อไฟล์ แต่% date {yyyyMM} เป็นไดเร็กทอรีหลัก (ฉันต้องการแบบนั้น)
Fourat

แอตทริบิวต์ datePattern ตั้งค่าช่วงเวลาต่อเนื่องสำหรับ Date rollingStyle ดู logging.apache.org/log4net/release/config-examples.htmlภายใต้ RollingFileAppender "ตัวอย่างเช่นรูปแบบวันที่ของ" yyyyMMdd "จะหมุนเวียนทุกวันโปรดดู System.Globalization.DateTimeFormatInfo สำหรับรายการรูปแบบที่ใช้ได้"
Ryan Buddicom

@rbuddicom ใช่ แต่คำถามคือเกี่ยวกับวิธีการรักษานามสกุลไฟล์
Fourat

ฉันรู้ว่าอัลลันตั้งคำถามถึงจุดประสงค์ของ 'value = "ddMMyyyy"' ความคิดเห็นของคุณ "ฉันคิดว่า datePattern เป็นชื่อไฟล์" ไม่ถูกต้องในเรื่องนั้น
Ryan Buddicom

0

ส่วนการกำหนดค่าเพิ่มเติมในการตอบกลับก่อนหน้าด้วย

 ...
 ...
 <rollingStyle value="Composite" />
 ...
 ...

ใช้งานได้ตามรายการ แต่ฉันไม่ต้องใช้

<staticLogFileName value="false" /> 

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


สำหรับฉันมันจะใช้ไม่ได้หากไม่มี <staticLogFileName value = "false" />
nurettin

ฉันเช่นกันต้องตั้งค่า staticLogFileName เป็นเท็จมิฉะนั้นจะไม่เข้าสู่ระบบ
oonyalo

0

ฉันย้ายการกำหนดค่าไปยังรหัสเพื่อให้สามารถแก้ไขได้ง่ายจาก CI โดยใช้ตัวแปรระบบ ฉันใช้รหัสนี้สำหรับชื่อไฟล์และผลลัพธ์คือ 'Log_03-23-2020.log'

            log4net.Repository.ILoggerRepository repository = LogManager.GetRepository(Assembly.GetEntryAssembly());
            Hierarchy hierarchy = (Hierarchy)repository;
            PatternLayout patternLayout = new PatternLayout();
            patternLayout.ConversionPattern = "%date %level - %message%newline%exception";
            patternLayout.ActivateOptions();

            RollingFileAppender roller = new RollingFileAppender();
            roller.AppendToFile = true;
            roller.File = "Log_";
            roller.DatePattern = "MM-dd-yyyy'.log'";
            roller.Layout = patternLayout;
            roller.MaxFileSize = 1024*1024*10;
            roller.MaxSizeRollBackups = 10;
            roller.StaticLogFileName = false;
            roller.RollingStyle = RollingFileAppender.RollingMode.Composite;
            roller.ActivateOptions();
            hierarchy.Root.AddAppender(roller);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.