2011-10-28 18 views
5

Kullanılan seviyeye bağlı olarak farklı günlük dosyasına yazılan mesaja sahip olmak için java.util.logging api'yi nasıl kullanacağımı bilmek isterim. Eğer seviye INFO ise, o zaman mesajın /log/info.log dosyasında yazılmasını istiyorum. 3 tanımlı seviye şiddetli, uyarı ve bilgi.Farklı düzeylerde dosyaları ayrı ayrı kaydetmek için java.util.logging API'sini kullanma

+0

hangi java günlüğü api kullanıyorsunuz? Log4j için, java günlüğe kaydeder ve slf4j'yi kullanarak istediğiniz şeyi yapan ekleri kurabilirsiniz, ancak her biri için yapılandırma farklıdır. – sbridges

+0

Üzgünüz, Log4j kullanmıyorum ama jdk tarafından sağlanan java günlüğü api kullanıyorum. – xtrem06

cevap

3

Günlük Kayıtlarını yazmak için özel Handlers kullanın.

Yapabileceğiniz basit ancak eksiksiz bir örnek. Burada

import java.io.IOException; 
import java.util.logging.FileHandler; 
import java.util.logging.Level; 
import java.util.logging.LogRecord; 

public class LevelBasedFileHandler extends FileHandler 
{ 
    public LevelBasedFileHandler(final Level level) throws IOException, SecurityException 
    { 
     super(); 
     super.setLevel(level); 
    } 

    public LevelBasedFileHandler(final String s, final Level level) throws IOException, SecurityException 
    { 
     super(s); 
     super.setLevel(level); 
    } 

    public LevelBasedFileHandler(final String s, final boolean b, final Level level) throws IOException, SecurityException 
    { 
     super(s, b); 
     super.setLevel(level); 
    } 

    public LevelBasedFileHandler(final String s, final int i, final int i1, final Level level) throws IOException, SecurityException 
    { 
     super(s, i, i1); 
     super.setLevel(level); 
    } 

    public LevelBasedFileHandler(final String s, final int i, final int i1, final boolean b, final Level level) throws IOException, SecurityException 
    { 
     super(s, i, i1, b); 
     super.setLevel(level); 
    } 

    @Override 
    public void setLevel() { throw new UnsupportedOperationException("Can't change after construction!"); } 

    // This is the important part that makes it work 
    // it also breaks the contract in the JavaDoc for FileHandler.setLevel() 
    @Override 
    public void publish(final LogRecord logRecord) 
    { 
     if (logRecord.getLevel().equals(super.getLevel()) 
     { 
      super.publish(logRecord); 
     } 
    } 
} 

ve bunları her bir günlük seviyesi için sadece mesajları ile /tmp her üç dosya alacak o

try 
{ 
    // I use the Anonymous logger here, but any named logger will work as well 
    final Logger l = Logger.getAnonymousLogger(); 
    l.addHandler(new LevelBasedFileHandler("/tmp/info.log", Level.INFO)); 
    l.addHandler(new LevelBasedFileHandler("/tmp/warn.log", Level.WARNING)); 
    l.addHandler(new LevelBasedFileHandler("/tmp/server.log", Level.SEVERE)); 

    l.info("This is an INFO message"); 
    l.warning("This is a WARNING message"); 
    l.severe("This is a SEVERE message"); 
} 
catch (final IOException e) 
{ 
    // ignore this for this example, you should never do this in real code 
} 

nasıl kullanılacağını olduğunu.

Not: Bu alt sınıfı kullanırken Noter Level'u gerektiren Bağımlılık Enjeksiyon stili yaklaşımını beğenirim; böylece bu alt sınıfı kullanırken .setLevel() numaralı telefonu arayın.

Sadece şeyiyle aynı şeyi Tamamladılar bir java.util.logging.Filter kullanabilirsiniz onu çağıran ve alt sınıf "semantiğini kıracak değişen çünkü ben de .setLevel() etkisiz. Kapsüllü ama bir alternatiftir gibi değil. Daha olduğunu kod ve daha ayrıntılı böylece daha doğru değil almak. Şahsen

final FileHandler infoFileHandler = new FileHandler("/tmp/info.log"); 
infoFileHandler.setFilter(new Filter() 
{ 
    public boolean isLoggable(final LogRecord logRecord) 
    { 
     return logRecord.getLevel().equals(Level.INFO); 
    } 
}); 

hala alt sınıf yaklaşımı daha iyi gibi, daha az hata eğilimli ve amacına ve niyet gibi daha kendini belgeleyen olduğunu.

+0

Teşekkürler güzel cevap. – xtrem06

+0

Her Sapta 'setLevel' olduğu için' LevelBasedFileHandler' gerekmez. Sadece 'h = yeni FileHandler (...); h.setLevel (...) ' – bestsss

+0

@bestss setLevel() sadece ** alt ** düzeydeki mesajları kısıtlar, ancak daha yüksek seviyeli mesajları kabul eder. Üzerinde javadoc'u oku. "Bu İşleyici tarafından hangi mesaj seviyelerinin kaydedileceğini belirten günlük seviyesini ayarlayın. Bu değerden daha düşük mesaj seviyeleri atılacaktır." Gereksinim ** sadece belirtilen seviyeler ** dir. –

-1

Günlüklerinizi yapmak için log4j kullandığınızı varsayar. Özel bir ekleyici yazmanız ve her bir günlükleyiciye eklemeniz gerekir.

  • Basit Talimatlar özel appender olarak

, sadece günlük türü bakar ve gerekli işlemleri yapar bir if deyimi var. Özellikle, bu ihtiyacı çok doğal olarak kapsayacak şekilde genişletilebilen FileAppender'lar vardır. http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/FileAppender.html

  • Daha zarif bir örnek

yerine kendi kodlama, sadece kurulum için bir yapılandırma dosyasını deneyin!

http://www.vaannila.com/log4j/log4j-file-appender-example-1.html

Bu tam olarak ne ihtiyaç yapacağız.

+0

Tamam, jdk tarafından sağlanan loglama api ile aynı şeyi yapmak mümkün mü? – xtrem06

+0

Aslında, örnekte sağlanan çözüm, özellikle yapılandırma dosyasına sahip olmak istediğim şey değil. Bu çözümde, bir dosyaya veya bir diğerine mesaj kaydetmek, bulunduğunuz pakete bağlıdır. – xtrem06

0

Herkes log4j hakkında anlatıyor ... İşte daha yararlı bir cevap:

Farklı tutamaçlar (dosyalar için dosya tanıtıcıları) ekleyin ve işleyicilerin düzeylerini ayarlayın. Kaydedicinin seviyesi, işleyicilere geçmek için en ayrıntılı/rahat olana izin vermelidir.

jul.Logger'ı kurmak için özellikler dosyasını kullanmıyorum, ancak yalnızca ev yapımı bir araya getirilmiş xml. Özellikler dosyası aracılığıyla yapamazsanız, sadece logger kullanın.getHandler() ve uygun seviyeleri ayarlayın.

İlgili konular