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

  • Amazon Web Services

    Amazon Web S

    8 NİSAN 2009
  • The Warp Zone

    The Warp Zon

    24 AĞUSTOS 2007
  • Top Gear

    Top Gear

    27 Mart 2006