Journalisation des erreurs

Contexte
Dans toute application, la journalisation des erreurs et un sujet incontournable. La plupart du temps la solution consistera à utiliser un module générique et réutilisable de journalisation. Ces modules sont la plupart du temps capables de journaliser dans des fichiers, le Windows event log, une base de données ou par courriel. Les ApplicationBlocks de Microsoft contiennent un composant de journalisation qui est un bon exemple.

Une nouvelle option s'ajoute pour un développeur SharePoint. Pourquoi ne pas journaliser les erreurs dans une liste SharePoint ? Cette méthode offre quelques avantages:


 * Le journal d'erreur est accessible via le site SharePoint lui-même
 * Possibilité de gérer les accès au journal d'erreur via la configuration de sécurité incluse dans SharePoint
 * Possibilité d'inscrire des alertes (avec ou sans filtre personnalisé) courriel sur cette liste

Par contre ce type de journalisation assume plusieurs faits:


 * IIS est fonctionnel
 * Le site SharePoint est fonctionnel
 * La base de données est fonctionnelle
 * Les API SharePoint sont accessibles et fonctionnels

Cette méthode de journalisation à haut niveau ne pourra donc pas remplacer les logs de IIS, SharePoint et SQL Server lors de diagnostics plus poussés. Seulement les erreurs applicatives dans nos développement s'y retrouveront.

La configuration
La première étape pour la mise en oeuvre de cette solution est de créer une liste SharePoint qui recevra les entrées de journal. Il y a plusieurs facons équivalentes d'y arriver, mais au final votre liste devrait ressembler à ceci :



Il est important de réviser le contrôle d'accès à cette liste pour s'assurer que seuls les administrateurs peuvent y ajouter/modifier/supprimer et visualiser les items.

Le développement
La seconde partie de la réalisation consitera à insérer le code de journalisation aux endroits stratégiques dans votre application. Ceux-ci varieront selon le type de composants qui nous intéressent (Workflows, Event Listeners, WebParts, etc).

Dans la plupart des cas global.asax est un endroit idéal pour attraper toutes les erreurs survenant en réponse à une action d'un utilisateur dans le site. Cet exemple de code vous permettra de journaliser toutes ces erreurs :

&lt;%@ Import Namespace="Microsoft.SharePoint" %&gt; &lt;script language="C#" runat="server"&gt; protected void Application_Error(object sender, EventArgs e) { //Exécuter la fonction de journalisation avec privilèges élevés, car les utilisateurs non administrateurs //n'ont pas accès à la liste "Erreurs" SPSecurity.CodeToRunElevated elevatedLogError = new SPSecurity.CodeToRunElevated(LogError); SPSecurity.RunWithElevatedPrivileges(elevatedLogError); } public static void LogError {    Exception ex = HttpContext.Current.Server.GetLastError.GetBaseException; //try //{        //Open web using (SPSite site = new SPSite(SPContext.Current.Web.Site.ID)) {            SPWeb web = site.OpenWeb; //Disable security validation web.AllowUnsafeUpdates = true; //Create new Item SPListItem item = web.Lists["Erreurs"].Items.Add; item["Title"] = Trim(ex.GetType.ToString); item["Url"] = Trim(System.Web.HttpContext.Current.Request.Url.AbsoluteUri); item["Message"] = ex.Message; item["Source"] = ex.Source; item["StackTrace"] = ex.StackTrace; item["Author"] = SPContext.Current.Web.CurrentUser.ID; //Save item.Update; }    /*}     catch(Exception excep) {        System.Web.HttpContext.Current.Response.Write(excep.Message); System.Web.HttpContext.Current.Response.Write("&lt;br/&gt;"); System.Web.HttpContext.Current.Response.Write(excep.GetType.ToString); System.Web.HttpContext.Current.Response.Write("&lt;br/&gt;"); System.Web.HttpContext.Current.Response.Write(excep.StackTrace.Replace("\n","&lt;br/&gt;")); System.Web.HttpContext.Current.Response.End; }*/ } private static string Trim(string text) {    return Trim(text, 255); } private static string Trim(string text, int maxLength) {    if(text.Length &gt; maxLength) return text.Substring(0, maxLength); else return text; } &lt;/script&gt;

La partie en commentaire servira lorsqu'il faudra déboguer le code de journalisation lui-même.

Références

 * http://bluesurftech.com/TechBlog/Lists/Posts/Post.aspx?ID=38