Enterprise Library 5.0 Silverlight Integration Pack – Logowanie

Większość osób programujących w Silverlighcie napotkało się na problem z logowaniem zdarzeń/błędów. W tym poście chciałbym przedstawić blok Logging biblioteki Enterprise Library dla Silverlighta. Na wstępie chciałbym zaznaczyć, że użycie Enterprise Library w projekcie nie zmusza do używania biblioteki Unity w całym projekcie, jak również nie wymaga użycia bloku Logging po stronie projektu webowego. W poniższym poście zademonstruje jak stworzyć własną usługę WCF dla zbierania zdarzeń od klientów, którą możemy użyć do logowania błędów za pomocą dowolnej biblioteki lub logować błędy w dowolny inny sposób, np. do bazy danych.

Na końcu posta załączony został przykładowy projekt oraz fasada na klasę LogWriter używaną przez Enterprise Library do logowania zdarzeń, udostępniająca interfejs podobny do NLoga oraz fasada dla biblioteki Prism.

Zalety logowania zdarzeń z wykorzystaniem Enterprise Library Silverlight Integration Pack.

Główną zaletą logowania z wykorzystaniem Enterprise Library w Silverlighcie jest to, że wykonuje ona za nas czynności związane z wysyłaniem informacji o zdarzeniach na serwer w zdefiniowanych odstępach czasu, przechowywaniem zdarzeń lokalnie w IsolatedStorage w przypadku niedostępności usługi logowania np. w przypadku braku dostępu do Internetu lub awarii usługi.

Od czego zacząć ?

Zaczynamy od stworzenia projektu Silverlighta i instalacji pakietu “EnterpriseLibrary.Logging” za pomocą NuGet.

I tutaj mała uwaga dla osób, które używają biblioteki Prism ze wsparciem dla Unity, najlepiej najpierw zainstalować EnterpriseLibrary.Logging lub bezpośrednio Unity, ponieważ instalacja pakietu Prism.UnityExtensions instaluje starą wersję Unity (jeśli dobrze pamietam 2.1.404), natomiast EnterpriseLibrary wymaga wersji 2.1.505.

Po dodaniu pakietów, tworzymy nową usługę WCF wybierając typ WCF Service przy dodawaniu nowego pliku i usuwamy stworzony przez Visual Studio interfejs usługi, ponieważ nie będzie on nam potrzebny. Natomiast w klasie usługi wpisujemy:

using System.ServiceModel;
using System.ServiceModel.Activation;
using Microsoft.Practices.EnterpriseLibrary.Logging.Service;
[AspNetCompatibilityRequirementsAttribute(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class RemoteLoggingService : ILoggingService
{
    public void Add(LogEntryMessage[] entries)
    {
        // tutaj wstawiamy kod odpowiedzialny za logowanie zdarzeń
    }
}

I dodajemy referencje w projekcie Silverlightowym do stworzonej usługi. Po dodaniu referencji musimy zmienić jeszcze kontrakt w pliku ServiceReferences.ClientConfig dla usługi na: Microsoft.Practices.EnterpriseLibrary.Logging.Service.ILoggingService. Plik po modyfikacji powinien wyglądać tak (oczywiście adres usługi i port będzie inny niż tutaj):

<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_ILoggingService" maxBufferSize="2147483647"
                    maxReceivedMessageSize="2147483647">
                    <security mode="None" />
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:10901/Logging/RemoteLoggingService.svc"
                binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ILoggingService"
                contract="Microsoft.Practices.EnterpriseLibrary.Logging.Service.ILoggingService" name="BasicHttpBinding_ILoggingService" />
        </client>
    </system.serviceModel>
</configuration>

Zmiana kontraktu jest wymagana, ponieważ bez tego nie będzie możliwe poprawna konfiguracja usługi przez Enterprise Library.

Konfiguracja logowania

Następnie tworzymy plik Configuration.config w projekcie Silverlightowym i klikamy go prawym przyciskiem myszy, w menu pojawi nam się opcja “Edit Silverlight configuration file”, którą klikamy. Następnie w otwartym oknie klikamy w menu “Blocks” i “Add Logging Settings for Silverlight”. Zostaną dodane kategorie logowania i listenery, w których pojawi się “Remote Service Trace Listener”, który rozwijamy i w polu “Logging Service Factory” wpisujemy nazwę końcówki naszej usługi logowania (można ją znaleźć w pliku ServiceReferences.ClientConfig w elemencie “endpoint” atrybut “name”, dla przykładu w powyższym pliku jest to: “BasicHttpBinding_ILoggingService”). Możemy skonfigurować również czas co jaki zdarzenia będą przesyłane na serwer za pomocą własności “Submit Interval” oraz ile może zajmować cache zdarzeń w Isolated Storage, jak również ile elementów może być trzymane w cache’u przed wysłaniem na serwer. Po zakończeniu konfiguracji należy zapisać plik oraz wyeksportować do pliku Configuration.xaml klikając menu “Wizard” i “Export to XAML”, następnie należy załączyć plik do XAML do projektu Silverlightowego.

Używanie LogWritera

Po zapisaniu konfiguracji mamy gotową aplikację skonfigurowaną do logowania zdarzeń. W celu logowania zdarzeń musimy stworzyć instancję obiektu LogWriter, najprostszym sposobem jest użycie EnterpriseLibraryContainer, która stworzy nam gotowy do użycia obiekt:

/* usings
using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
using Microsoft.Practices.EnterpriseLibrary.Logging;
using Microsoft.Practices.EnterpriseLibrary.Logging.Diagnostics;
*/
LogWriter logger = EnterpriseLibraryContainer.Current.GetInstance<LogWriter>();
LogEntry entry = new LogEntry();
entry.Severity = TraceEventType.Error;
entry.Message = "Treść zdarzenia";
logger.Write(entry);

Jednak prostszym sposobem jest użycie fasady, którą użyłem w przykładowym projekcie, wówczas logowanie wygląda tak jak w przypadku NLoga, czyli logger.Error(() => „Treść zdarzenia”);

Zakończenie

W przykładowym projekcie znajduje się przykładowa usługa logowania za pomocą biblioteki NLog (po stronie serwera oczywiście) oraz przykład pobierania konfiguracji z serwera, co jest przydatne zwłaszcza, gdy chcemy ustawić wyższy poziom logowania bez rekompilacji aplikacji. Klasa użyta do pobierania i scalania (AsyncXamlConfigMerger) konfiguracji Enterprise Library pochodzi z przykładowego projektu Stock Trader RI (http://entlib.codeplex.com/releases/view/64923), który bardzo polecam jako kopalnie wiedzy na temat używania Enterprise Library w Silverlighcie. Przykładowy projekt tradycyjnie znajduje się po postem.

1 Comments.

  1. dotnetomaniak.pl - trackback on 24 września 2011 at 12:14

Trackbacks and Pingbacks: