SORU
28 Mart 2010, Pazar


Nasıl devre dışı varsayılan java API günlüğü kullanırken işleyicisi konsol miyim?

Merhaba java uygulamam günlük kullanmaya çalışıyorum. İki işleyicileri kullanmak istiyorum. Dosya işleyicisi ve benim konsol işleyicisi kendi. Benim işleyicileri de gayet iyi çalışıyor. Benim günlüğü bir dosyaya göndermek ve konsola . Benim günlüğü de istemiyorum varsayılan işleyicisi konsol gönderilir. Eğer benim kod çalıştırırsanız ekstra iki satır gönderilen konsol göreceksiniz. Varsayılan işleyicisi konsolu kullanmak istemiyorum. Herkes devre dışı bırakmak için nasıl biliyor varsayılan işleyicisi teselli eder. Ben sadece yarattım iki işleyicileri kullanmak istiyorum.

Handler fh = new FileHandler("test.txt");
fh.setFormatter(formatter);
logger.addHandler(fh);

Handler ch = new ConsoleHandler();
ch.setFormatter(formatter);
logger.addHandler(ch);

import java.util.Date;
import java.util.logging.ConsoleHandler;
import java.util.logging.FileHandler;
import java.util.logging.Formatter;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.LogRecord;
import java.util.logging.Logger;



public class LoggingExample {
    private static Logger logger = Logger.getLogger("test");

static {
    try {
        logger.setLevel(Level.INFO);

        Formatter formatter = new Formatter() {

            @Override
            public String format(LogRecord arg0) {
                StringBuilder b = new StringBuilder();
                b.append(new Date());
                b.append(" ");
                b.append(arg0.getSourceClassName());
                b.append(" ");
                b.append(arg0.getSourceMethodName());
                b.append(" ");
                b.append(arg0.getLevel());
                b.append(" ");
                b.append(arg0.getMessage());
                b.append(System.getProperty("line.separator"));
                return b.toString();
            }

        };

        Handler fh = new FileHandler("test.txt");
        fh.setFormatter(formatter);
        logger.addHandler(fh);

        Handler ch = new ConsoleHandler();
        ch.setFormatter(formatter);
        logger.addHandler(ch);

        LogManager lm = LogManager.getLogManager();
        lm.addLogger(logger);
    }
    catch (Throwable e) {
        e.printStackTrace();
    }
}

public static void main(String[] args) {
    logger.info("why does my test application use the standard console logger ?\n"  
            " I want only my console handler (Handler ch)\n "  
            "how can i turn the standard logger to the console off. ??");
}

}

CEVAP
28 Mart 2010, Pazar


Varsayılan işleyicisi sizinki de dahil olmak üzere diğer tüm Logger bir ebeveyn olduğu kök logger, bağlı olduğu konsol. Sorunu çözmek için iki yol görüyorum:

Eğer bu senin bu özel sınıf etkiler ise, en basit çözüm, üst logger günlükleri kadar geçen devre dışı bırakmak için:

logger.setUseParentHandlers(false);

Eğer tüm uygulama için bu davranışı değiştirmek isterseniz, kendi işleyicileri önce varsayılan root logger gelen konsol işleyicisi tamamen kaldırmak olabilir:

Logger globalLogger = Logger.getLogger("global");
Handler[] handlers = globalLogger.getHandlers();
for(Handler handler : handlers) {
    globalLogger.removeHandler(handler);
}

Eğer diğer sınıfları da aynı günlük işleyicileri de kullanmak istiyorsanız, en iyi yolu, uzun vadede config dosyasına günlük yapılandırma taşımak için. not:

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bogdan Gabriel

    Bogdan Gabri

    5 Aralık 2006
  • MusicDeluxeTV

    MusicDeluxeT

    14 Mayıs 2010
  • TitaniumBackup

    TitaniumBack

    10 EYLÜL 2011