Aralıklı log4net RollingFileAppender kilitli dosya sorunu


113

Geliştirme ve üretim makinelerinde aralıklı olarak günlük dosyalarımızın oturum açmadığı bir sorun görüyoruz.

Visual Studio kullanarak geliştirme ve hata ayıklamada çalışırken, VS çıktı penceresinde aşağıdaki log4net hata mesajlarını alıyoruz:

log4net:ERROR [RollingFileAppender] Unable to acquire lock on file C:\folder\file.log.

İşlem, başka bir işlem tarafından kullanıldığından 'C: \ klasör \ dosya.log' dosyasına erişemiyor.

log4net:ERROR XmlConfigurator: Failed to find configuration section 'log4net' in the application's .config file.
Check your .config file for the <log4net> and <configSections> elements.

Yapılandırma bölümü şöyle görünmelidir:

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

Sorun için mevcut çözümümüz, son günlük dosyasını yeniden adlandırmaktır. Elbette bunun başarısız olmasını beklerdik (yukarıda bahsedilen dosya kilidi nedeniyle), ancak normalde başarısız olmaz. Aspnet_wp.exe işlemindeki bir kilitlenme nedeniyle bir veya iki kez yeniden adlandırma başarısız oldu .

Log4net yapılandırma bölümümüz aşağıda gösterilmiştir:

<log4net>
  <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
    <file value="C:\folder\file.log"/>
    <appendToFile value="true" />
    <datePattern value="yyyyMMdd" />
    <rollingStyle value="Date" />
    <maximumFileSize value="10MB" />
    <maxSizeRollBackups value="100" />
    <layout type="log4net.Layout.PatternLayout">
      <header value="[Header]&#xA;"/>
      <footer value="[Footer]&#xA;"/>
      <conversionPattern value="%date %-5level %logger ${COMPUTERNAME} %property{UserHostAddress} [%property{SessionID}] - %message%newline"/>
    </layout>
  </appender>
  <root>
    <level value="INFO"/>
    <appender-ref ref="RollingLogFileAppender"/>
  </root>
</log4net>

Belirtildiği gibi, bunu aralıklı olarak makinelerde görüyoruz, ancak sorun gerçekleştiğinde sorun devam ediyor.

Yanıtlar:


172

Eklemeyi dene

<lockModel type = "log4net.Appender.FileAppender + MinimalLock" />

sizin için <appender />eleman. Bazı performans etkileri vardır çünkü bu, log4net'in dosyayı kilitleyeceği, ona yazacağı ve her yazma işlemi için kilidini açacağı anlamına gelir (kilidi uzun süre alan ve tutan varsayılan davranışın aksine).

Varsayılan davranışın bir anlamı, eğer onu aynı makinede çalışan birden çok çalışan işlem altında çalıştırılan bir Web sitesi altında kullanıyorsanız, her birinin bu kilidi süresiz olarak almaya ve tutmaya çalışacağı ve bunlardan ikisinin sadece kaybedeceğim. Kilitleme modelini minimum kilitle değiştirmek bu sorunu çözer.

(Hata ayıklama, nezaketsiz sonlandırmalar ve çok sayıda yeni çalışan süreci başlatırken, tam olarak olması muhtemel bir şeydir.)

İyi şanslar!


Kaydedicimin neden aralıklı çalıştığı konusunda kafamı tırmalamaktan kurtuldum. Uygulama havuzuna çalışan süreçleri ekledim, ha!
RhinoDevX64

Bunu bir hizmette kullanıyorum ve bu değişikliğe ek olarak, hizmetin kullanıcısı da gerektiği gibi yazma iznini çalıştırdı. Teşekkürler!
LowTide

Çok teşekkürler, çok zaman kazandım.
Siva

2
Sadece bu sadece yazma ve paylaşım okuma için kilitleyip ... hem okumak için ama log4net kilitler, dosyayı okumak isterdim
JobaDiniz

37

Ayrıca log4net SSS bölümüne de dikkat edin :

Aynı dosyaya oturum açmak için birden fazla işlemi nasıl elde edebilirim?

Sağlanan alternatiflerden herhangi birini denemeye başlamadan önce, kendinize gerçekten aynı dosyaya birden çok işlemin günlüğe kaydedilmesi gerekip gerekmediğini sorun, sonra bunu yapmayın ;-).

FileAppender bu kullanım alanı için takılabilir kilitleme modelleri sunar ancak mevcut tüm uygulamaların sorunları ve dezavantajları vardır.

Varsayılan olarak FileAppender, günlüğe kaydedilirken günlük dosyasında özel bir yazma kilidi tutar. Bu, diğer işlemlerin dosyaya yazmasını engeller. Bu modelin Linux üzerinde Mono ile (en azından bazı sürümlerinde) bozulduğu bilinmektedir ve başka bir işlem günlük dosyasına erişmeye çalışır çalışmaz günlük dosyaları bozulabilir.

MinimalLock, yalnızca bir günlük yazılırken yazma kilidini alır. Bu, performansta önemli bir kayıp olmasına rağmen, birden çok işlemin yazmaları aynı dosyaya serpiştirmesine izin verir.

InterProcessLock, dosyayı hiç kilitlemiyor, ancak sistem çapında Mutex kullanarak senkronize ediyor. Bu, yalnızca tüm süreçler birlikte çalışırsa (ve aynı kilitleme modelini kullanırsa) işe yarar. Yazılacak her günlük girişi için bir Mutex'in alınması ve serbest bırakılması performans kaybına neden olacaktır, ancak Mutex, MinimalLock kullanımına tercih edilir.

RollingFileAppender'ı kullanırsanız, birkaç işlem günlük dosyasını eşzamanlı olarak döndürmeye başlayabileceğinden işler daha da kötüleşir. RollingFileAppender, dosyalar yuvarlanırken kilitleme modelini tamamen yok sayar, bu yüzden dosyalar bu senaryo ile uyumlu değildir.

Daha iyi bir alternatif, işlemlerinizin RemotingAppenders'da günlüğe kaydedilmesidir. RemoteLoggingServerPlugin (veya IRemoteLoggingSink) kullanarak bir işlem tüm olayları alabilir ve bunları tek bir günlük dosyasına kaydedebilir. Örneklerden biri RemoteLoggingServerPlugin'in nasıl kullanılacağını gösterir.


6

Eğer varsa

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

ve Ekle

<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />

yuvarlanma gerçekleşirken bir hata olacaktır. İlk işlem yeni dosyayı oluşturacak ve mevcut dosyayı yeniden adlandıracaktır. Daha sonra sonraki işlemler aynısını yapacak ve yeni oluşturulan dosyayı alacak ve yeni yeniden adlandırılmış dosyanın üzerine yazacaktır. Son gün boş olduğu için logfielde sonuçlanıyor.


1
Bu, yalnızca birden çok işlem aynı haddeleme dosyasına eriştiğinde geçerlidir. Aynı süreç içinde güvenlidir. hectorcorrea.com/blog/log4net-thread-safe-but-not-process-safe
Mike Chamberlain

@MikeChamberlain OP'ye göre (Cevap için yorumuna bakın) log4net kullanarak aynı anda çalışan birden fazla işçi olacaktır. Bu nedenle bu konu önemlidir!
seebiscuit
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.