2010-08-25 13 views
5

Niedawno otrzymałem zadanie dodania instrukcji rejestrowania do każdego wywołania metody w roztworze. Te wpisy dziennika muszą zawierać nazwę klasy i metody.Logowanie w języku C#: Uzyskiwanie wydajności klasy/nazwy metody

Wiem, że mogę używać metod MethodBase.GetCurrentMethod() i StackFrame.GetMethod(). Co jest lepsze? Czy istnieje lepszy (lub bardziej wydajny) sposób uzyskania nazwy klasy i metody?

+5

* Co * metoda? Istnieją prostsze sposoby na to, aby aplikacja była wolniej wolna od dziesięciu tysięcy razy lub aby generować gigabajt tekstu na minutę. –

+3

Mój los w życiu jest tylko zrobienie tego, o co prosi klient. –

+0

jest miejsce w relacji konsultingowej dla konstruktywnej krytyki i, w rzeczywistości, jest to ważna część pracy. Pracowałem nad projektami, które miały tego rodzaju wszechobecne rejestrowanie śladów i generalnie powodowały, że wszyscy ignorowali dzienniki, chyba że musieli poświęcić kilka godzin, aby je przeszukać. –

Odpowiedz

5

mam dwie propozycje:

  1. Użyj ramy gotowe AOP (jak http://www.sharpcrafters.com/) mogą obsłużyć to łatwo
  2. Wykonaj akcję niestandardową prebuild gdzie można wymienić jakieś odgałęzienie na początku każda metoda:

    nieważne PerformSomeAction() { // PUT_LOGGING_HERE }

następnie w niestandardowym narzędziu zastąp te kody nazwami metod. Jest to gwarantowana najszybsza metoda, ale wymaga pewnych inwestycji.

+0

+1, To jest ten typ scenariusza, dla którego stworzono AOP. –

+0

Czy mógłbym, już podniosłem tę sugestię. Nie to nie jest doskonały punkt. –

1

this.getType().toString() powinno Ci klasę

o sposobie wydaje StackFrame i methodbase są najbardziej obvouis rozwiązania, nie mogę wypowiedzieć się na temat, który jest bardziej wydajny.

+1

wyjątkiem jest C#, a nie Java, ale ogólnie masz rację – Andrey

+0

Powinien to być this.GetType(). ToString()? czy też brakuje mi czegoś innego? – Raynos

+0

Object.ToString() zwróci nazwę klasy, chyba że ToString() zostało nadpisane. – Nate

2

Cóż, najlepszym/najszybszym sposobem jest dołączenie ciągu znaków do każdej funkcji. To może nie wydawać się najbardziej praktycznym rozwiązaniem, ale MethodBase.GetCurrentMethod() wymaga kodowania wewnątrz każdej metody, która i tak go używa. czyli można napisać

string funcName = "MyClass.MyFunction(int, int)"; 

lub można napisać

string funcName = MethodBase.GetCurrentMethod().Name 

Teraz, jeśli chcesz dostać się nazwa funkcji, która zwanego bieżącej funkcji (czyli chcesz to zrobić w jeden punkt w twojej funkcji logowania), wtedy jedyną opcją jest czytanie przez StackFrame.

+0

Jeśli dobrze pamiętam, MethodBase.Metoda GetCurrentMethod() może również zwracać różne wyniki w zależności od inline/optymalizacji wykonywanej przez kompilator, więc nazwy funkcji kodowania twardego mogą być bardziej niezawodne w tym sensie. –

+0

można zautomatyzować, włączając nazwę funkcji jako ciąg w procesie kompilacji – Andrey

Powiązane problemy