Jakie są najlepsze lub najbardziej przydatne konfiguracje logowania do NLog? (Mogą być proste lub złożone, o ile są przydatne).
Mam na myśli takie przykłady, jak automatyczne przewijanie plików dziennika o określonym rozmiarze, zmiana układu (komunikatu dziennika) niezależnie od tego, czy istnieje wyjątek, eskalacja poziomu dziennika po wystąpieniu błędu itp.
Oto kilka linków:
Odpowiedzi:
Niektóre z nich należą do kategorii ogólnych wskazówek dotyczących NLog (lub rejestrowania), a nie wyłącznie sugestii dotyczących konfiguracji.
Oto kilka ogólnych linków do rejestrowania stąd w SO (niektóre lub wszystkie już widziałeś):
log4net vs. Nlog
Rejestrowanie najlepszych praktyk
Jaki jest sens fasady zrębowej?
Dlaczego rejestratorzy zalecają używanie rejestratora dla poszczególnych klas?
Użyj wspólnego wzorca nazewnictwa rejestratora na podstawie klasy
Logger logger = LogManager.GetCurrentClassLogger()
. Daje to wysoki stopień szczegółowości rejestratorów i daje dużą elastyczność w konfiguracji rejestratorów (sterowanie globalnie, według przestrzeni nazw, według konkretnej nazwy rejestratora itp.).W razie potrzeby używaj rejestratorów nie opartych na nazwie klasy. Być może masz jedną funkcję, dla której naprawdę chcesz kontrolować rejestrowanie osobno. Być może masz jakieś przekrojowe problemy z rejestrowaniem (rejestrowanie wydajności).
Jeśli nie korzystasz z rejestrowania opartego na nazwie klasy, rozważ nazwanie programów rejestrujących w jakiejś strukturze hierarchicznej (być może według obszaru funkcjonalnego), aby zachować większą elastyczność konfiguracji. Na przykład, możesz mieć obszar funkcjonalny „bazy danych”, FA „analizy” i FA „ui”. Każdy z nich może mieć podobszary. Możesz więc poprosić o rejestratory w następujący sposób:
I tak dalej. Za pomocą hierarchicznych programów rejestrujących można skonfigurować rejestrowanie globalnie („*” lub root logger), według FA (baza danych, analiza, interfejs użytkownika) lub według podobszaru (Database.Connect itp.).
Rejestratory mają wiele opcji konfiguracji:
Zobacz pomoc NLog, aby uzyskać więcej informacji o tym, co dokładnie oznacza każda z opcji. Prawdopodobnie najbardziej znaczącymi elementami są tutaj zdolność do rejestrowania symboli rejestrujących z użyciem symboli wieloznacznych, koncepcja, że wiele reguł rejestrujących może „wykonać” dla pojedynczej instrukcji rejestrowania oraz że reguła rejestrująca może być oznaczona jako „ostateczna”, więc kolejne reguły nie będą wykonywane dla podana instrukcja logowania.
Użyj GlobalDiagnosticContext, MappedDiagnosticContext i NestedDiagnosticContext, aby dodać dodatkowy kontekst do wyników.
Aby uprościć, użyj „zmiennej” w pliku konfiguracyjnym. Na przykład możesz zdefiniować zmienne dla swoich układów, a następnie odwoływać się do zmiennej w konfiguracji docelowej zamiast określać układ bezpośrednio.
Możesz też utworzyć „niestandardowy” zestaw właściwości, aby dodać go do układu.
Lub możesz robić takie rzeczy, jak tworzenie rendererów układu „dzień” lub „miesiąc” ściśle poprzez konfigurację:
Możesz także użyć renderowania układu, aby zdefiniować swoją nazwę pliku:
Jeśli codziennie rzutujesz swój plik, każdy plik może mieć nazwę „Monday.log”, „Tuesday.log” itp.
Nie bój się napisać własnego renderera układu. Jest to łatwe i pozwala na dodanie własnych informacji kontekstowych do pliku dziennika poprzez konfigurację. Na przykład tutaj jest mechanizm renderowania układu (oparty na NLog 1.x, a nie 2.0), który może dodać Trace.CorrelationManager.ActivityId do dziennika:
Powiedz NLog, gdzie są twoje rozszerzenia NLog (jaki zestaw):
Użyj mechanizmu renderującego układ niestandardowy w następujący sposób:
Użyj asynchronicznych celów:
I domyślne opakowania docelowe:
w stosownych przypadkach. Zobacz dokumentację NLog, aby uzyskać więcej informacji na ich temat.
Poinformuj NLog, aby obejrzał i automatycznie przeładował konfigurację, jeśli się zmieni:
Istnieje kilka opcji konfiguracji, które pomogą rozwiązać problemy z NLog
Aby uzyskać więcej informacji, zobacz Pomoc NLog.
NLog 2.0 dodaje opakowania LayoutRenderer, które pozwalają na dodatkowe przetwarzanie danych wyjściowych renderera układu (takie jak przycinanie białych znaków, górnej i dolnej itd.).
Nie bój się owinąć programu rejestrującego, jeśli chcesz odizolować swój kod od twardej zależności od NLog, ale poprawnie go zawiń. Istnieją przykłady tego, jak owinąć w repozytorium github NLog. Innym powodem zawijania może być to, że chcesz automatycznie dodawać określone informacje kontekstowe do każdej zarejestrowanej wiadomości (umieszczając ją w LogEventInfo.Context).
Istnieje wiele zalet i wad zawijania (lub wyodrębniania) NLog (lub innych ram rejestrowania w tym zakresie). Przy odrobinie wysiłku możesz znaleźć wiele informacji tutaj na SO prezentujących obie strony.
Jeśli rozważasz owijanie, rozważ użycie Common.Logging . Działa całkiem dobrze i pozwala łatwo przejść do innej struktury rejestrowania, jeśli chcesz. Również jeśli rozważasz zawijanie, zastanów się, jak poradzisz sobie z obiektami kontekstowymi (GDC, MDC, NDC). Common.Logging obecnie nie obsługuje dla nich abstrakcji, ale podobno jest w kolejce możliwości dodawania.
źródło
NewLine
Układ realizuje zadanie. Oto, co wymyśliłem. To na pewno o wiele prostsze, niż się spodziewałem.Traktowanie wyjątków inaczej
Często chcemy uzyskać więcej informacji, gdy istnieje wyjątek. Poniższa konfiguracja ma dwa cele, plik i konsolę, które filtrują, czy są jakieś informacje o wyjątku. (EDYCJA: Jarek napisał o nowej metodzie robienia tego w vNext .)
Kluczem jest posiadanie celu opakowania
xsi:type="FilteringWrapper" condition="length('${exception}')>0"
źródło
condition="length('${exception}')=0
(a może to==
) dotarget name="file"
.Najwyraźniej możesz teraz używać NLog z Growl dla Windows .
źródło
Skonfiguruj NLog poprzez XML, ale programowo
Co? Czy wiesz, że możesz określić plik NLog XML bezpośrednio do pliku NLog w swojej aplikacji, w przeciwieństwie do konieczności odczytu go z pliku konfiguracyjnego przez plik NLog? Cóż, możesz. Załóżmy, że masz aplikację rozproszoną i chcesz wszędzie używać tej samej konfiguracji. Możesz przechowywać plik konfiguracyjny w każdej lokalizacji i utrzymywać go osobno, możesz utrzymać go w centralnej lokalizacji i wypchnąć go do lokalizacji satelitarnych, lub prawdopodobnie możesz zrobić wiele innych rzeczy. Lub możesz zapisać swój XML w bazie danych, pobrać go przy uruchomieniu aplikacji i skonfigurować NLog bezpośrednio z tym XML (może sprawdzać okresowo, czy się zmienił).
Nie jestem pewien, na ile jest to solidne, ale ten przykład stanowi przydatny punkt wyjścia dla osób, które mogą chcieć spróbować skonfigurować w ten sposób.
źródło
<?xml version='1.0' encoding='utf-8' ?><nlog xmlns='http://nlog-project.org/schemas/NLog.xsd' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>
Rejestrowanie różnych poziomów w zależności od tego, czy wystąpił błąd
Ten przykład pozwala uzyskać więcej informacji w przypadku wystąpienia błędu w kodzie. Zasadniczo buforuje komunikaty i wysyła tylko te na określonym poziomie dziennika (np. Ostrzegaj), chyba że spełniony jest określony warunek (np. Wystąpił błąd, więc poziom dziennika wynosi> = Błąd), a następnie wyświetli więcej informacji (np. wszystkie wiadomości z poziomów dziennika> = Śledzenie). Ponieważ komunikaty są buforowane, pozwala to gromadzić informacje o śledzeniu, co się wydarzyło przed zarejestrowaniem wyjątku Error lub ErrorException - bardzo przydatne!
Zaadaptowałem ten z przykładu w kodzie źródłowym . Najpierw zostałem wyrzucony, ponieważ pominąłem
AspNetBufferingWrapper
(ponieważ moja nie jest aplikacją ASP) - okazuje się, że PostFilteringWrapper wymaga buforowanego celu. Zauważ, żetarget-ref
element użyty w powyższym przykładzie nie może być używany w NLog 1.0 (używam 1.0 Refresh dla aplikacji .NET 4.0); konieczne jest umieszczenie celu w bloku opakowania. Zauważ też, że składnia logiczna (tj. Symbole większe niż lub mniejsze niż, <i>) musi używać symboli, a nie ucieczki XML dla tych symboli (tj.>
I<
), w przeciwnym razie NLog popełni błąd.app.config:
źródło
fileAsCsv
Cel-ref jest tylko artefaktem z moich testów. Uważam, że NLog 2 ma / miał problemy z CsvLayouts, których nie miał NLog 1 / Refresh.Podałem kilka dość interesujących odpowiedzi na to pytanie:
Nlog - Generowanie sekcji nagłówka dla pliku dziennika
Dodawanie nagłówka:
Pytanie chciało wiedzieć, jak dodać nagłówek do pliku dziennika. Korzystanie z takich wpisów konfiguracji pozwala zdefiniować format nagłówka oddzielnie od formatu pozostałych wpisów dziennika. Użyj pojedynczego programu rejestrującego, nazywanego być może „headerlogger”, aby zarejestrować pojedynczy komunikat na początku aplikacji, a otrzymasz nagłówek:
Zdefiniuj układ nagłówka i pliku:
Zdefiniuj cele za pomocą układów:
Zdefiniuj rejestratory:
Napisz nagłówek, prawdopodobnie na początku programu:
To w dużej mierze kolejna wersja idei „Traktowanie wyjątków inaczej”.
Zaloguj każdy poziom dziennika przy użyciu innego układu
Podobnie plakat chciał wiedzieć, jak zmienić format według poziomu rejestrowania. Nie było dla mnie jasne, jaki był cel końcowy (i czy można go osiągnąć w „lepszy” sposób), ale byłem w stanie zapewnić konfigurację, która spełniłaby jego oczekiwania:
Ponownie bardzo podobny do Traktowania wyjątków inaczej .
źródło
GlobalDiagnosticsContext
wcześniej.Zaloguj się na Twitterze
Na podstawie tego postu o log4net na Twitterze Appender, Myślałem, że spróbuję swoich sił w pisaniu NLog Twitter Target (używając odświeżania NLog 1.0, a nie 2.0). Niestety, do tej pory nie udało mi się uzyskać tweeta, aby faktycznie opublikować pomyślnie. Nie wiem, czy coś jest nie tak z moim kodem, Twitterem, połączeniem internetowym / zaporą naszej firmy, czy co. Publikuję kod tutaj, na wypadek, gdyby ktoś był zainteresowany jego wypróbowaniem. Pamiętaj, że istnieją trzy różne metody „wysyłania”. Pierwszy, którego próbowałem, to PostMessageToTwitter. PostMessageToTwitter jest zasadniczo taki sam jak PostLoggingEvent w oryginalnym poście. Jeśli go użyję, otrzymam wyjątek 401. PostMessageBasic otrzymuje ten sam wyjątek. PostMessage działa bez błędów, ale wiadomość nadal nie jest na Twitterze. PostMessage i PostMessageBasic są oparte na przykładach, które znalazłem tutaj na SO.
Do Twojej wiadomości - Właśnie znalazłem komentarz @Jason Diller do odpowiedzi w tym poście, który mówi, że Twitter wyłączy podstawowe uwierzytelnianie „w przyszłym miesiącu”. To było w maju 2010 roku, a teraz w grudniu 2010 roku, więc myślę, że to może być powód, dla którego to nie działa.
Skonfiguruj to w następujący sposób:
Powiedz NLog zestawowi zawierającemu cel:
Skonfiguruj cel:
Jeśli ktoś to wypróbuje i odniesie sukces, odeślij swoje wyniki.
źródło
Raportowanie do zewnętrznej strony internetowej / bazy danych
Chciałem sposobu na proste i automatyczne zgłaszanie błędów (ponieważ użytkownicy często tego nie robią) z naszych aplikacji. Najprostszym rozwiązaniem, jakie mogłem wymyślić, był publiczny adres URL - strona internetowa, która mogła pobierać dane wejściowe i przechowywać je w bazie danych - wysyłane dane w przypadku błędu aplikacji. (Baza danych może być następnie sprawdzona przez programistę lub skrypt, aby dowiedzieć się, czy wystąpiły nowe błędy).
Napisałem stronę internetową w PHP i stworzyłem bazę danych mysql, użytkownika i tabelę do przechowywania danych. Zdecydowałem się na cztery zmienne użytkownika, identyfikator i znacznik czasu. Możliwe zmienne (zawarte w adresie URL lub jako dane POST) to:
app
(Nazwa aplikacji)msg
(komunikat - np. Wystąpił wyjątek ...)dev
(programista - np. Pat)src
(źródło - pochodziłoby od zmiennej odnoszącej się do komputera, na którym aplikacja była uruchomiona, np.Environment.MachineName
lub jakiś inny)log
(plik dziennika lub pełny komunikat)(Wszystkie zmienne są opcjonalne, ale nic nie jest raportowane, jeśli żadna z nich nie jest ustawiona - więc jeśli tylko odwiedzisz adres URL witryny, nic nie zostanie wysłane do bazy danych.)
Aby wysłać dane do adresu URL, użyłem nlog za
WebService
cel . (Uwaga: na początku miałem kilka problemów z tym celem. Dopiero gdy spojrzałem na źródło, zorientowałem się, żeurl
nie mogę zakończyć się na/
.)Podsumowując, nie jest to zły system do kontrolowania aplikacji zewnętrznych. (Oczywiście uprzejmie należy poinformować użytkowników , że będziesz zgłaszać potencjalnie wrażliwe dane, i dać im możliwość wyrażenia zgody na rezygnację.)
Rzeczy MySQL
(Użytkownik db ma
INSERT
uprawnienia tylko do tej jednej tabeli we własnej bazie danych).Kod strony internetowej
(PHP 5.3 lub 5.2 z włączoną funkcją PDO , plik znajduje się w folderze)
index.php
/report
Kod aplikacji (plik konfiguracyjny NLog)
Uwaga: mogą występować pewne problemy z rozmiarem pliku dziennika, ale nie znalazłem prostego sposobu na jego obcięcie (np.
tail
Polecenie la * nix ).źródło
url
: InnerException: System.InvalidCastException Message = Niepoprawna rzutowanie z „System.String” na „System.Uri”. Źródło = mscorlib StackTrace: at System.Convert.DefaultToType (IConvertible value, Type targetType, IFormatProvider dostawca) w System.String.System.IConvertible.ToType (Type type, IFormatProvider dostawca) w System.Convert.ChangeType (wartość obiektu, typ konwersji Type) , Dostawca IFormatProvider)Łatwiejszy sposób rejestrowania każdego poziomu dziennika przy użyciu innego układu przy użyciu układów warunkowych
Zobacz https://github.com/NLog/NLog/wiki/When-Filter dla składni
źródło
Zaloguj się z Silverlight
Korzystając z NLog z Silverlight, możesz wysłać dane śledzenia po stronie serwera za pośrednictwem dostarczonej usługi internetowej. Możesz także zapisywać pliki lokalne w Izolowanym magazynie, które przydają się, jeśli serwer WWW jest niedostępny. Zobacz tutaj, aby uzyskać szczegółowe informacje, np. Użyj czegoś takiego, aby stać się celem:
źródło