Stworzyłem projekt o nazwie log-weaver, który wprowadza wiele instrukcji @LogXXX.
Podczas kompilowania projektu, w którym wykorzystywana jest jedna z tych adnotacji, instrukcje Log są wplatane w bajtococde. Kod źródłowy
Przykład:
@LogEnteringAndExiting(value={"arg1", "this"})
public String execute(String arg1) {
/*Some logic*/
return "done";
}
Kod źródłowy pozostanie jak jest, ale kod bajtowy będzie wyglądać tak, jakby kod źródłowy został napisany tak:
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;
}
W powyższym kodzie LoggingHelper to specjalna klasa od WebpShere Commerce firmy IBM, dla której opracowano ten dowód.
Chodzi o uproszczenie kodu źródłowego poprzez usunięcie prostych instrukcji, w tym przypadku rejestrowanie.
Ogólnym logika jest następująca:
- AbstractProcessor wykrywa użycie jednej adnotacji dziennika i tworzy jakąś użyteczną strukturę danych do przechowywania informacji o nazwie metody argumenty itp
- rejestrów AbstractProcessor a TaskListener w kompilatorze (Javac).
- TaskListener używa Javassist do wplatania instrukcji log do kodu bajtowego danej metody/klasy.
Należy pamiętać, że bieżący projekt jest przeznaczony do użytku z WebSphere Commerce firmy IBM, ale można go łatwo dostosować, na przykład do wstawiania wybranych przez użytkownika kodów logów do kodu.
Jakie jest oczekiwane zachowanie? Logować każdy zapis do zmiennej, w tym stacktrace? – bbaja42
Czy zastanawiałeś się, kiedy dokładnie należy wykonać rejestrację? Co jeśli zrobię to: '@Log int i; while (i <999) i + = i * 2; '... co powinno być tutaj rejestrowane? – Ridcully
@Ridcully Yah masz rację, ale myślałem, że adnotacja Log po prostu się zaloguje. W każdym razie mój pomysł na składnię może być niepoprawny, ale musi być jakiś sposób, aby to zrobić. – xybrek