/**********************************************************************
* $Source: /cvsroot/jameica/jameica.webadmin/src/de/willuhn/jameica/webadmin/rest/Log.java,v $
* $Revision: 1.13 $
* $Date: 2010/11/02 00:56:31 $
* $Author: willuhn $
* $Locker: $
* $State: Exp $
*
* Copyright (c) by willuhn software & services
* All rights reserved
*
**********************************************************************/
package de.willuhn.jameica.webadmin.rest;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang.StringEscapeUtils;
import org.json.JSONArray;
import de.willuhn.jameica.webadmin.annotation.Doc;
import de.willuhn.jameica.webadmin.annotation.Path;
import de.willuhn.jameica.webadmin.annotation.Request;
import de.willuhn.logging.Level;
import de.willuhn.logging.Logger;
import de.willuhn.logging.Message;
/**
* Logger-Command.
* Schreibt die uebergebene Nachricht ins lokale Log.
*/
@Doc("System: Bietet Zugriff auf das Logging-System von Jameica")
public class Log implements AutoRestBean
{
@Request
private HttpServletRequest request = null;
/**
* Liefert die letzten Zeilen des Logs.
* @return die letzten Zeilen des Logs.
* @throws IOException
*/
@Doc(value="Liefert eine Liste der letzten 200 Zeilen des System-Logs",
example="log/last")
@Path("/log/last$")
public JSONArray getLast() throws IOException
{
return getLast("200");
}
/**
* Liefert die letzten Zeilen des Logs.
* @param lines Anzahl der Zeilen.
* @return die letzten Zeilen des Logs.
* @throws IOException
*/
@Doc(value="Liefert eine Liste der letzten X Zeilen des System-Logs. " +
"X steht hierbei f�r die Anzahl der zur�ckzuliefernden Zeilen. " +
"Die Zeilen sind umgekehrt chronologisch sortiert, also neue zuerst.",
example="log/last/200")
@Path("/log/last/([0-9]{1,4})$")
public JSONArray getLast(String lines) throws IOException
{
int last = -1;
try
{
last = Integer.parseInt(lines);
} catch (Exception e) {}
List<Map> list = new ArrayList<Map>();
int count = last;
Message[] msg = Logger.getLastLines();
for (int i=msg.length-1;i>=0;--i)
{
if (last > 0 && count-- <= 0)
break;
String loggingClass = msg[i].getLoggingClass();
int isClass = loggingClass.lastIndexOf('.');
if (isClass != -1)
loggingClass = loggingClass.substring(isClass+1);
Map data = new HashMap();
data.put("date", new SimpleDateFormat("dd.MM.yyyy HH:mm:ss").format(msg[i].getDate()));
data.put("host", msg[i].getHost());
data.put("level", msg[i].getLevel().getName());
data.put("class", loggingClass);
data.put("method",msg[i].getLoggingMethod());
data.put("text", StringEscapeUtils.escapeXml(msg[i].getText()));
list.add(data);
}
return new JSONArray(list);
}
/**
* Loggt die Nachricht als INFO.
* @param clazz Ausloesende Klasse.
* @param method Ausloesende Methode.
* @param text zu loggender Text.
* @throws IOException
*/
@Doc(value="Schreibt eine Log-Nachricht mit dem Log-Level INFO in das System-Log." +
"Hierbei k�nnen neben der Log-Nachricht auch der Name der loggenden " +
"Klasse und der Name der Funktion �bergeben werden",
example="log/info/Meineklasse/Meinefunktion/Test-Hinweis")
@Path("/log/info/(.*?)/(.*?)/(.*?)")
public void info(String clazz, String method, String text) throws IOException
{
write(Level.INFO,clazz,method,text);
}
/**
* Loggt die Nachricht als Warnung.
* @param clazz Ausloesende Klasse.
* @param method Ausloesende Methode.
* @param text zu loggender Text.
* @throws IOException
*/
@Doc(value="Schreibt eine Log-Nachricht mit dem Log-Level WARN in das System-Log." +
"Hierbei k�nnen neben der Log-Nachricht auch der Name der loggenden " +
"Klasse und der Name der Funktion �bergeben werden",
example="log/warn/Meineklasse/Meinefunktion/Test-Warnung")
@Path("/log/warn/(.*?)/(.*?)/(.*?)")
public void warn(String clazz, String method, String text) throws IOException
{
write(Level.WARN,clazz,method,text);
}
/**
* Loggt die Nachricht als Fehler.
* @param clazz Ausloesende Klasse.
* @param method Ausloesende Methode.
* @param text zu loggender Text.
* @throws IOException
*/
@Doc(value="Schreibt eine Log-Nachricht mit dem Log-Level ERROR in das System-Log." +
"Hierbei k�nnen neben der Log-Nachricht auch der Name der loggenden " +
"Klasse und der Name der Funktion �bergeben werden",
example="log/error/Meineklasse/Meinefunktion/Test-Fehler")
@Path("/log/error/(.*?)/(.*?)/(.*?)")
public void error(String clazz, String method, String text) throws IOException
{
write(Level.ERROR,clazz,method,text);
}
/**
* Loggt die Nachricht.
* @param level Log-Level.
* @param clazz Ausloesende Klasse.
* @param method Ausloesende Methode.
* @param text zu loggender Text.
* @throws IOException
*/
private void write(Level level, String clazz, String method, String text) throws IOException
{
Logger.write(level,request.getRemoteHost(),clazz,method,text,null);
}
}
/*********************************************************************
* $Log: Log.java,v $
* Revision 1.13 2010/11/02 00:56:31 willuhn
* @N Umstellung des Webfrontends auf Velocity/Webtools
*
* Revision 1.12 2010/05/12 10:59:20 willuhn
* @N Automatische Dokumentations-Seite fuer die REST-Beans basierend auf der Annotation "Doc"
*
* Revision 1.11 2010/05/11 14:59:48 willuhn
* @N Automatisches Deployment von REST-Beans
*
* Revision 1.10 2010/03/18 09:29:35 willuhn
* @N Wenn REST-Beans Rueckgabe-Werte liefern, werrden sie automatisch als toString() in den Response-Writer geschrieben
*
* Revision 1.9 2009/08/05 09:03:40 willuhn
* @C Annotations in eigenes Package verschoben (sind nicht mehr REST-spezifisch)
*
* Revision 1.8 2008/11/11 01:06:22 willuhn
* @N Mehr REST-Kommandos
*
* Revision 1.7 2008/11/07 00:17:16 willuhn
* @N Welcome-Nachrichten
*
* Revision 1.6 2008/10/21 22:33:47 willuhn
* @N Markieren der zu registrierenden REST-Kommandos via Annotation
*
* Revision 1.5 2008/10/08 21:38:23 willuhn
* @C Nur noch zwei Annotations "Request" und "Response"
*
* Revision 1.4 2008/10/08 16:01:38 willuhn
* @N REST-Services via Injection (mittels Annotation) mit Context-Daten befuellen
*
* Revision 1.3 2008/06/20 13:24:29 willuhn
* @N REST-Command zum Abrufen der letzten Log-Zeilen
*
* Revision 1.2 2008/06/16 14:22:11 willuhn
* @N Mapping der REST-URLs via Property-Datei
*
* Revision 1.1 2008/06/13 14:11:04 willuhn
* @N Mini REST-API
*
**********************************************************************/