2012-09-04 16 views
11

¿Hay alguna biblioteca que permitirá registrar las variables con sólo añadir anotaciones como:anotaciones de registro para Java

@Log 
String someValueToLog = someMethod(); 
@Log(level="debug",prefix="Here's the value=") 
String someValueToLogAgain = someMethod(); 

que funciona similar a añadir esta línea en el código:

log.info(someValueToLog); 
log.debug("Here's the value="+someValueToLogAgain); 
+0

¿Cuál es el comportamiento esperado? Registre cada escritura en la variable, incluida la stacktrace? – bbaja42

+0

¿Has pensado cuándo exactamente se debería hacer el registro? ¿Qué sucede si hago esto? '@Log int i; while (i <999) i + = i * 2; '... ¿qué debería registrarse aquí? – Ridcully

+0

@Ridcully Yah tiene razón, pero estaba pensando que la anotación de registro solo se registrará una vez. De todos modos, mi idea de sintaxis puede ser incorrecta, pero debe haber una forma de hacerlo – xybrek

Respuesta

0

Puede Haga esto de manera relativamente fácil si utiliza Spring y la programación orientada a aspectos. Mira eso.

1

El registro se realiza dentro de las anotaciones lógicas reales, solo se pueden usar para elementos específicos en el código fuente. a lo sumo puede registrar LOCAL_VARIABLE usando esto pero nunca se puede usar para registrar plain statements.

Compruebe slf4j que proporciona anotaciones de registro de casos comunes.

elementos para los que se apoya la declaración de anotación son:

public enum ElementType { 
/** Class, interface (including annotation type), or enum declaration */ 
TYPE, 

/** Field declaration (includes enum constants) */ 
FIELD, 

/** Method declaration */ 
METHOD, 

/** Parameter declaration */ 
PARAMETER, 

/** Constructor declaration */ 
CONSTRUCTOR, 

/** Local variable declaration */ 
LOCAL_VARIABLE, 

/** Annotation type declaration */ 
ANNOTATION_TYPE, 

/** Package declaration */ 
PACKAGE 

}

Similar of Creating custom annotations

1

http://aspect4log.sf.net le permite registrar las llamadas a métodos, argumentos, el valor devuelto, excepción lanzada (que incluso le permite cambiar el nivel de registro en función de excepción, por defecto se utiliza ERROR de . excepciones sin marcar, y advertir excepciones controladas me ayudaron mucho en la eliminación de código repetitivo y la mejora de la tala

también he sé sobre http://loggifier.unkrig.de -. lo hace a través de la tala java.util.logging (que nadie usa), un poco demasiado complejo de configurar y no tan bien documentado, pero tiene una GRAN característica: afirma que puede instrumentar los archivos ya compilados jar/war/ear (lo cual es genial si quieres perfilar) ¡El frasco de uglry de alguien que no puedes recompilar!

Conclusión: si usted posee el código, aspect4log es su elección. Si no posee el código, vaya a loggifier.

2

He creado un proyecto llamado log-weaver, que presenta un número de instrucciones @LogXXX.
Cuando compila un proyecto que utiliza una de estas anotaciones, las instrucciones de registro se entrelazan en bytecocde.
Ejemplo de código fuente:

@LogEnteringAndExiting(value={"arg1", "this"}) 
public String execute(String arg1) { 
    /*Some logic*/ 
return "done"; 
} 

El código fuente se mantendrá como está, pero el código de bytes se verá como si el código fuente se había escrito así:

private static final Logger comGithubHervian_LOGGER = LoggingHelper.getLogger(ClassWithLogAnnotatedMethods.LogAround_log1ArgumentAndThis.class); 
private static final String = comGithubHervian_CLASSNAME = ClassWithLogAnnotatedMethods.LogAround_log1ArgumentAndThis.class.getName(); 

public String execute(String arg1) { 
    if (LoggingHelper.isEntryExitTraceEnabled((Logger)comGithubHervian_LOGGER)) { 
     comGithubHervian_LOGGER.entering(comGithubHervian_CLASSNAME, "execute", new Object[]{arg1, this}); 
    } 
    /*Some logic*/ 
    String string = "done"; 
    if (LoggingHelper.isEntryExitTraceEnabled((Logger)comGithubHervian_LOGGER)) { 
     comGithubHervian_LOGGER.exiting(comGithubHervian_CLASSNAME, "execute", string); 
    } 
    return string; 
} 

En el código anterior el LoggingHelper es una clase especial de WebpShere Commerce de IBM para la cual se desarrolló esta prueba de concepto.

La idea es simplificar el código fuente eliminando declaraciones triviales, en este caso el registro.
La lógica general es como sigue:

  1. Un AbstractProcessor detecta el uso de uno las anotaciones de registro, y crea una estructura de datos útil, para contener información sobre el nombre del método, los argumentos etc.
  2. Los registros AbstractProcessor un TaskListener en el compilador (Javac).
  3. TaskListener usa Javassist para tejer declaraciones de registro en el código de bytes del método/clase determinado.

Tenga en cuenta que el proyecto actual está diseñado para su uso con WebSphere Commerce de IBM, pero puede ajustarlo fácilmente, por ejemplo, para tejer en el código logs de su elección.

+0

Interesante Lo comprobaré – xybrek

+0

Tal vez pueda publicar esto en Maven central o Bintray – xybrek

+0

Gracias por la respuesta, lamentablemente la versión actual del proyecto no es adecuada para subir a Maven Central, es más como una plantilla. – Hervian

Cuestiones relacionadas