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.