NHibernate posiada zmienną show_sql, której ustawienie na "true" powoduje wypluwanie na konsolę wszystkich SQLi idących do bazy. Zachciało mi się pewnego dnia podpiąć po prostu debuggerem pod aplikację i zobaczyć te SQLe w Visualu, w okienku Output. Była to aplikacja web – więc konsoli brak. Trial na nhprof akurat się skończył:), więc w danej minucie również niewiele można było na to poradzić.
Rozwiązaniem najprostszym okazała się podmiana docelowego miejsca zapisu wszystkich informacji wypluwanych na konsolę. Zamiast Console.WriteLine() chciałbym mieć wszędzie System.Diagnostics.Debug.WriteLine() Z konsoli w całej mojej aplikacji i tak korzysta tylko NH, więc pomysł był fsamras.
Kluczem do sukcesu okazała się metoda Console.SetOut() pozwalająca na wpięcie się w proces pisania na konsolę. Wystarczy taka "klaska":
1: public class CustomDebugWriter : TextWriter 2: { 3: public override void WriteLine(string value) 4: { 5: Debug.WriteLine(value); 6: base.WriteLine(value); 7: } 8: 9: public override void Write(string value) 10: { 11: Debug.Write(value); 12: base.Write(value); 13: } 14: public override Encoding Encoding 15: { 16: get { return Encoding.UTF8; } 17: } 18: }
i taka instrukcja gdzieś przy starcie systemu:
1: #if DEBUG 2: Console.SetOut(new CustomDebugWriter()); 3: #endif
żeby mieć NHIbernatowego SQLa fruwającego w Output aż miło.
P.S. Dodatkowo NH umożliwia podpięcie wielu różnych loggerów za pomocą biblioteki Common.Logging (tutaj opis jak to zrobić dla nLog), ale chciałem coś na szybko, już, teraz.
co do common.logging – to 2 miesiace temu jak na to jeszcze patrzylem to nie wspierali nLog 2.0 a nLog 1.x, szybko to wywalilem :) Dodatkowo tez nie widze sensu robienia abstrakcji w logowaniu w naszej aplikacji (chyba, ze to jest aplikacja typu nh). To jest jak robiebie abstrakcji na DI by moc go wymienic czy tez abstrakcji na ORM :) – mozliwe ze zyskasz mozliwosc wymiany DI, ale tez nie wykorzystasz pelnej mocy danego DI :)
dzieki za tip, mialem sie tym dzisiaj zajac bo wiedzialem ze sie da, ale jeszcze nie wiedzialem jak :) a teraz juz wiem ;)
Dzięki za ten przykład, pisząc aplikacje desktopowe wystarczyło ustawić zmienną show_sql i już wszystko było widoczne w Output. A gdy napisałem usługę WCF to te show_sql już nie działało – myślałem że to taki feature NH :)
Btw. Nie to żebym się czepiał, ale tworzysz klasę o nazwie CustomDebugWriter a potem używasz nazwy DebugWriter :)
@Marcinii:
Faktycznie, dzięki, poprawione:)