Log4j'de, bir FileAppender'ı BufferedIO = true ve BufferSize = xxx özellikleriyle kullanırken (yani, arabelleğe alma etkinleştirilmişse), normal kapatma yordamı sırasında günlüğü temizleyebilmeyi istiyorum. Bunu nasıl yapacağınız hakkında bir fikrin var mı?Tamponlu bir log4j FileAppender'ı nasıl temizlersiniz?
cevap
public static void flushAllLogs()
{
try
{
Set<FileAppender> flushedFileAppenders = new HashSet<FileAppender>();
Enumeration currentLoggers = LogManager.getLoggerRepository().getCurrentLoggers();
while(currentLoggers.hasMoreElements())
{
Object nextLogger = currentLoggers.nextElement();
if(nextLogger instanceof Logger)
{
Logger currentLogger = (Logger) nextLogger;
Enumeration allAppenders = currentLogger.getAllAppenders();
while(allAppenders.hasMoreElements())
{
Object nextElement = allAppenders.nextElement();
if(nextElement instanceof FileAppender)
{
FileAppender fileAppender = (FileAppender) nextElement;
if(!flushedFileAppenders.contains(fileAppender) && !fileAppender.getImmediateFlush())
{
flushedFileAppenders.add(fileAppender);
//log.info("Appender "+fileAppender.getName()+" is not doing immediateFlush ");
fileAppender.setImmediateFlush(true);
currentLogger.info("FLUSH");
fileAppender.setImmediateFlush(false);
}
else
{
//log.info("fileAppender"+fileAppender.getName()+" is doing immediateFlush");
}
}
}
}
}
}
catch(RuntimeException e)
{
log.error("Failed flushing logs",e);
}
}
Dene:
LogManager.shutdown();
tüm tamponlu günlükleri kızardı olsun:
LogFactory.releaseAll();
Bunun çağrılmasının maalesef bir etkisi yoktu. – Amos
:-)
LogManager kapatılıyor
kendi soruyu cevaplamak için Yönetilen.Lütfen bunu cevap olarak seçin - açıkça en güzel seçenek. Kendini hak ettiysen, yeşil bir kene çıkarmaktan çekinme. –
bu en iyi cevap gibi görünüyor ... ama bu "LogManager" nesnesine nasıl erişiyorsunuz? (log4php acemi) –
o log4j.flush.now
gibi özel bir günlüğü kategorisi için true
dönecekti böylece Belki, WriterAppender#shouldFlush(LoggingEvent)
geçersiz olabilir, ve aramak:
LoggerFactory.getLogger("log4j.flush.now").info("Flush")
Bir appender yazdım Bunu düzeltir, bkz. GitHub veya name.wramner.log4j: Maven'deki FlushAppender'ı kullanın. Yüksek önem derecesine sahip olayları temizlemek için yapılandırılabilir ve belirli bir mesaj aldığında, örneğin "Kapanıyor" gibi eklerin arabelleğe alınmasını engelleyebilir. Konfigürasyon örnekleri için ünite testlerini kontrol edin. Elbette özgürdür.
public static void flushAll() {
final LoggerContext logCtx = ((LoggerContext) LogManager.getContext());
for(final org.apache.logging.log4j.core.Logger logger : logCtx.getLoggers()) {
for(final Appender appender : logger.getAppenders().values()) {
if(appender instanceof AbstractOutputStreamAppender) {
((AbstractOutputStreamAppender) appender).getManager().flush();
}
}
}
}
Bu kod soruyu yanıtlarken, sorunun nasıl ve/veya neden çözüldüğüne ilişkin ek bağlam sağlayarak yanıtın uzun vadeli değerini artıracaktır. –
Bu kod yalnızca tüm atılabilir ekleri temizlemeyi deniyor (tüm "fışkırtma" yönteminin bildirildiği "AbstractOutputStreamAppender" ifadesini genişleten tüm ekleyiciler). Projemde Log4J2 v2.8.2 ile bunu kullanıyorum. –
- 1. Java Konsolunu nasıl temizlersiniz?
- 2. Etkileşimli Lua'dan nasıl temizlersiniz?
- 3. Konsolu MATLAB'de nasıl temizlersiniz?
- 4. UIWebView'ın önbelleğini nasıl temizlersiniz?
- 5. Haskell'deki bir dizeden aksanları nasıl temizlersiniz?
- 6. Bir tiff'i bir tamponlu görüntüye dönüştürün (Java)
- 7. Log4j
- 8. Boğazını drupal 7 Ajax bağlantısından nasıl temizlersiniz?
- 9. PPP paketini libpcap ile nasıl temizlersiniz?
- 10. Karışım log4j 1.x ve log4j 2
- 11. Görsel Studio Kod önbelleğini bir Mac/Linux makinesinde nasıl temizlersiniz?
- 12. Dizenin ortasında kalan bir ondalık sıfırı nasıl temizlersiniz?
- 13. Bir subversion işlemi yapmadan önce kaynağınızı nasıl temizlersiniz?
- 14. log4j alignment
- 15. Log4j 2
- 16. log4j: politikasını
- 17. log4j stackoverflow
- 18. log4j yapılandırması
- 19. Ben java tamponlu yazar kullanarak bir csv dosyasını yazıyorum Java
- 20. Özelleştirme log4j adaptör
- 21. Maven bağımlılık log4j hatası
- 22. Log4J 1.2 ile Log4J 2.0 arasında büyük farklar var mı?
- 23. Log4j JUnit Test durumda
- 24. Log4j birden çok dosya
- 25. Log4J günlük dosyasını bulma
- 26. Log4j. Günlükleri mongo db
- 27. Her içerik için Log4J
- 28. Log4j: DailyRollingFileAppender MaxFileSize Seçenek
- 29. Kavanoz için log4j günlüğünü nasıl yapılandırabilirim?
- 30. log4j Özellik dosyasında StringToMatch
Log4J, normal kapanma sırasında ekleyiciyi otomatik olarak temizlemiyor mu? En azından bunu yapmasını beklerdim. –
Kodu anladığım kadarıyla - BufferedIO'ya karar verirken kızarma yok. Performans kazanıyorsunuz ama bir fiyat ödüyorsunuz: son kayıt girişlerini kaybedersiniz ... –
Kendi ekleyicimi (DB'ye yazdım ama gerçekten önemli değil) yazdığımda, her birkaç saniyede bir otomatik olarak fışkırırken çıktıda tamponlama yaptım. – ripper234