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:
- 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.
- Los registros AbstractProcessor un TaskListener en el compilador (Javac).
- 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.
¿Cuál es el comportamiento esperado? Registre cada escritura en la variable, incluida la stacktrace? – bbaja42
¿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
@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