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.