2015-07-05 4 views
0

Я разрабатываю плагин для программы, в частности Bukkit, сервера minecraft, и мне нужно захватить все, что отображается в консоли. Однако по какой-то причине я не могу этого сделать. Следующий код является то, что я использую, чтобы применить мои фильтры:Мониторинг всего вывода на консоль

/** 
* 
*/ 
package com.gmail.neonblue858.remoteconsole.plugin; 

import java.util.logging.Level; 
import java.util.logging.Logger; 

import org.bukkit.scheduler.BukkitRunnable; 

/** 
* 
* 
*@author Meguy26 
* 
*/ 
public class FilterApplyer extends BukkitRunnable { 
private ClientManager man; 

public FilterApplyer(ClientManager man){ 
    this.man = man; 
} 

/* (non-Javadoc) 
* @see java.lang.Runnable#run() 
*/ 
@Override 
public void run() { 
    //Create handler 
    LogHandler handler = new LogHandler(man); 
    //Set handler to capture everything 
    handler.setLevel(Level.ALL); 
    //Add handler to root logger so it applies to all loggers 
    Logger.getLogger("").addHandler(handler); 

    //Set the system out to a filtering output stream 
    System.setOut(new FilterOutputStream(System.out, man)); 

    //Set the system err to a filtering output stream 
    System.setErr(new FilterOutputStream(System.err, man)); 

    } 

} 

Я был в предположении, что применение фильтра к корневому регистратору, а также оба систем потоков позволило бы мне все успеть. Однако есть некоторые сообщения, которые выходят из фильтра. Я не знаю, почему это не работает. Есть ли способ, кроме журналов или System.out, что можно распечатать на консоль?

Примечание: ClientManager, LogHandler и FilterOutputStream в приведенном выше коде являются классами, которые я написал, и я гарантировал их правильную работу. Я уверен, что проблема в том, что я не применяю фильтр к каждому источнику печати.

ответ

0

Я был в предположении, что применение фильтра к корневому регистратору, а также к системным потокам позволило бы мне все поймать.

От Java Logging Overview:

По умолчанию регистратор регистрирует любые выходные сообщения к его parent'shandlers и так далее рекурсивно по дереву.

При записи журнала путешествия вверх по дереву они не передается logger.log(LogRecord). Если вы хотите захватить все, то вам нужно установить обработчик в корневом журнале и убедиться, что все регистраторы имеют значениеParentHanders равным true.

Вы также должны знать, что root logger handlers are created on demand.

Смежные вопросы