2012-09-04 13 views
11

Czy istnieje biblioteka, która pozwoli na zmienne zalogować po prostu dodając adnotacje jak:adnotacje pozyskujących dla Java

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

który działa podobnie do dodawania tej linii w kodzie:

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

Jakie jest oczekiwane zachowanie? Logować każdy zapis do zmiennej, w tym stacktrace? – bbaja42

+0

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

+0

@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

Odpowiedz

0

Można rób to stosunkowo łatwo, jeśli używasz programowania wiosennego i aspektowego. Spójrz na to.

1

Rejestrowanie odbywa się wewnątrz rzeczywistych adnotacji logicznych, które mogą być używane tylko dla określonych elementów w kodzie źródłowym. możesz użyć co najwyżej loga LOCAL_VARIABLE używając tego, ale nigdy nie można go użyć do zalogowania się plain statements.

Proszę sprawdzić slf4j, który zawiera często odnotowywane adnotacje do logowania.

Elementy, dla których deklaracja Adnotacja jest wspierane są:

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 umożliwia zalogowanie wywołań metod, argumenty, zwracane wartości, rzucony wyjątek (to jeszcze można zmienić poziomu log w zależności od wyjątku, domyślnie używa błędu dla . niesprawdzonych wyjątki i WARN dla sprawdzanych wyjątkami to bardzo mi pomogło w usunięciu kodu szablonowe i ulepszone rejestrowanie

ja również wiedzieć o http://loggifier.unkrig.de. - to nie zalogowaniu poprzez java.util.logging (którego nikt nie używa) trochę zbyt skomplikowany, aby go skonfigurować, a nie taki, który dobrze dokumentuje, ale ma jedną DUŻĄ cechę - twierdzi, że może to już skompilowany plik jar/wojna/ucho (co jest świetne, jeśli chcesz profilować e czyjś paskudny słoik, którego nie możesz przekompilować)!

Dolna linia - jeśli jesteś właścicielem kodu, aspekt4log to twój wybór. Jeśli nie jesteś właścicielem kodu - przejdź do loggifier.

2

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:

  1. AbstractProcessor wykrywa użycie jednej adnotacji dziennika i tworzy jakąś użyteczną strukturę danych do przechowywania informacji o nazwie metody argumenty itp
  2. rejestrów AbstractProcessor a TaskListener w kompilatorze (Javac).
  3. 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.

+0

Interesujący Sprawdzę to. – xybrek

+0

Być może możesz opublikować to w Maven centralnym lub Bintray – xybrek

+0

Dzięki za odpowiedź, niestety bieżąca wersja projektu nie nadaje się do przesłania do Maven Central, to jest bardziej jak szablon. – Hervian