by Andreas

Log4Net i Sharepoint 2010 web parts

All kode (av noenlunde kvalitet…) som kjører i et produksjonsmiljø logger. Eller burde gjøre det. Om det er til fil, database, eventlogg eller remote over eteren har ikke noe å si – et sted bør det holdes varig track på hva som skjer i en applikasjon. Da jeg hev meg på utvikling i Sharepoint var en av de første “utfordringene” hvordan jeg skulle få skrevet til egne loggfiler i stedet for å bruke de interne Sharepointloggene. Hvorfor? Vel.. det skjer mye Sharepoint. Mye som du sannsynligvis ikke er interessert i, og som ikke nødvendigvis er relevant for den feilen du leter etter grunnen til.

Log4Net er en .NET-portering av Log4J. Den gjør det enkelt for en applikasjon å logge til fil. Det er omtrent det jeg tar med av bakgrunn, siden den som leser dette innlegget sannsynligvis har brukt det før og bare vil se hvordan det brukes i Sharepoint. Jeg tar heller ikke med mulighetene for å bruke Log4Net til å sende mail via SMTP, men den er verdt å få med seg at eksisterer.

Sharepoint er bygd på ASP.NET, og du kan derfor bruke samme fremgangsmåte som du hadde gjort i en hvilken som helst annen ASP.NET-applikasjon. Det som utgjør forskjellen er at en web part ikke nødvendigvis har en web.config-fil. I dette eksemplet bruker jeg den som ligger i roten på selve Sharepoint-instansen (På site collection-nivå). Det er ikke noe i veien for å bruke en mer lokal web.config, men det utgjør ikke noe vesentlig forskjell i demosammenheng.

1. Legg til en referanse til log4net.dll
Denne må enten registreres i GAC manuelt, eller så kan du legge den til Package-elementet i web part-prosjektet. Sjekk dette innlegget for en gjennomgang av det.

2. Legg inn den vanlige ConfigSection og konfigurasjon i web.config
I denne demoen bruker jeg web.config for en hel site collection (ligger gjerne her C:inetpubwwwrootwssVirtualDirectories80web.config).

Øverst i web.config legger jeg log4net-noden som første element under “configSections”:




....

Deretter legger jeg appender-config som et element rett før “system.web”:






















.......

3. Legg til en entry i AssemblyInfo.cs
Her settes ConfiguratorAttribute til å peke på web.config som konfigurasjonsfil:


[assembly: log4net.Config.XmlConfiguratorAttribute(ConfigFile = "web.config", Watch = true)]

4. Legg til en statisk instans av loggeren på klassenivå slik som før (denne henter generisk ut klassens navn i stedet for å selv måtte sette dette for hver klasse):


private static readonly log4net.ILog _log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

5. Logging burde nå (med Guds velvilje og litt triksing med skriverettighetene i målmappen) fungere:


_log.Info("Degree Blogg sparte meg akkurat for masse jobb!");
_log.Warn(" (and I'm a poet and didn't know it) ");

by Andreas

Deployment av 3-parts assemblies i Sharepoint 2010

Om du har merket at de assembliene du legger inn referanser til i et Sharepoint-prosjekt i Visual Studio 2010 ikke blir med under deployment får du fremgangsmåten her.

Sharepoint baserer seg på at disse ligger i GAC (Global Assembly Cache), men de sendes ikke automatisk dit selv om du legger dem til i prosjektet (for eksempel for en webpart). Dette må du konfigurere i Package-elementet i prosjektet.

1. Lokaliser Package-mappen i prosjektet som deployes til Sharepoint. Åpne den og dobbelklikk på Package.package. Du får da opp en oversikt over hvilke deler packen som deployes inneholder (Features, project items etc).

2. Nede til venstre ser du tre elementer: Design, Advanced og Manifest. Trykk Advanced, og du får opp en liste hvor du kan legge til “Additional assemblies”. Her er det bare å trykke Add og navigere til de .dll-filene du vil at Visual Studio skal registrere i GAC ved Deploy.

Merk at det noen ganger feiler når du kjører Build / Deploy, og at dette skyldes en av assembliene som skal registreres i GAC. Det oppstår når Visual Studio skal fjerne den eksisterende .dll-filen fra GAC og den brukes av en annen prosess og dermed er låst. Løsningen er stort sett bare å kjøre Build / Deploy igjen..