2012-02-20 22 views
14

¿Hay alguna forma de escribir un registro de errores o una excepción en un archivo en Java? He pasado por Log4j. Busqué en Google pero no encontré una buena solución. He escrito un código simpleCómo escribir un registro de errores o una excepción en un archivo en java

catch (Exception e) { 
    PrintWriter pw = new PrintWriter(new FileOutputStream("Log"));  
    e.printStackTrace(pw); 
} 

¿Hay alguna otra manera de registrar los errores o la excepción? ¿Puede algún cuerpo proporcionarme un ejemplo de muestra de Log4j?

Respuesta

22

Primera leer log4j Manual, es fácil para configurar un archivo de registro continuo No tiene que hacer ninguna operación de archivo explícita.

#SET LEVEL of ROOT-LOGGER, you will like to have Debug in local, but in prod you may just want WARN and ABOVE. This setting is done here! 
log4j.rootLogger=debug, stdout, R 

log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 

# Pattern to output the caller's file name and line number. (basically, format of log) 
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n 

# THIS IS WHERE YOU WILL HAVE ALL THE LOG WRITTEN 
log4j.appender.R=org.apache.log4j.RollingFileAppender 
log4j.appender.R.File=/var/log/applogs/example.log 

# Maximum size of log file, usually we keep 10MB 
log4j.appender.R.MaxFileSize=100KB 
# Keep one backup file, usually we keep 10 
log4j.appender.R.MaxBackupIndex=1 

log4j.appender.R.layout=org.apache.log4j.PatternLayout 
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n 

En segundo lugar, cada vez que se captura una excepción, hacer como esto

public class MyClass{ 

    private static Logger logger = Logger.getLogger(MyClass.class); 

    public ReturnType myMethod(Param p, Param2 p2) { 
    .... 
    .... 
    try { 
     ..  
    } catch(MyException e) { 
     logger.log("Exceptions happen!", e); //this will put all the details in log file configured earlier 
    } 
    .... 
    } 

    .... 
} 

Vale la pena leer el manual. Mejor aún, lea Complete log4j Manual

+1

y ¿qué hago cuando aparecen excepciones sin marcar? ¿Cómo puedo estar seguro de que TODO se enviará al registrador? – Blauhirn

+0

Usa 'Throwable' para atrapar * todo *. No es aconsejable. Es posible que desee leer estas publicaciones: 1. http://stackoverflow.com/questions/6115896/java-checked-vs-unchecked-exception-explanation 2. http://stackoverflow.com/questions/2274102/difference-between -usando-throwable-and-exception-in-a-try-catch – Nishant

+0

@Nishant ¿Dónde se ubicará el archivo de registro? ¿Está dentro de la carpeta apache? – KJEjava48

2

Usando log4j puede iniciar sesión exceptiosn con bastante facilidad:

try { 
    ... 
} catch(Exception e) { 
    log.error("An exception! Oops!", e); 
} 
4
try { 
     System.setErr(new PrintStream(new FileOutputStream(System.getProperty("user.home")+"/error.log"))); 
} catch (FileNotFoundException ex) { 
     ex.printStackTrace(); 
} 

Ahora toda la salida de error se escribe en este archivo

+1

Si bien es técnicamente correcto, ¿cómo es esto mejor que utilizar un marco de trabajo de registro (log4j, juli, commons-logging, etc.)? – pap

+2

¿Por qué usar un framework, cuando puedes resolverlo con los métodos propios de javas? – Thargor

+3

1: No hay soporte para diferentes niveles de registro 2: no hay soporte para contextos de diagnóstico (hilo, clase, método, etc.) 3: No hay soporte para la salida de formato podría seguir. Puedes clavar un clavo con un destornillador, pero ¿por qué no usarías un martillo si tienes uno? – pap

3

Puede añadir la excepción como un parámetro a su estado de log4j, por ejemplo,

catch(Exception e) 
{ 
    logger.error("Unexpected error", e); 
} 

Siempre que tienes un archivo appender funcionando bien, esta es la salida del seguimiento de la pila completa de la excepción.

1

Look this tutorial about "File Appender"

Ver official Log4j short introduction y la sección "Configuración".

También puede buscar "RollingFileAppender" o "File appender".

Configura su registrador para enviar su mensaje a un appender. Este appender puede reenviar el mensaje a la consola (entrada estándar), hacia un archivo (FileAppender, RollingFileAppender ...) ...

Use este para llevar a cabo el registro de errores:

try{ 
    throw new Exception("bla bla bla..."); 
} catch(Exception e){ 
    // log without stack trace 
    mLogger.error("Your log message"); 

    // log with stack trace 
    mLogger.error("Your log message", e); 
} 
Cuestiones relacionadas