2013-02-19 17 views
14

Ben same issue as HENRI COOK did üzerinde duruyorum. Kısa açıklamadan anlayabildiğimiz kadarıyla bug on Apache Jira olarak bildirilmiştir.Log4Net RollingFileAppender düşük hacimli kütük ile IO arabellek yıkama değil

Asıl sorunum, olayların yalnızca uygulama kapatıldığında (etkinlikten haftalar sonra bile) günlüğe kaydedilir olmasıdır. Bu, günlük kaydı çok düşük olduğunda olur. Bunu bir Windows Server 2008 R2'de görüyorum. Bu, üretim hatalarına yakalanma ve tepki vermemizi engeller.

Şimdi ekleyici bir arabellek değil. Varsayılan olarak, her seferinde bir mesaj eklendiğinde, temel alınan akışta Flush() öğesini çağırır.

Sorumu NEDEN FAZLA DEĞİLDİR? Ve programatically flushing all appenders dışında herhangi bir çare var mı? Bir pulsing appender uygun bir geçici çözümü düşünür müsün?

appender yapılandırma: Ben herhangi bir kod ile davranışı yeniden mümkün olmamıştır 2013-06-19

<appender name="RollingErrorFileAppender" type="log4net.Appender.RollingFileAppender"> 
    <param name="File" value="D:\LogFiles\zzzz\xxxxxx__ERROR" /> 
    <param name="AppendToFile" value="true" /> 
    <param name="DatePattern" value="_yyyyMMddHH&quot;.log&quot;" /> 
    <param name="RollingStyle" value="Date" /> 
    <param name="StaticLogFileName" value="false" /> 
    <filter type="log4net.Filter.LevelRangeFilter"> 
    <param name="LevelMin" value="ERROR" /> 
    <param name="LevelMax" value="FATAL" /> 
    </filter> 
    <layout type="log4net.Layout.PatternLayout"> 
    <param name="ConversionPattern" value="%utcdate{yyyy-MM-dd HH:mm:ss.fff},[%thread],%level,%logger,%m%n"/> 
    </layout> 
</appender> 

GÜNCELLEME. Ne kadar kötü çalışsam da, veri her zaman diske derhal yazılır. Ancak, önemli bir gözlem yapıldı: Bir dosyaya ilk yazma 1KiB'den büyükse, değiştirilen zaman, sonraki yazımlarla hiçbir zaman güncellenmez. Sadece dosya kapanma zamanı ile kapatıldığında güncellenecektir. Öte yandan, ilk yazma kısa bir tek katlıysa, sonraki herhangi bir yazma işlemi değiştirilen zamanı güncelleyecektir. Bu davranış, log4net ve manuel IO işlemi arasında, 32bit WinXP ve 64bit W2k8R2 arasında, .NET 2.0, 3.5 ve .NET 4.0 arasında tutarlıdır. Bu hala sorunu çözmez, ama en azından şimdi tuhaf değişiklik zaman modelini anlayabilirim. Hata düzeyinde ya da daha kötüsü günlük olayları ile ilgilenmekteyiz ve bu trafik Neyse seyrek olduğundan

Teşekkür Rob

+0

kullandığınız appender için yapılandırma gönderebilir miyim:

class Program { static void Main(string[] args) { ILog log = LogManager.GetLogger(typeof(Program)); XmlConfigurator.Configure(new FileInfo(@"C:\temp\logTest.config")); string msg; while ((msg = Console.ReadLine()) != "Done") { log.Error(msg); } LogManager.Shutdown(); } } 

logTest.config ana prog tarafından başvurulan? –

+0

@AdamS, config eklendi, teşekkürler – Rbjz

+0

Ve açıklığa kavuşturmak için, bu süre boyunca en az bir HATA düzeyi veya daha yüksek bir kayıt olayı olduğunda, günlüklerin her saatte yuvarlanmadığını görmüyor musunuz?Uygulayıcınızla test ettim ve testere kütükleri düzgün bir şekilde sıyrılıp yuvarlandı. –

cevap

25

, ben hemen floş için appender yapılandırılması öneririm.

<param name="ImmediateFlush" value="true" /> 

Bu programlı (onun sesinden zaten çalışma değildi) her günlük etkinliğine appender temizlemek zorunda sizi kurtarır. Şimdi, ekleyicinizi daha fazla günlük seviyesine kadar açmak isterseniz, elbette tüm olayları hemen ortadan kaldırarak daha fazla performans kaygısı olabilir.

DÜZENLEME Ben yapılandırma dosyası ve test için kullanılan basit bir ana programı eklendi. Aşağıdakileri kullanarak, günlük olaylarının hemen temizlendiğini görüyorum. Yorumunuzla ilgili olarak, xml'den ImmediateFlush satırını da çıkarabilir ve yıkama için varsayılan true değerine bakabilirsiniz. Örneğimde çizgiyi istenen davranışı açıkça belirtmek amacıyla tuttum.

Temel ana prog:

<log4net> 
    <appender name="RollingErrorFileAppender" type="log4net.Appender.RollingFileAppender"> 
     <param name="File" value="C:\temp\log" /> 
     <param name="AppendToFile" value="true" /> 
     <param name="DatePattern" value="_yyyyMMddHH&quot;.log&quot;" /> 
     <param name="RollingStyle" value="Date" /> 
     <param name="StaticLogFileName" value="false" /> 
     <param name="ImmediateFlush" value="true" /> 
     <filter type="log4net.Filter.LevelRangeFilter"> 
      <param name="LevelMin" value="ERROR" /> 
      <param name="LevelMax" value="FATAL" /> 
     </filter> 
     <layout type="log4net.Layout.PatternLayout"> 
      <param name="ConversionPattern" value="%utcdate{yyyy-MM-dd HH:mm:ss.fff},[%thread],%level,%logger,%m%n"/> 
     </layout> 
    </appender> 
    <root> 
     <level value="INFO" /> 
     <appender-ref ref="RollingErrorFileAppender" /> 
    </root> 
</log4net> 
+1

Teşekkürler @AdamS, yine de katılmıyorum. Özel bool m_immediateFlush = true koduna bakarsanız ve 'v1.2.10 TextWriterAppender'da (LoggingEvent loggingEvent) Eklenen korumalı geçersiz kılmayı geçersiz kılarsanız (http://svn.apache.org/viewvc/logging/log4net/ etiketleri/log4net-1.2.10/src/Appender/TextWriterAppender.cs? view = işaretleme), ImmediateFlush varsayılan olarak doğru olduğunu ve bu nedenle zaten aslında her Append() üzerinde Flush() Flush() çağırır benimle aynı fikirde olacaksınız Q: – Rbjz

+1

cevabımı kullandığım test programıyla düzenledim. Bununla olayları hemen temizledim görebiliyorum. Aynı davranışı görmüyor musunuz? –

+0

Teşekkürler AdamS, bu harika bir fikir. Umarım yarın deneyeceğim. – Rbjz