sobota, 6 lipca 2013

LoggingService, czyli logowanie błędów w Sharepoint 2010

W pracy programisty bardzo ważne jest logowanie błędów. Gorsze od nie logowania błędów jest tylko błędne logowanie błędów (np. poprzez napisanie własnego logera, co niestety miałem już okazję widzieć w praktyce). Aby poprawnie logować błędy, najlepiej użyć jakiegoś gotowego rozwiązania.

W przypadku aplikacji typu sharepoint nie powinniśmy używać zewnętrznych bibliotek. Jak opisuje to avishnyakov za pomocą spdevlab.com:


Suggestion #0 – Do not use 3rd part logging framework

Even if you stick to log4net, NLog, EventLog or System.Diagnostic.Trace, or trying to invent your own wheel, then DO NOT EVER USE THAT STUFF AGAIN.
SharePoint has its own logging system called “Unified Logging System (ULS)“. If you still wonder why would you use ULS instead your lovely logging framework, then consider the following facts:
  • ULS is used by SharePoint, so if you used 3rd part logging, you would need to consolidate logs from few different sources
  • ULS can be easily configured from Central Administration as well as by PowerShell
  • ULS can write to Windows Event Log without elevated privileges (!)
  • ULS shrinks text log files on the hard drives (!)
  • ULS does not require web.config changes/modifications (!). That’s quite important concern for multi-server farm
  • SharePoint can aggregate ULS log (and not just logs..) from multiple servers to the logging data base (Usage and Health Data Collection Service Application)

Dlatego w rozwiązaniach typu sharepoint 2010 dużo lepszym rozwiązaniem jest napisanie/skopiowanie klasy LoggingService dziedziczącej po SPDiagnosticsServiceBase.
Takie rozwiązanie znajdziemy w wielu miejscach w sieci, więc wydaje się ono być najlepsze.

Sama klasa, wygląda następująco:
public class LoggingService : SPDiagnosticsServiceBase
{
 public static string DiagnosticAreaName = "My";
 private static LoggingService _Current;
 public static LoggingService Current
 {
 get
 {
 if (_Current == null)
 {
 _Current = new LoggingService();
 }
 return _Current;
 }
 }
 private LoggingService()
 : base("My Logging Service", SPFarm.Local)
 {
 }
 protected override IEnumerable<SPDiagnosticsArea> ProvideAreas()
 {
 List<SPDiagnosticsArea> areas = new List<SPDiagnosticsArea>
 {
 new SPDiagnosticsArea(DiagnosticAreaName, new List<SPDiagnosticsCategory>
 {
 new SPDiagnosticsCategory("WebParts", TraceSeverity.Unexpected, EventSeverity.Error)
 })
 };
 return areas;
 }
 public static void LogError(string categoryName, string errorMessage)
 {
 SPDiagnosticsCategory category = LoggingService.Current.Areas[DiagnosticAreaName].Categories[categoryName];
 LoggingService.Current.WriteTrace(0, category, TraceSeverity.Unexpected, errorMessage);
 }
}
natomiast jej użycie wygląda tak:

LoggingService.LogError("WebParts", ex.ToString);
Do przeglądania logów polecam program ULSViewer dostępny na mocy licencji  MICROSOFT PUBLIC LICENSE (Ms-PL)

Przydatne linki:
wpis Avishnyakov'a na spdevlab.com
wpis na blogu Waldka Mastykarza
wpis na blogu Jurgena Baurle

Brak komentarzy:

Prześlij komentarz