Oi, estou tentando implementar o log de java em meu aplicativo. Eu quero usar dois manipuladores. Um gerenciador de arquivos e meu próprio gerenciador de console. Ambos os meus manipuladores funcionam bem. Meu registro é enviado para um arquivo e para o console. Meu registro também é enviado para o manipulador de console padrão, que eu não desejo. Se você executar meu código, verá duas linhas extras enviadas para o console. Não quero usar o manipulador de console padrão. Alguém sabe como desabilitar o manipulador de console padrão. Desejo usar apenas os dois manipuladores que criei.
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. ??");
}
}
java
java.util.logging
loudiyimo
fonte
fonte
b.append(formatMessage(arg0))
vez deb.append(arg0.getMessage())
. Com oformatMessage
método, você está tornando o formatador compatível com o usopublic void log(Level level, String msg, Object param1)
e métodos semelhantes.Respostas:
O manipulador de console padrão é anexado ao logger root, que é pai de todos os outros loggers incluindo o seu. Portanto, vejo duas maneiras de resolver seu problema:
Se isso afetar apenas esta sua classe específica, a solução mais simples seria desativar a passagem dos registros para o registrador pai:
Se você quiser alterar esse comportamento para todo o seu aplicativo, poderá remover o manipulador de console padrão do logger raiz antes de adicionar seus próprios manipuladores:
Nota: se você quiser usar os mesmos manipuladores de log em outras classes também, a melhor maneira é mover a configuração do log para um arquivo de configuração a longo prazo.
fonte
LogManager.getLogManager().reset(); SLF4JBridgeHandler.install();
Apenas faça
fonte
Logger
portanto, pode ser um problema para um sistema de Log mais complexo. Isso deve ser chamado uma vez no início do processo para ter certeza de que o futur logger não será afetado. E, claro, aquele que precisará do console precisará receber umConsoleHandler
to by conforme o esperado.Isso é estranho, mas
Logger.getLogger("global")
não funciona na minha configuração (bem comoLogger.getLogger(Logger.GLOBAL_LOGGER_NAME)
).No entanto,
Logger.getLogger("")
faz o trabalho bem.Espero que esta informação também ajude alguém ...
fonte
Faça uma redefinição da configuração e defina o nível raiz para DESLIGADO
fonte
Você deve instruir seu agente de log para não enviar suas mensagens até o agente de log pai:
No entanto, isso deve ser feito antes de adicionar mais manipuladores ao logger.
fonte