/*******************************************************************************
* Copyright (c) 2005-2010, G. Weirich and Elexis
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* G. Weirich - initial implementation
*
*******************************************************************************/
package ch.elexis.core.ui.util;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ch.elexis.core.ui.UiDesk;
import ch.rgw.tools.TimeTool;
/**
* Standardisiertes Log. Ein Programm kann das Log mit Log.get(präfix) anfordern und fortan Ausgaben
* ins Log mittels Log(Text,level) machen. Ob eine bestimmte Ausgabe ins Log gelangt, hängt vom
* LogLevel und dem Text-Level ab. Wenn der Level einer Meldung gleich oder niedriger ist, als der
* aktuell eingestellte LogLevel, wird die Ausgabe gemacht, andernfalls wird sie verworfen.
* Ausserdem kann festgelegt werden, ab welchem level eine Nachricht zu einer direkten
* Benachrichtigung des Anwenders mittels MessageBox führt (setAlert und setAlertLevel
*
* @author G. Weirich
*/
public class Log {
/** Experimentell */
public static final int NOTHING = 0;
/** Fatale Fehler, Programmabbruch */
public static final int FATALS = 1;
/** Nichtfatale Fehler, Programm kann weiterlaufen */
public static final int ERRORS = 2;
/**
* Warnung, Programm läuft normal weiter, es könnten aber Probleme auftreten
*/
public static final int WARNINGS = 3;
/** Reine Informationen, kein Einfluss aufs Programm */
public static final int INFOS = 4;
/** Für Debugzwecke gedachte Meldungen */
public static final int DEBUGMSG = 5;
/** Immer auszugebende Meldungen, die aber keinem Fehler entsprechen */
public static final int TRACE = 6;
/** Immer auszugebende Meldungen, automatisch mit einem Timestamp versehen */
public static final int SYNCMARK = -1;
private static String[] Levels = {
"OK", "FATAL", "ERROR", "WARNING", "INFO", "DEBUG", "TRACE"
};
private static Logger out = null;
String prefix;
private static int LogLevel;
private static int alertLevel;
private static String lastError;
private static Shell doAlert;
static {
LogLevel = 2;
doAlert = null;
alertLevel = Log.FATALS;
}
/**
* AlertLevel einstellen. wenn der Level einer Nachricht unter diesem Level liegt, wird eine
* Alertbox zur Nazeige der Nachricht geöffnet (Anstatt nur zu loggen). Dies geht nur, wenn mit
* setAlert auch eine parent-Shell gesetzt worden ist.
*/
static public void setAlertLevel(int l){
alertLevel = l;
}
/**
* Alert inetellen oder löschen. Wenn cmp nicht null ist, wird bei jeder
* Fehlermeldung>Log.Errors eine Alertbox mit der Fehlermeldung ausgegeben.
*
* @param cmp
* die Paent-Komponente für die Alertbox
*/
static public void setAlert(Shell cmp){
doAlert = cmp;
}
/**
* Das Log anfordern. Es gibt pro Programm nur ein Log.
*
* @param prefix
* Ein String, der allen Log-Ausgaben dieser Instanz vorangestellt wird
* @return eine Log-Instanz
*/
static public Log get(String prefix){
return new Log(prefix);
}
/**
* Eine Log-Nachricht ausgeben.
*
* @param message
* die Nachricht
* @param level
* der level
*/
public void log(String message, int level){
if (out == null)
out = LoggerFactory.getLogger(Log.class);
synchronized (out) {
String type = "unknown"; //$NON-NLS-1$
if (level > 0 && level < Levels.length)
type = Levels[level];
switch (level) {
case NOTHING:
break;
case SYNCMARK:
out.info("SYNC: " + message);
break;
case FATALS: // slf4j does not know fatal. Use error instead
case ERRORS:
out.error(message);
break;
case WARNINGS:
out.error(message);
break;
case INFOS:
out.trace(message);
break;
case DEBUGMSG:
out.debug(message);
break;
default:
out.debug(message);
break;
}
if (level <= LogLevel) {
if (level <= alertLevel && PlatformUI.isWorkbenchRunning()) {
if (level != SYNCMARK) {
if (doAlert == null) {
doAlert = UiDesk.getTopShell();
}
lastError =
new StringBuilder().append(" |").append(type).append("| - ")
.append(prefix).append(": ").append(message).toString();
if (doAlert != null) {
UiDesk.asyncExec(new Runnable() {
public void run(){
MessageBox msg =
new MessageBox(doAlert, SWT.ICON_ERROR | SWT.OK);
msg.setMessage(lastError);
msg.open();
}
});
}
}
}
}
}
}
/**
* Eine Exception als Log-Nachricht ausgeben.
*
* @param t
* die Exception
* @param message
* die Nachricht
* @param level
* der level
*/
public void log(final Throwable t, String message, final int level){
if (message == null || message.length() == 0) {
message = t.getMessage();
if (message == null || message.length() == 0) {
message = t.getClass().toString();
}
}
log(message, level);
t.printStackTrace();
}
/**
* Eine Exception als Log-Nachricht ausgeben.
*
* @param t
* die Exception
* @param level
* der level
*/
public void log(final Throwable t){
log(t, null, Log.ERRORS);
}
public static void trace(String msg){
StringBuffer mark = new StringBuffer(100);
mark.append("--TRACE: "); //$NON-NLS-1$
mark.append(new TimeTool().toString(TimeTool.FULL_GER));
mark.append(": ").append(msg); //$NON-NLS-1$
out.trace(mark.toString());
}
public boolean isDebug(){
return DEBUGMSG <= LogLevel;
}
public boolean isInfo(){
return INFOS <= LogLevel;
}
public boolean isWarn(){
return WARNINGS <= LogLevel;
}
public boolean isError(){
return ERRORS <= LogLevel;
}
private Log(){
if (out == null)
out = LoggerFactory.getLogger(Log.class);
}
private Log(String p){
prefix = p;
}
}