Hi,
I have worked with this class for logging. On a client-server
environment, creates 1 log per client. I don't remember internally how
it works, but you can check it out, if it helps.
Root logger configuration is based on "log4j-conf.xml", the rest are
based on root config, but some properties can be changed dynamically,
such as layout (XML, HTML, plain text, ...).
With javadoc you can generate the documentation of it.
César
===================
Paolo Bacci escribió:
Hi all,
I'm having problems writing to multiple appenders.
I made a log4j.properties and I'd like it to write to 2 different log
files,
but it seems like nothing works....
I'm doing this on my .properties:
log4j.rootLogger=all, stdout, R, html
log4j.secondAppender=INHERITED, app
#### App appender properties
log4j.appender.app=org.apache.log4j.RollingFileAppender
log4j.appender.app.File=/tmp/log.log
# Control the maximum log file size
log4j.appender.app.MaxFileSize=100KB
# Archive log files (one backup file here)
log4j.appender.app.MaxBackupIndex=1
log4j.appender.app.layout=org.apache.log4j.PatternLayout
log4j.appender.app.layout.ConversionPattern=%d:%-5r %-5p[%t | %c{1}:%L |
%M] %m%n
Rootlogger is doing great, but the second one is just not doing
anything at
all.
Does anybody has any clue about why is it happening?
thanks in advance
Paolo
package lprs.examen;
//**********************************************************
//LIBRERIAS
//**********************************************************
import java.io.File;
import java.util.Enumeration;
import org.apache.log4j.Appender;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.FileAppender;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.spi.LoggerRepository;
import org.apache.log4j.xml.DOMConfigurator;
import org.apache.log4j.Layout;
import org.apache.log4j.PatternLayout;
import org.apache.log4j.SimpleLayout;
import org.apache.log4j.xml.XMLLayout;
import org.apache.log4j.HTMLLayout;
/************************************************************
*<!-- CLASE TRAZADOR
*========================================================-->
* Clase que crea y configura un trazador, ofreciendo
* un sistema de trazado estandar.
* <p>
* La idea es crear un sistema de trazado comun para
* todas las practicas, de sencilla configuracion, con
* perspectivas de ampliacion y reutilizacion.
*
* <p><b><u> ESTRUCTURA LOG4J </u></b>
* <table border="1">
* <tr><td><b>ENTIDAD</b></td><td><b> OBJETIVO </b></td> <td><b>
TIPOS </b></td></b></tr>
* <tr><td> Logger:</td> <td>Grupo de destinos de trazado </td> <td>
Root, L1, L2 ...Ln </td> </tr>
* <tr><td>Appender: </td> <td>Definicion del destino de trazado</td> <td>
LOG, CONSOLA, ... </td> </tr>
* </table>
* <p>
* El Logger Root es el principal y esta compartido por todos los trazadores
* de un programacion
*
* <p><b><u>MANEJO</u></b>
* <table>
* <tr>
* <td> 1.- <b> Definicion de Appenders en fichero XML: </b>
* <ul>
* <li>1.1.- Destinos posibles del trazado: consola, log ...
* <li>1.2.- Lista de propiedades de cada destino
* <li>1.3.- Filtrado por niveles log4j para cada destino.--
* Niveles log4j: debug, info, warn, error, fatal
* </ul>
* </td> </tr>
* <tr>
* <td> 2.- <b> Creando y Configurando Trazador </b>:
* <ul>
* <li> t=new Trazador();
* <li> t.setRutaConfifXML("conf/log4j-conf.xml")
* <li> t.configuraTrazador(); // Carga XML o config basica
* </ul>
* </td> </tr>
* <tr>
* <td> 3.-<b> Conmutacion del trazado principal </b> (logger root):
* <ul>
* <li> t.setRutaNuevoLog("logs/cliente1.txt");
* <li> t.conmutaTrazado();
* </ul>
* <p>
* Ejm.: logs/cliente1.txt --
* logs/cliente2.txt --
* </td> </tr>
* <tr>
* <td> 4.- <b> Creacion de nuevo destino de trazado </b>
* (Nuevo {logger "sesion1" + FileAppender "sesion1"}):
* <ul>
* <li> t.rutaNuevoLog("logs/servidor/sesion1.txt"); // Destino del
nuevo FileAppender
* <li> t.nuevoLog("sesion1"); // Nuevo {Logger +
FileAppender}
* </ul>
* <p>
* Ejm.: logs/servidor/sesion1.txt --
* logs/servidor/sesion2.txt --
* </td> </tr>
* <td> 5.- El Appender "LOG" del fichero XML es la referencia para
* la configuracion de todos los nuevos logs.
* </td> </tr>
* <td> 6.- Si no existe Appender "LOG" se deshabilita la creacion de
* nuevos logs y la conmutacion del log principal hacia otro
* fichero.
* </td> </tr>
* <td> 7.- Si no existe fichero XML se volcaran los errores por consola.
*
* </td> </tr>
* </table>
*
* <p><b><u>FICHERO CONFIGURACION</u></b>
*
* <p> Define:
* <ul>
* <li> <u>Destinos (Appenders)</u>: mail, red, log, consola
* <li> <u>Logger: </u> si existe appender LOG, no se deben
* definir loggers, aparte del root.
* <li> <u>Filtrado: </u> habilita/deshabilita un grupo de
* mensajes para cada destino. Por ejm.: DEBUG.
* <li> <u>LayOut del Log: </u> TXT, HTML, XML ...
* </ul>
*
* <p><b><u>MODOS DE TRAZADO / TRAZADOR (aun no operativo)</u></b>
* <table>
* <tr> <td>
* 1.- <b>Errores por pantalla</b>: si no existe appender LOG en el
* fichero de configuracion, volcado
* de warnings y errores por consola.
* <ul>
* <li> <u> Depuracion ON </u>: activa globalmente (todos los loggers)
el
* trazado detallado + Pila de errores.
* <li> <u> Depuracion OFF</u>: activa globalmente (todos los loggers)
* el traza simple de errores (1 linea).
*
* <li> <u> Exhaustiva ON:</u>: activa localmente (cliente actual) el
* volcado de contenido de variables
* (trazas cansinas).
* <li> <u> Exhaustiva OFF:</u>: desactiva las trazas cansinas
* para el cliente actual.
* </ul>
* </td> </tr>
* <tr> <td>
* 2.- <b> Errores a log</b>: si existe appender LOG en el fichero
* de configuracion, volcado en logs segun
* especifique el appender LOG del fichero XML.
*
* <ul>
* <li> <u> Depuracion ON </u>: activa globalmente (todos los loggers)
el
* trazado detallado + Pila de errores.
* <li> <u> Depuracion OFF</u>: activa globalmente (todos los loggers)
* el traza simple de errores (1 linea).
*
* <li> <u> Exhaustiva ON:</u>: activa localmente (cliente actual) el
* volcado de contenido de variables
* (trazas cansinas).
* <li> <u> Exhaustiva OFF:</u>: desactiva las trazas cansinas
* para el cliente actual.
* </ul> * </table>
*
* <p><b><u>NOTA SOBRE LAS CATEGORIAS:</u></b>
* <ul>
* <li> Antiguamente los loggers recibian el nombre de
* categorias.
*
* <li> Este concepto lia bastante las cosas, queriendo
* expresar loggers nuevos, asi que ya no se usa y
* todos los metodos que manejan este concepto estan
* deprecados.
* </ul>
*<!--====================================================-->
* <p>Login: <b> lswc5091 </b>
* -- Fecha: <b> 23 - Nov - 2005 </b>
* @author Cesar Delgado Gonzalez
************************************************************/
public class Trazador {
//**********************************************************
// PROPIEDADES
//**********************************************************
//-------------------------------------------------
// PUBLICAS
//-------------------------------------------------
// 1.- Tipos de mensajes de log4j
public static final int DEBUG = 0;
public static final int INFO = 1;
public static final int WARN = 2;
public static final int ERROR = 3;
public static final int FATAL = 4;
//-------------------------------------------------
// PRIVADAS
//-------------------------------------------------
// 0.- Tipos layouts para fichero de log
private static final int NONE = 0; // Utiliza layout de fichero
config
private static final int SIMPLE = 1;
private static final int PATTERN = 2;
private static final int XML = 3;
private static final int HTML = 4;
// 1.- Tipos de trazado
private static boolean detalles = true;
private static boolean exhaustiva = false;
// 2.- Propiedades del Trazador
private static String nombreAplicacion = new String("Log4J Log
Messages");
private String confXML = new String("conf/log4j-conf.xml");
private String nombreLog = null;
private String extensionLog= new String(".log");
private String conversion = new String("%d{dd MMM yyyy
HH:mm:ss.SSS} [%p] [%t] [%c] - %m%n");
private int layout = NONE;
// 3.- Trazador
private Logger traza = null;
// 4.- Existencia del Appender LOG
private static boolean[] existeLog = null;
// NULL ==> No se ha cargado fichero de config
// existeLog[0] => Existe Appender LOG?
// existeLog[1] => Existe Fichero XML de configuracion?
//**********************************************************
// MANEJO DE PROPIEDADES DEL TRAZADOR
//**********************************************************
/**************************************************
*<!-- IS DETALLADO ON
*===============================================-->
* Detallado ON => Trazas detalladas para
* este trazador.
* <br>
*
* Activada por defecto
*
* @return Activada la depuracion?
**************************************************/
public synchronized static boolean isDetalladoOn() {
return detalles;
}
/**************************************************
*<!-- SET DETALLADO
*===============================================-->
* Detallado ON/OFF => Habilita trazas detalladas.
* <br>
* Activada por defecto
**************************************************/
public synchronized static void
setDetallado(boolean on) {
detalles = on;
}
/**************************************************
*<!-- SET DETALLADO ON
*===============================================-->
* Detallado ON => Habilita trazas detalladas.
* <br>
* Activada por defecto
**************************************************/
public synchronized static void setDetalladoOn() {
detalles = true;
}
/**************************************************
*<!-- SET DETALLADO OFF
*===============================================-->
* Detallado ON => Deshabilita trazas detalladas.
* <br>
* Activada por defecto
**************************************************/
public synchronized static void setDetalladoOff() {
detalles = false;
}
/**************************************************
*<!-- IS EXHAUSTIVO ON
*===============================================-->
* Exhaustivo ON => Trazas detalladas para
* este trazador.
* <br>
* Desactivada por defecto
*
* @return [aAeEiIoOuU!?]Activada la depuracion?
**************************************************/
public synchronized static boolean isExhaustivoOn() {
return exhaustiva;
}
/**************************************************
*<!-- SET EXHAUSTIVO
*===============================================-->
* Exhaustivo ON/OFF => Depuracion exhaustiva
* <br>
* Desactivada por defecto
**************************************************/
public synchronized static void setExhaustivo(boolean on) {
exhaustiva = on;
}
/**************************************************
*<!-- SET EXHAUSTIVO ON
*===============================================-->
* Exhaustivo ON => Habilita la depuracion
* exhaustiva.
* <br>
* Desactivada por defecto
**************************************************/
public synchronized static void setExhaustivoOn() {
exhaustiva = true;
}
/**************************************************
*<!-- SET EXHAUSTIVO OFF
*===============================================-->
* Exhaustivo OFF => Habilita la depuracion
* exhaustiva.
* <br>
* Desactivada por defecto
**************************************************/
public synchronized static void setExhaustivoOff() {
exhaustiva = false;
}
/**************************************************
*<!-- SET NOMBRE APLICACION
*===============================================-->
* Se da valor al nombre de la aplicacion,
* util para logs HTML o XML
* <br>
* Valor por defecto "Log4J Log Messages"
**************************************************/
public synchronized static void setNombreAplicacion(String nombre) {
nombreAplicacion = nombre;
}
/**************************************************
*<!-- GET RUTA_CONFIG_XML
*===============================================-->
* @return Ruta+Nombre del fichero XML.
* @see #configuraTrazador()
**************************************************/
public synchronized String getRutaConfigXML() {
return confXML;
}
/**************************************************
*<!-- SET RUTA_CONFIG_XML
*===============================================-->
* Setea la Ruta+Nombre del fichero de XML de
* configuracion LOG4J.
* Por defecto:<i>"conf/log4j-conf.xml"</i>
* @see #configuraTrazador()
**************************************************/
public synchronized void setRutaConfigXML(String ruta) {
confXML = ruta;
}
/**************************************************
*<!-- SET RUTA_RUTA_NUEVO_LOG
*===============================================-->
* Setea Ruta+Nombre del fichero de log a crear.
* Por defecto:
* <i>el indicado en el fichero de configuracion</i>
*
* @see #conmutaTrazado()
* @see #nuevoLog(String)
**************************************************/
public synchronized void setRutaNuevoLog(String ruta) {
nombreLog = ruta;
}
/**************************************************
*<!-- SET LAYOUT SIMPLE
*===============================================-->
* Activando trazado simple en log
**************************************************/
public synchronized void setLayoutSimple() {
layout=SIMPLE;
extensionLog = new String(".txt");
}
/**************************************************
*<!-- SET LAYOUT PATTERN
*===============================================-->
* Activando trazado mediante patrones de conversion
**************************************************/
public synchronized void setLayoutPattern() {
layout=PATTERN;
extensionLog = new String(".log");
}
/**************************************************
*<!-- SET LAYOUT XML
*===============================================-->
* Activando trazado XML
**************************************************/
public synchronized void setLayoutXML() {
layout=XML;
extensionLog = new String(".xml");
}
/**************************************************
*<!-- SET LAYOUT HTML
*===============================================-->
* Activando trazado HTML
**************************************************/
public synchronized void setLayoutHTML() {
layout=HTML;
extensionLog = new String(".html");
}
/**************************************************
*<!-- SET CONVERSION PATTERN
*===============================================-->
* Formato de la traza a emplear
* <br>
* Ver:
**************************************************/
public synchronized void setConversionPattern(String patron) {
conversion=new String(patron);
}
/**************************************************
*<!-- GET RUTA_NUEVO_LOG
*===============================================-->
* @return Ruta+Nombre del fichero asociado
* al trazador.
* @see #conmutaTrazado()
* @see #nuevoLog(String)
**************************************************/
public synchronized String getRutaNuevoLog() {
return nombreLog;
}
/**************************************************
*<!-- GET LOGGER
*===============================================-->
* @return Logger del Trazador
**************************************************/
public synchronized Logger getLogger() {
return traza;
}
/**************************************************
*<!-- GET LAYOUT
*===============================================-->
* @return Layout del fichero del log del trazador
**************************************************/
public synchronized String getLayout() {
//------------ DECLARACIONES LOCALES ------------
String salida = null;
//------------------ ACCIONES -------------------
// 1.- Seleccionando tipo Layout del fichero
//------------------------------------------
switch (layout) {
case SIMPLE:
salida = new String("org.apache.log4j.SimpleLayout");
break;
case PATTERN:
salida = new String("org.apache.log4j.PatternLayout");
break;
case XML:
salida = new String("org.apache.log4j.XMLLayout");
break;
case HTML:
salida = new String("org.apache.log4j.HTMLLayout");
break;
default:
salida = new String("Especificado en fichero
configuracion");
break;
}
// 2.- Retornando Layout
//------------------------------------------
return salida;
}
/**************************************************
*<!-- GET CONVERSION PATTERN
*===============================================-->
* @return Formato del encabezado de la traza
**************************************************/
public synchronized String getConversionPattern() {
return conversion;
}
//**********************************************************
// CONFIGURACION AVANZADA: NUEVOS LOGGERS
//**********************************************************
//-------------------------------------------------
// CONFIG_LAYOUT
//-------------------------------------------------
// Crea y configura el formato del fichero de
// log
//-------------------------------------------------
private Layout configLayout(Layout inicial) {
//------------ DECLARACIONES LOCALES ------------
Layout esquema = inicial;
//------------------ ACCIONES -------------------
// 1.- Seleccionando tipo Layout del fichero
//------------------------------------------
switch (layout) {
case SIMPLE:
SimpleLayout salida_1 = new SimpleLayout();
esquema = (Layout) salida_1;
break;
case PATTERN:
PatternLayout salida_2 = new PatternLayout(conversion);
esquema = (Layout) salida_2;
break;
case XML:
XMLLayout salida_3 = new XMLLayout();
esquema = (Layout) salida_3;
break;
case HTML:
HTMLLayout salida_4 = new HTMLLayout();
salida_4.setTitle(nombreAplicacion);
esquema = (Layout) salida_4;
break;
default:
Layout salida_5 = inicial;
esquema = (Layout) salida_5;
break;
}
return esquema;
}
//-------------------------------------------------
// CONFIG_APPENDER
//-------------------------------------------------
// Configura el FileAppender DESTINO igual que
// el FileAppender Origen
//-------------------------------------------------
private void configAppender(FileAppender origen,
FileAppender
destino) {
//------------------ ACCIONES -------------------
try {
destino.setLayout(configLayout(origen.getLayout()));
destino.addFilter(origen.getFilter());
destino.setThreshold(origen.getThreshold());
destino.activateOptions();
imprimeTraza (DEBUG,
"Trazador.configAppender()",
"TRAZADOR - CONFIGURANDO APPENDER => Nuevo fichero
de log",
"-> Nombre del Appender: " + destino.getName() +
"\n -> Fichero de Log: " +
destino.getFile().toString());
} catch (Exception e) {
imprimeTraza (DEBUG,
"Trazador.configAppender()",
"TRAZADOR - CONFIGURANDO APPENDER => Nuevo fichero
de log",
e.toString());
e.printStackTrace();
}}
//-------------------------------------------------
// BUSCA_APPENDER_LOG
//-------------------------------------------------
// Localiza y devuelve el appender LOG. Caso
// de no existir, devuelve NULL.
//
// Utilidades:
// 1.- Configuracion del nuevo appender de una
// nueva categoria con las propiedades
// definidas para el appender LOG en el
// fichero XML
//
// 2.- Deshabilitar los logs, caso de no existir
// appender LOG
//-------------------------------------------------
private FileAppender buscaAppenderLog() {
//------------ DECLARACIONES LOCALES ------------
Enumeration salidas = null;
Appender actual = null;
FileAppender log = null;
//------------------ ACCIONES -------------------
try {
// 1.- Capturando Appenders de Categoria Root
//-------------------------------------------
salidas = Logger.getRootLogger().getAllAppenders();
// 2.- Buscando Appender LOG de tipo FileAppender
//-----------------------------------------------
while (salidas.hasMoreElements()) {
// 2.1.- Captura del siguiente Appender de la
lista
actual = (Appender) salidas.nextElement();
// 2.2.- Comprobando que sea Appender LOG
if (actual.getName().contains("LOG")) {
log = (FileAppender) actual;
break;
}
}
return log;
} catch (Exception e) {
imprimeTraza (ERROR,
"Trazador.buscaAppenderLOG()",
"TRAZADOR - LOCALIZANDO APPENDER LOG." +
"\n Lo mas probable es que LOG no sea del tipo
FileAppender",
e.toString());
e.printStackTrace();
return log;
}}
//-------------------------------------------------
// BUSCA_CATEGORIA
//-------------------------------------------------
// Busca una categoria no Root. En su
// defecto devuelve la categoria root.
//-------------------------------------------------
private Logger buscaCategoria() {
//------------ DECLARACIONES LOCALES ------------
Enumeration categorias = null;
Logger categoria = null;
Logger salida = null;
LoggerRepository repositorio = null;
//------------------ ACCIONES -------------------
try {
// 1.- Por Defecto => Categoria Root
//------------------------------------------
salida = Logger.getRootLogger();
// 2.- Capturando Repositorio de Categorias
//------------------------------------------
repositorio = salida.getLoggerRepository();
categorias = repositorio.getCurrentLoggers();
// 3.- Buscando Categoria No root
//-------------------------------
while (categorias.hasMoreElements()) {
categoria = (Logger) categorias.nextElement();
if (!categoria.equals(Logger.getRootLogger())) {
salida = categoria;
break;
}
}
return salida;
} catch (Exception e) {
imprimeTraza (ERROR,
"Trazador.buscaCategoria()",
"TRAZADOR - BUSCANDO CATEGORIA NO ROOT",
e.toString());
e.printStackTrace();
return salida;
}}
//-------------------------------------------------
// CONFIG_CATEGORIA
//-------------------------------------------------
// Configura el appender de un nueva categoria,
// tomando como base el appender de otra que no
// sea la principal. En su defecto, copiara la
// configuracion del appender LOG
//
//-------------------------------------------------
private boolean configCategoria(FileAppender ficheroNuevo){
//------------ DECLARACIONES LOCALES ------------
boolean root = true;
Logger categoria = null;
FileAppender fichero = null;
//------------------ ACCIONES -------------------
try {
// 1.- Buscando Categoria No Root
//-------------------------------
categoria = buscaCategoria();
root = categoria.equals(Logger.getRootLogger());
// 2.- Configurando Nuevo Appender
//--------------------------------
if (!root) {
// Asumimos que solo hay 1 appender en categorias No Root
// (No definir categorias en el fichero XML !!!!!)
fichero = (FileAppender)
categoria.getAllAppenders().nextElement();
configAppender(fichero, ficheroNuevo);
// 3.- Configuracion Nuevo Appender = Appender LOG
//-------------------------------------------------
} else {
fichero = buscaAppenderLog();
configAppender(fichero, ficheroNuevo);
}
return root;
} catch (Exception e) {
imprimeTraza (ERROR,
"Trazador.configCategoria()",
"TRAZADOR - CONFIGURANDO EL APPENDER DE LA CATEGORIA",
e.toString());
e.printStackTrace();
return root;
}}
//-------------------------------------------------
// CREA_APPENDER
//-------------------------------------------------
// Crea un nuevo appender para un nuevo logger,
// y lo configura tal y como esta configurado
// el appender LOG del fichero XML.
//
// Si no hay appender LOG, se ignora la creacion
// de la categoria.
//
// La idea es:
//
// 1.- Capturar configuracion del appender de
// una categoria que no sea la root.
//
// Por definicion, debe ser identica a la
// a la configuracion del appender LOG
// que aparece en el fichero XML.
//
// 2.- Caso de solo existir la principal:
// 2.1.- Se configura el nuevo appender
// con las propiedades del
// appender LOG
//
// 2.2.- El appender LOG se filtra para
// no desbordar el log asociado a la
// categoria root
//
// 2.- Si no existe Appender LOG en el fichero XML =>
// se ignora la creacion del logger.
//
//-------------------------------------------------
private FileAppender creaAppender(String nombre) {
//------------ DECLARACIONES LOCALES ------------
FileAppender fichero = null;
FileAppender ficheroNuevo = null;
boolean root = false;
//------------------ ACCIONES -------------------
try {
// 1.- Creando Appender
//---------------------
ficheroNuevo = new FileAppender();
// 2.- Configurando Nuevo Appender
//--------------------------------
// 2.1.- Nombre y Fichero Salida
ficheroNuevo.setFile(nombreLog+extensionLog);
ficheroNuevo.setName(nombre);
// 2.2.- Resto de Configuracion
root = configCategoria(ficheroNuevo);
// 3.- Filtrando Categoria Root
//-----------------------------
if (root) {
fichero = buscaAppenderLog();
fichero.setThreshold(Level.ERROR);
}
return ficheroNuevo;
} catch (Exception e) {
imprimeTraza (ERROR,
"Trazador.creaAppender()",
"TRAZADOR - CREANDO APPENDER PARA NUEVA
CATEGORIA",
e.toString());
e.printStackTrace();
return ficheroNuevo;
}}
/************************************************************
*<!-- NUEVO_LOG
*========================================================-->
* Habilita el volcado sobre un nuevo fichero de log
* para este objeto trazador (si se le especifica
* un nombre de log en "this.nombreLog").
*
* <p><b>USO:</b>
* <ul>
* <li> 1.- Creacion de Nuevo Trazador:
* <b><i> t = new Trazador(); </i></b>
* <li> 2.- Especificacion de Fichero de log:
* <b><i> t.setRutaNuevoLog("/logs/salida"); </i></b>
* <li> 3.- Especificacion de Layout del log:
* <b><i> t.setLayoutHTML(); </i></b>
* <li> 4.- Creando nuevo logger de trazado:
* <b><i> t.nuevoLog("depuracion"); </i></b>
* </ul>
*
* @param nombre Nombre del nuevo logger y nuevo appender.
* @see #confXML
* @see #nombreLog
* @see #imprimeTraza(int, String, String, String)
************************************************************/
public synchronized void nuevoLog(String nombre) {
try {
if (existeLog[0]) {
if (nombreLog!=null) {
// 1.- Creando y Configurando Nuevo Appender
//------------------------------------------
FileAppender fichero = creaAppender(nombre);
// 2.- Nuevo Appender => Nueva Categoria
//---------------------------------------
traza = Logger.getLogger(nombre);
traza.addAppender(fichero);
} else {
imprimeTraza (INFO,
"Trazador.nuevoLog()",
"TRAZADOR - CREANDO NUEVO LOG: posibles
situaciones",
" a) Deshabilitados Logs de Depuracion:
No existe Appender LOG" +
" en el fichero de configuracion
XML" +
"\n b) No se ha seteado el nombre del log
adecuadamente");
}
}
} catch (Exception e) {
imprimeTraza (ERROR,
"Trazador.nuevoLog()",
"TRAZADOR - CREANDO NUEVO LOG:",
e.toString());
e.printStackTrace();
}}
//************************************************************
//* CONFIGURACION BASICA: XML + LOGGER ROOT
//************************************************************
/************************************************************
*<!-- CONMUTA_TRAZADO
*========================================================-->
* Conmuta la salida del trazado principal, modificando
* el appender LOG.
*
* <p><b> RESTRICCIONES </b>
* <ul>
* <li> 1.- Debe Existir appender LOG en fichero XML.
* <li> 2.- Appender LOG debe estar asociado a logger
* ROOT.
* </ul>
***********************************************************/
public void conmutaTrazado() {
//------------ DECLARACIONES LOCALES ------------
FileAppender fichero = null;
//------------------ ACCIONES -------------------
try {
if (nombreLog != null) {
// 1.- Localizando Appender LOG
//------------------------------
fichero = buscaAppenderLog();
// 2.- Desviando Salida del Appender LOG
//--------------------------------------
if (fichero != null) {
imprimeTraza (DEBUG,
"Trazador.actualizaConfig()",
"TRAZADOR - SE HA ACTIVADO
UN NUEVO FICHERO DE LOG PARA TRAZADO PRINCIPAL",
"-> Nombre del Appender: "
+ fichero.getName() + "\n" +
"-> Fichero de Log: " +
nombreLog+extensionLog + "\n" +
"-> Layout del log: " +
getLayout());
fichero.setFile(nombreLog+extensionLog);
fichero.setLayout(configLayout(fichero.getLayout()));
fichero.activateOptions();
}}
} catch (Exception e) {
imprimeTraza (ERROR,
"Trazador.actualizaConfig()",
"TRAZADOR - MODIFICANDO LA CONFIGURACION
BASICA",
e.toString());
e.printStackTrace();
}}
//-------------------------------------------------
// CARGA_CONFIG_BASICA
//-------------------------------------------------
// Configura el trazador segun los parametros
// del fichero de configuracion
//-------------------------------------------------
private void cargaConfigBasica() {
//------------ DECLARACIONES LOCALES ------------
String salida = null;
boolean existe = false;
//------------------ ACCIONES -------------------
try {
existe = (new File(confXML).exists());
// 1.- Existe Fichero de Config ---> Se carga
//-------------------------------------------
if (existe) {
// 1.1.- Carga la configuracion Log4j
salida = new String (confXML);
DOMConfigurator.configure(confXML);
// 1.2.- Detecta la existencia de Logger LOG
if (existeLog==null) {
existeLog=new boolean[2];
existeLog[0] = (buscaAppenderLog()!=null);
existeLog[1] = true; // Hay XML de config
}
// 1.3.- Trazado de Depuracion
imprimeTraza (DEBUG,
"Trazador.cargaConfigBasica()",
"TRAZADOR - EXISTE FICHERO DE CONFIGURACION
",
"Cargado OK el fichero de configuracion: "
+ confXML);
// 2.- No Existe Fichero de Config ---> Config Basica
//-----------------------------------------------------
} else {
salida = new String ("Configuracion Basica");
BasicConfigurator.configure();
traza.setLevel((Level) Level.WARN);
existeLog = new boolean[1];
existeLog[0] = false; // No hay appender LOG
existeLog[1] = false; // No hay XML de config
imprimeTraza (DEBUG,
"Trazador.cargaConfigBasica()",
"TRAZADOR - NO EXISTE FICHERO DE
CONFIGURACION ",
"Se utilizara la basica: " +
" 1.- Avisos y Errores por Consola " +
" 2.- Filtrado => Debug, Info");
}
} catch (Exception e) {
imprimeTraza (ERROR,
"Trazador.cargaConfigBasica()",
"TRAZADOR - CARGANDO CONFIGURACION BASICA
DE: " + salida,
e.toString());
e.printStackTrace();
}}
/************************************************************
*<!-- CONFIGURA_TRAZADOR
*========================================================-->
* Configura el trazador segun los parametros del
* fichero de configuracion. En su defecto, adoptara
* una configuracion basica (errores por consola).
*
* @see #confXML
* @see #nombreLog
************************************************************/
public void configuraTrazador() {
// 1.- Por Defecto => Volcado sobre Root
//-------------------------------------
traza = Logger.getRootLogger();
// 2.- Configurando Trazador
//---------------------------
cargaConfigBasica();
}
//************************************************************
//* TRAZADO
//************************************************************
//-------------------------------------------------
// IMPRIME SIMPLE
//-------------------------------------------------
// Depuracion OFF ===> Formato de traza simple
//-------------------------------------------------
private void imprimeSimple(int tipo, String mensaje) {
//--------------------- ACCIONES -----------------------
try {
switch (tipo) {
case DEBUG:
traza.debug (mensaje.toLowerCase());
break;
case INFO:
traza.info (mensaje.toLowerCase());
break;
case WARN:
traza.warn (mensaje.toLowerCase());
break;
case ERROR:
traza.error (mensaje.toLowerCase());
break;
case FATAL:
traza.fatal (mensaje.toLowerCase());
break;
default:
traza.error (mensaje.toLowerCase());
}
} catch (Exception e) {
// System.out.println ==> Si se intenta imprimir y salta
excepcion
// se emplea traza normal para evitar
bucle
// de errores:
// traza.debug -> Excepcion
// traza.error -> Exception
// ...
// Toda la vida
System.out.println("\n TRAZADOR - ERROR: al imprimir traza
\n " +
"Metodo:
Trazador.imprimeDetallado() \n" +
"Descripcion:
posible error al acceder al trazador \n" +
"Volcado:" +
e.toString());
e.printStackTrace();
} catch (Error e) {
System.out.println("\n TRAZADOR - ERROR: al imprimir traza
\n " +
"Metodo: Trazador.imprimeDetallado() \n" +
"Descripcion: posible error al acceder al trazador
\n" +
"Volcado:" + e.toString());
e.printStackTrace();
}}
//-------------------------------------------------
// IMPRIME DETALLADO
//-------------------------------------------------
// Depuracion ON ===> Formato de traza detallado
//-------------------------------------------------
private void imprimeDetallado( int tipo,
String metodo,
String titulo,
String descripcion) {
//------------ DECLARACIONES LOCALES ------------
String[] mensaje = null;
try {
//--------------- INICIALIZACIONES --------------
mensaje = new String[5];
mensaje[DEBUG] = "Depurado";
mensaje[INFO] = "Informacion";
mensaje[WARN] = "Alerta";
mensaje[ERROR] = "!!! ERROR !!!";
mensaje[FATAL] = "!!! ERROR FATAL !!! => Interrumpiendo
Ejecucion";
//------------------ ACCIONES -------------------
switch (tipo) {
case DEBUG:
traza.debug ("\n----- > " + titulo + ": \n" +
metodo + ": " + mensaje[tipo] +
"\n" +
descripcion + "\n" +
"\n-------------------------------------------");
break;
case INFO:
traza.info ("\n----- > " + titulo + ": \n" +
metodo + ": " + mensaje[tipo] + "\n" +
descripcion + "\n" +
"\n-------------------------------------------");
break;
case WARN:
traza.warn ("\n----- > " + titulo + ": \n" +
metodo + ": " + mensaje[tipo] + "\n" +
descripcion + "\n" +
"\n-------------------------------------------");
break;
case ERROR:
traza.error ("\n----- > " + titulo + ": \n" +
metodo + ": " + mensaje[tipo] + "\n" +
descripcion + "\n" +
"\n-------------------------------------------");
break;
case FATAL:
traza.fatal ("\n----- > " + titulo + ": \n" +
metodo + ": " + mensaje[tipo] + "\n" +
descripcion + "\n" +
"\n-------------------------------------------");
break;
default:
traza.error ("\n----- > " + titulo + ": \n" +
metodo + ": " + mensaje[tipo] + "\n" +
descripcion + "\n" +
" ERROR EN TRAZADOR: nivel de traza
inadecuado " +
"\n-------------------------------------------");
}
} catch (Exception e) {
// System.out.println ==> Si se intenta imprimir y salta
excepcion
// se emplea traza normal para evitar
bucle
// de errores:
// traza.debug -> Excepcion
// traza.error -> Exception
// ...
// Toda la vida
System.out.println("\n TRAZADOR - ERROR: al imprimir traza
\n " +
"Metodo:
Trazador.imprimeDetallado() \n" +
"Descripcion:
posible error al acceder al trazador \n" +
"Volcado:" +
e.toString());
e.printStackTrace();
} catch (Error e) {
System.out.println("\n TRAZADOR - ERROR: al imprimir traza
\n " +
"Metodo: Trazador.imprimeDetallado() \n" +
"Descripcion: posible error al acceder al trazador
\n" +
"Volcado:" + e.toString());
e.printStackTrace();
}}
//-------------------------------------------------
// IMPRIME DETALLADO HTML
//-------------------------------------------------
// Depuracion ON ===> Formato de traza detallado
//
// Trazas adecuadas para un log HTML
//-------------------------------------------------
private void imprimeDetalladoHTML( int tipo,
String metodo,
String titulo,
String descripcion) {
try {
//------------------ ACCIONES -------------------
// 1.- Imprimiendo traza
switch (tipo) {
case DEBUG:
traza.debug (titulo + " - " + metodo +
" - DESCRIPCION:" +
descripcion );
break;
case INFO:
traza.info (titulo + " - " + metodo +
" - DESCRIPCION:" +
descripcion );
break;
case WARN:
traza.warn (titulo + " - " + metodo +
" - DESCRIPCION:" +
descripcion );
break;
case ERROR:
traza.error (titulo + " - " + metodo +
" - DESCRIPCION:" +
descripcion );
break;
case FATAL:
traza.fatal (titulo + " - " + metodo +
" - DESCRIPCION:" +
descripcion );
break;
default:
traza.error (titulo + " - " + metodo +
" - DESCRIPCION:" +
descripcion );
}
} catch (Exception e) {
// System.out.println ==> Si se intenta imprimir y salta
excepcion
// se emplea traza normal para evitar
bucle
// de errores:
// traza.debug -> Excepcion
// traza.error -> Exception
// ...
// Toda la vida
System.out.println("\n TRAZADOR - ERROR: al imprimir traza
\n " +
"Metodo:
Trazador.imprimeDetallado() \n" +
"Descripcion:
posible error al acceder al trazador \n" +
"Volcado:" +
e.toString());
e.printStackTrace();
} catch (Error e) {
System.out.println("\n TRAZADOR - ERROR: al imprimir traza
\n " +
"Metodo: Trazador.imprimeDetallado() \n" +
"Descripcion: posible error al acceder al trazador
\n" +
"Volcado:" + e.toString());
e.printStackTrace();
}}
//-------------------------------------------------
// IMPRIME DETALLADO XML
//-------------------------------------------------
// Depuracion ON ===> Formato de traza detallado
//
// Trazas adecuadas para un log XML
//-------------------------------------------------
private void imprimeDetalladoXML( int tipo,
String metodo,
String titulo,
String descripcion) {
//------------ DECLARACIONES LOCALES ------------
String[] mensaje = null;
try {
//--------------- INICIALIZACIONES --------------
mensaje = new String[5];
mensaje[DEBUG] = "Depurado";
mensaje[INFO] = "Informacion";
mensaje[WARN] = "Alerta";
mensaje[ERROR] = "!!! ERROR !!!";
mensaje[FATAL] = "!!! ERROR FATAL !!! => Interrumpiendo
Ejecucion";
//------------------ ACCIONES -------------------
switch (tipo) {
case DEBUG:
traza.debug ("\n <titulo> " + titulo +
"</titulo> \n" +
"<metodo> " + metodo +
"</metodo> \n" +
"<mensaje> " +
mensaje[tipo] + "</mensaje> \n" +
"<descripcion> " +
descripcion + "</descripcion> \n"
);
break;
case INFO:
traza.info ("\n <titulo> " + titulo +
"</titulo> \n" +
"<metodo> " + metodo +
"</metodo> \n" +
"<mensaje> " +
mensaje[tipo] + "</mensaje> \n" +
"<descripcion> " +
descripcion + "</descripcion> \n"
);
break;
case WARN:
traza.warn ("\n <titulo> " + titulo +
"</titulo> \n" +
"<metodo> " + metodo +
"</metodo> \n" +
"<mensaje> " +
mensaje[tipo] + "</mensaje> \n" +
"<descripcion> " +
descripcion + "</descripcion> \n"
);
break;
case ERROR:
traza.error ("\n <titulo> " + titulo +
"</titulo> \n" +
"<metodo> " + metodo +
"</metodo> \n" +
"<mensaje> " +
mensaje[tipo] + "</mensaje> \n" +
"<descripcion> " +
descripcion + "</descripcion> \n"
);
break;
case FATAL:
traza.fatal ("\n <titulo> " + titulo +
"</titulo> \n" +
"<metodo> " + metodo +
"</metodo> \n" +
"<mensaje> " +
mensaje[tipo] + "</mensaje> \n" +
"<descripcion> " +
descripcion + "</descripcion> \n"
);
break;
default:
traza.error ("\n <titulo> " + titulo +
"</titulo> \n" +
"<metodo> " + metodo
+ "</metodo> \n" +
"<mensaje> " +
mensaje[ERROR] + "</mensaje> \n" +
"<descripcion> ERROR
EN TRAZADOR: " +
"nivel de
traza inadecuado " +
descripcion
+ "</descripcion> \n"
);
}
} catch (Exception e) {
// System.out.println ==> Si se intenta imprimir y salta
excepcion
// se emplea traza normal para evitar
bucle
// de errores:
// traza.debug -> Excepcion
// traza.error -> Exception
// ...
// Toda la vida
System.out.println("\n TRAZADOR - ERROR: al imprimir traza
\n " +
"Metodo:
Trazador.imprimeDetallado() \n" +
"Descripcion:
posible error al acceder al trazador \n" +
"Volcado:" +
e.toString());
e.printStackTrace();
} catch (Error e) {
System.out.println("\n TRAZADOR - ERROR: al imprimir traza
\n " +
"Metodo: Trazador.imprimeDetallado() \n" +
"Descripcion: posible error al acceder al trazador
\n" +
"Volcado:" + e.toString());
e.printStackTrace();
}}
/************************************************************
*<!-- IMPRIME TRAZA
*========================================================-->
* Establece un formato unico para el trazado.
*
* <p><b> OBJETIVOS </b>
* <ul>
* <li> Copy/Paste para cada traza
* <li> Cada tipo de traza (warn, error, etc.) puede
* tener un formato distinto, mas o menos
* sofisticado, segun la necesidad.
* </ul>
*<!--=====================================================-->
* @param tipo Constante indicando el tipo de mensaje.
* Ejms.: Trazador.DEBUG, Trazador.WARN ...
* @param metodo paquete.Clase.metodo() desde donde se ha
* lanzado la traza.
* Ejm.: cliente.ClienteDatagrama.lanzar()
* @param titulo Resumen del evento.
* @param descripcion Descripcion del evento.
* Ejm.: error.toString()
*
************************************************************/
public void imprimeTraza(int tipo,
String metodo,String titulo,
String descripcion) {
//--------------------- ACCIONES -----------------------
try {
if (detalles) {
switch (layout) {
case XML:
imprimeDetalladoXML(tipo,
metodo,
titulo,
descripcion);
break;
case HTML:
imprimeDetalladoHTML(tipo,
metodo,
titulo,
descripcion);
break;
default:
imprimeDetallado(tipo,
metodo,
titulo,
descripcion);
break;
}
} else {
imprimeSimple(tipo,
titulo);
}
} catch (Exception e) {
// System.out.println ==> Si se intenta imprimir y salta
excepcion
// se emplea traza normal para evitar
bucle
// de errores:
// traza.debug -> Excepcion
// traza.error -> Exception
// ...
// Toda la vida
System.out.println("\n TRAZADOR - ERROR: al imprimir traza
\n " +
"Metodo:
Trazador.imprimeDetallado() \n" +
"Descripcion: posible error
al acceder al trazador \n" +
"Volcado:" + e.toString());
e.printStackTrace();
} catch (Error e) {
System.out.println("\n TRAZADOR - ERROR: al imprimir traza
\n " +
"Metodo: Trazador.imprimeDetallado() \n" +
"Descripcion: posible error al acceder al trazador
\n" +
"Volcado:" + e.toString());
e.printStackTrace();
}}
/************************************************************
*<!-- TRATA EXCEPCION
*========================================================-->
* Esta funcion permite manejar las excepciones, para
* hacer lo que se considere pertinente en cada caso.
* Ejm.: imprimir la pila de errores en el fichero de log
* con el formato que sea oportuno.
*<!--=====================================================-->
* @param excepcion Excepcion lanzada por la aplicacion
************************************************************/
public void trataExcepcion (Exception excepcion) {
//------------------ ACCIONES -------------------
try {
if (detalles) {excepcion.printStackTrace();}
} catch (Exception e) {
Logger.getRootLogger().error("TRAZADOR - TRATANDO EXCEPCION --
" +
"Trazador.trataExcepcion(e)" +
"\n
DESCRIPCION: " + e.toString());
trataExcepcion(e);
}}
/************************************************************
*<!-- TRATA ERROR
*========================================================-->
* Esta funcion permite manejar los errores, para
* hacer lo que se considere pertinente en cada caso.
*
* Ejm.: imprimir la pila de errores en el fichero de log
* con el formato que sea oportuno (hipervinculos
* habilitados, etc.)
*<!--=====================================================-->
* @param error Error ocasionado por la aplicacion
************************************************************/
public void trataError (Error error) {
//------------------ ACCIONES -------------------
try {
if (detalles){error.printStackTrace();}
} catch (Exception e) {
Logger.getRootLogger().error("TRAZADOR - TRATANDO ERROR -- " +
"Trazador.trataError(e)" +
"\n DESCRIPCION: " + e.toString());
trataExcepcion(e);
}}
/************************************************************
*<!-- DEBUG
*========================================================-->
* Imprime traza simple de depuracion
*<!--=====================================================-->
* @param mensaje Mensaje a imprimir
************************************************************/
public void debug (String mensaje) {
if (exhaustiva) {
traza.debug(mensaje);
}
}
/************************************************************
*<!-- INFO
*========================================================-->
* Imprime traza simple de informacion
*<!--=====================================================-->
* @param mensaje Mensaje a imprimir
************************************************************/
public void info (String mensaje) {
if (exhaustiva) {
traza.info(mensaje);
}
}
/************************************************************
*<!-- WARN
*========================================================-->
* Imprime traza simple de aviso
*<!--=====================================================-->
* @param mensaje Mensaje a imprimir
************************************************************/
public void warn (String mensaje) {
if (exhaustiva) {
traza.warn(mensaje);
}
}
/************************************************************
*<!-- ERROR
*========================================================-->
* Imprime traza simple de error
*<!--=====================================================-->
* @param mensaje Mensaje a imprimir
************************************************************/
public void error (String mensaje) {
if (exhaustiva) {
traza.error(mensaje);
}
}
/************************************************************
*<!-- FATAL
*========================================================-->
* Imprime traza simple de error fatal
*<!--=====================================================-->
* @param mensaje Mensaje a imprimir
************************************************************/
public void fatal (String mensaje) {
if (exhaustiva) {
traza.fatal(mensaje);
}
}
//***********************************************************
//* CONSTRUCTOR
//**********************************************************/
public Trazador() {
traza = Logger.getRootLogger();}
public Trazador(boolean exhaustive) {
traza = Logger.getRootLogger();
exhaustiva = exhaustive;
}
public Trazador(boolean depuraOn, boolean exhaustive) {
traza = Logger.getRootLogger();
detalles = depuraOn;
exhaustiva = exhaustive;
}
public Trazador(Trazador trazado) {
traza=trazado.getLogger();
}
public Trazador(Trazador trazado, boolean exhaustive) {
traza = trazado.getLogger();
exhaustiva = exhaustive;
}
public Trazador(Trazador trazado, boolean depuraOn, boolean exhaustive) {
traza = trazado.getLogger();
detalles = depuraOn;
exhaustiva = exhaustive;
}
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<!-- ========================================================= -->
<!-- SALIDAS DEL TRAZADOR -->
<!-- -->
<!-- Ojo: las referencias son usadas por la clase Trazador -->
<!-- ========================================================= -->
<!-- =================== Salida por Defecto ================== -->
<appender name="CONSOLA" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%d{dd MMM yyyy HH:mm:ss.SSS} [%p] [%t] [%c] - %m%n"/>
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="WARN" />
<param name="LevelMax" value="FATAL" />
</filter>
</appender>
<!-- =============== Fichero de log de depuración ============= -->
<appender name="LOG" class="org.apache.log4j.FileAppender">
<param name="File" value="logs/log.txt" />
<param name="Append" value="false" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%d{dd MMM yyyy HH:mm:ss.SSS} [%p] [%t] [%c] - %m%n"/>
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="DEBUG" />
<param name="LevelMax" value="FATAL" />
</filter>
</appender>
<!-- ======================== E-MAIL ======================== -->
<!-- Para cuando haga falta (está sin probar)
<appender name="ASYNC" class="org.apache.log4j.AsyncAppender">
<appender-ref ref="MAIL"/>
</appender>
<appender name="MAIL" class="com.frontiers.server.mail.MailAppender">
<param name="Threshold" value="ERROR" />
<param name="To"
value="[EMAIL PROTECTED] ,
[EMAIL PROTECTED], [EMAIL PROTECTED]" />
<param name="Subject" value="Error from CaseServer!!" />
<param name="From" value="[EMAIL PROTECTED]" />
<param name="Location"
value="CaseServer at X company.
I.P. address: 10.1.1.44" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%d{ISO8601} %-5p %c{1} - %m%n"/>
</layout>
</appender>
-->
<!-- ======================== RED ======================== -->
<!-- Para cuando haga falta
-->
<!-- ========================================================= -->
<!-- CONFIGURACION DEL TRAZADOR -->
<!-- ========================================================= -->
<!-- ===================== Salidas Trazado =================== -->
<root>
<priority value ="debug"/>
<appender-ref ref="CONSOLA"/>
<appender-ref ref="LOG"/>
<!-- Mail: <appender-ref ref="ASYNC"/> -->
<!-- Red: <appender-ref ref="RED"/> -->
</root>
</log4j:configuration>
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]