Hallo, ich versuche, die Java-Protokollierung in meiner Anwendung zu implementieren. Ich möchte zwei Handler verwenden. Ein Dateihandler und mein eigener Konsolenhandler. Meine beiden Handler funktionieren gut. Meine Protokollierung wird an eine Datei und an die Konsole gesendet. Meine Protokollierung wird auch an den Standard-Konsolenhandler gesendet, den ich nicht möchte. Wenn Sie meinen Code ausführen, werden zusätzliche zwei Zeilen an die Konsole gesendet. Ich möchte den Standard-Konsolenhandler nicht verwenden. Weiß jemand, wie man den Standard-Konsolenhandler deaktiviert? Ich möchte nur die beiden von mir erstellten Handler verwenden.
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
quelle
quelle
b.append(formatMessage(arg0))
anstelle von zu verwendenb.append(arg0.getMessage())
. Mit derformatMessage
Methode machen Sie Ihren Formatierer mit der Verwendungpublic void log(Level level, String msg, Object param1)
und ähnlichen Methoden kompatibel .Antworten:
Der Standard-Konsolenhandler ist an den Root-Logger angehängt, der allen anderen Loggern, einschließlich Ihrem, übergeordnet ist. Ich sehe also zwei Möglichkeiten, um Ihr Problem zu lösen:
Wenn dies nur Ihre bestimmte Klasse betrifft, besteht die einfachste Lösung darin, die Übergabe der Protokolle an den übergeordneten Protokollierer zu deaktivieren:
Wenn Sie dieses Verhalten für Ihre gesamte App ändern möchten, können Sie den Standard-Konsolenhandler vollständig aus dem Root-Logger entfernen, bevor Sie Ihre eigenen Handler hinzufügen:
Hinweis: Wenn Sie dieselben Protokollhandler auch in anderen Klassen verwenden möchten, ist es am besten, die Protokollkonfiguration langfristig in eine Konfigurationsdatei zu verschieben.
quelle
LogManager.getLogManager().reset(); SLF4JBridgeHandler.install();
Mach einfach
quelle
Logger
sodass dies ein Problem für ein komplexeres Protokollsystem sein kann. Dies sollte zu Beginn des Prozesses einmal aufgerufen werden, um sicherzustellen, dass der Futur-Logger nicht betroffen ist. Und natürlich muss derjenige, der die Konsole benötigt,ConsoleHandler
wie erwartet eine Antwort erhalten.Dies ist seltsam,
Logger.getLogger("global")
funktioniert aber nicht in meinem Setup (sowieLogger.getLogger(Logger.GLOBAL_LOGGER_NAME)
).Allerdings
Logger.getLogger("")
macht den Job gut.Hoffe diese Info hilft auch jemandem ...
quelle
Führen Sie einen Reset der Konfiguration durch und setzen Sie den Root-Level auf OFF
quelle
Sie müssen Ihren Logger anweisen, seine Nachrichten nicht an den übergeordneten Logger weiterzuleiten:
Dies sollte jedoch erfolgen, bevor dem Logger weitere Handler hinzugefügt werden.
quelle