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
cevap
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.
Teşekkürler güzel cevap. – xtrem06
Her Sapta 'setLevel' olduğu için' LevelBasedFileHandler' gerekmez. Sadece 'h = yeni FileHandler (...); h.setLevel (...) ' – bestsss
@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. –
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.
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.
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
Üzgünüz, Log4j kullanmıyorum ama jdk tarafından sağlanan java günlüğü api kullanıyorum. – xtrem06