Bir özellikler dosyası kullanarak java günlüğü nasıl kurulur? (java.util.logging)


82

Aptalca bir java günlük kaydı sorunum var: Günlük yapılandırmasını uygulama yapılandırma dosyamdan yüklüyorum - ancak dosyayı okuduktan sonra hiçbir şey kaydetmiyor (bu, ağda bulacağınız örneklere çok benziyor. ek uygulama yapılandırması - bunu kaldırmak da yardımcı olmaz). "Başlatılıyor ..." günlük satırı gayet iyi görünüyor, ancak "başlatma uygulaması" ve diğer mesajlar ne konsola kaydedildi ne de günlük dosyası oluşturulmadı. Burada neyi özlüyorum?

Logger kodu şuna benzer:

...
Logger log = Logger.getLogger("myApp");
log.setLevel(Level.ALL);
log.info("initializing - trying to load configuration file ...");

Properties preferences = new Properties();
try {
    FileInputStream configFile = new FileInputStream("/path/to/app.properties");
    preferences.load(configFile);
    LogManager.getLogManager().readConfiguration(configFile);
} catch (IOException ex)
{
    System.out.println("WARNING: Could not open configuration file");
    System.out.println("WARNING: Logging not configured (console output only)");
}
log.info("starting myApp");
...

Ve bu yapılandırma dosyasıdır:

appconfig1 = foo
appconfig2 = bar

# Logging
handlers = java.util.logging.FileHandler, java.util.logging.ConsoleHandler
.level = ALL

# File Logging
java.util.logging.FileHandler.pattern = %h/myApp.log
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.FileHandler.level = INFO

# Console Logging
java.util.logging.ConsoleHandler.level = ALL

Yanıtlar:


28

Tamam, ilk sezgi burada:

handlers = java.util.logging.FileHandler, java.util.logging.ConsoleHandler
.level = ALL

Java prop dosya ayrıştırıcısı o kadar akıllı değil, bunu halledeceğinden emin değilim. Ama yine belgelere bakacağım ...

Bu arada şunu deneyin:

handlers = java.util.logging.FileHandler
java.util.logging.ConsoleHandler.level = ALL

Güncelleme

Hayır, daha çok kahveye ihtiyacım vardı. Boşver.

Daha fazlasını düşünmeme rağmen, bir prop dosyasını yüklemek ve yazdırmak için Özellikler'deki yöntemleri kullanabileceğinizi unutmayın : java'nın o dosyada ne okuduğunu düşündüğünü görmek için minimal bir program yazmaya değer olabilir.


Başka bir güncelleme

Bu hat:

    FileInputStream configFile = new FileInputStream("/path/to/app.properties"));

fazladan bir son parantez var. Derlenmeyecek. Olduğunu düşündüğünüz sınıf dosyasıyla çalıştığınızdan emin olun.


ReadConfiguration satırıyla bir ilgisi olması için dikiş atıyor - Bunu bir hata ayıklayıcı ile aştım ve LogManager'ın tüm özellikleri bu çağrıdan sonra temizlendi.
VolkA

5
Oh evet, anladım - aynı giriş akışını iki kez kullanıyorum, bu yüzden onu configFile.reset () kullanarak yeniden konumlandırmam gerekiyor - aksi takdirde loadConfiguration () çağrısının okuyacak hiçbir şeyi olmayacak. Btw. the) sadece çalışma kodumdan bir kopyalama hatasıydı.
VolkA

1
Buradaki cevabın ne olduğundan tam olarak emin değilim?
Ondra Žižka

@ OndraŽižka yanıt "kodunuz bir sözdizimi hatası nedeniyle çalışmadı."
Charlie Martin

102

günlük yapılandırma dosyanızı komut satırı üzerinden ayarlayabilirsiniz:

$ java -Djava.util.logging.config.file=/path/to/app.properties MainClass

bu yol daha temiz ve bakımı daha kolay görünüyor.


1
Evet, muhtemelen bu özelliğin ayarlanmış olup olmadığını bir kontrol ekleyeceğim ve yapılandırmamın üzerine yazmasına izin vereceğim - yine de tüm bunları kutudan çıkar çıkmaz çalışan tek bir yapılandırma dosyasında yapmak güzel olurdu. Teşekkürler!
VolkA

12

Kodunuzu yukarıdaki kodda denedim, [preferences.load (configFile);] ifadesini kullanmayın ve işe yarayacak. Örnek kod çalışıyor

public static void main(String[]s)
{

    Logger log = Logger.getLogger("MyClass");
    try {
    FileInputStream fis =  new FileInputStream("p.properties");
    LogManager.getLogManager().readConfiguration(fis);
    log.setLevel(Level.FINE);
    log.addHandler(new java.util.logging.ConsoleHandler());
    log.setUseParentHandlers(false);

    log.info("starting myApp");
    fis.close();

    } 
    catch(IOException e) {
    e.printStackTrace();
    }
}

1
p.özellikleri ana sınıfa göre nerede olmalıdır?
Luís Soares

9
Logger log = Logger.getLogger("myApp");
log.setLevel(Level.ALL);
log.info("initializing - trying to load configuration file ...");

//Properties preferences = new Properties();
try {
    //FileInputStream configFile = new //FileInputStream("/path/to/app.properties");
    //preferences.load(configFile);
    InputStream configFile = myApp.class.getResourceAsStream("app.properties");
    LogManager.getLogManager().readConfiguration(configFile);
} catch (IOException ex)
{
    System.out.println("WARNING: Could not open configuration file");
    System.out.println("WARNING: Logging not configured (console output only)");
}
log.info("starting myApp");

bu çalışıyor .. :) ReadConfiguration () 'da InputStream'i iletmelisiniz.


3

Günlük dosyasını doğru yolda mı arıyorsunuz:% h / one% u.log

Burada% h evinize çözüm getirir: Windows'ta bu varsayılan olarak C: \ Documents and Settings (kullanıcı_adı) olur.

Gönderdiğiniz örnek kodu denedim ve yapılandırma dosyası yolunu (logging.properties, kod veya java argümanları aracılığıyla) belirledikten sonra sorunsuz çalışıyor.


Efendim,% h durumunun evime,% u'nun başka bir şeye çözdüğü vb. Çevrimiçi dokümantasyonun nerede olduğunu öğrenebilir miyim?
Luk Aron
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.