by Njål

Complete Dump of Asp.net WebRequest

 


Alternate way of dumping logs

 

Here’s a simple but very handy method that lists out all relevant data for a Asp.net web request. Posted Parameters, Query String, Http Headers, Cookies and Session variables are returned – and can be logged out to file/console etc.

Note that this static method can be called anywhere from your code – it does not have to be inside a aspx/ashx etc. The only requirement is that the code must run inside IIS and a web request must be assosiated with the current thread.

 

 

 

public static string DumpRequest()
{
    StringBuilder sb = new StringBuilder();
    sb.AppendLine("");
    sb.AppendLine("-------------  PostedParameters --------------");
    foreach (string key in HttpContext.Current.Request.Form.Keys.Cast<string>().OrderBy(f => f))
    {
        sb.AppendLine(key.PadLeft(40, ' ') + " : " + HttpContext.Current.Request.Params[key]);
    }

    sb.AppendLine("");
    sb.AppendLine("-------------  Query String ------------------");
    foreach (string key in HttpContext.Current.Request.QueryString.Keys.Cast<string>().OrderBy(f => f))
    {
        sb.AppendLine(key.PadLeft(40, ' ') + " : " + HttpContext.Current.Request.QueryString[key]);
    }

    sb.AppendLine("");
    sb.AppendLine("-------------  Http Headers -------------------");
    foreach (string key in HttpContext.Current.Request.Headers.Keys.Cast<string>().OrderBy(f => f))
    {
        sb.AppendLine(key.PadLeft(40, ' ') + " : " + HttpContext.Current.Request.Headers[key]);
    }

    sb.AppendLine("");
    sb.AppendLine("--------------  Cookies -------------------------");
    foreach (string key in HttpContext.Current.Request.Cookies.Keys.Cast<string>().OrderBy(f => f))
    {
        sb.AppendLine(key.PadLeft(40, ' ') + " : " + HttpContext.Current.Request.Cookies[key].Value + " - ExpireDate: " +  HttpContext.Current.Request.Cookies[key].Expires);
    }

    sb.AppendLine("");
    sb.AppendLine("---------------  Session ------------------------");
    foreach (string key in HttpContext.Current.Session.Keys.Cast<string>().OrderBy(f => f))
    {
        sb.AppendLine(key.PadLeft(40, ' ') + " : " + HttpContext.Current.Session[key]);
    }

    return sb.ToString();
}

 

The result looks like this::

-----------------------------------------  PostedParameters -----------------------------------------

-----------------------------------------  Query String ---------------------------------------------
                                username : ted@example.com

-----------------------------------------  Http Headers ---------------------------------------------
                                  Accept : text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
                          Accept-Charset : ISO-8859-1,utf-8;q=0.7,*;q=0.3
                         Accept-Encoding : gzip,deflate,sdch
                         Accept-Language : en-US,en;q=0.8
                           Cache-Control : max-age=0
                              Connection : keep-alive
                                  Cookie : timeOffset=-120; gs_u=1746198188:22843:26224:1320393450549; LANG=en; USER=a33f8…
                                    Host : dev.filemail.com
                              User-Agent : Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome..

-----------------------------------------  Cookies --------------------------------------------------
                                  __utma : 155161261.1943841533.1313506820.1324476330.1325070578.60 - ExpireDate: 01.01.0001 00:00:00
                                  __utma : 155161261.1943841533.1313506820.1324476330.1325070578.60 - ExpireDate: 01.01.0001 00:00:00
                                  __utmc : 260895642 - ExpireDate: 01.01.0001 00:00:00
                                  __utmz : 155161261.1313506820.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none) - ExpireDate:
                                  __utmz : 155161261.1313506820.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none) - ExpireDate:
                       ASP.NET_SessionId : a2xlln05ibzzd2ajywhpizc0 - ExpireDate: 01.01.0001 00:00:00
                                    gs_u : 1746198188:22843:26224:1320393450549 - ExpireDate: 01.01.0001 00:00:00
                                    LANG : en - ExpireDate: 01.01.0001 00:00:00
                              timeOffset : -120 - ExpireDate: 01.01.0001 00:00:00
                                    USER : a33f8a58568f430e8a0d48115ac7b13c - ExpireDate: 01.01.0001 00:00:00

-----------------------------------------  Session --------------------------------------------------
                                       - : -
                              UserObject :

 

by Stian

The type or namespace name 'log4net' could not be found

If you have added a reference to log4net correctly and added your usings, you may get a compile error “The type or namespace name ‘log4net’ could not be found (are you missing a using directive or an assembly reference?)”.

This is most likely due to the Target framework being set to .NET Framework X Client Profile. Change this to .NET Framwork 4 (full version) and your application will compile again!

2011-01-27_1158

If you want to read more about how to set up Log4Net, read my colleagues blog post Configure log4net from code

Tags: ,
by Njål

Configuring Log4net from code!

LOGGING!
Photo: A more traditional way of logging.

The first thing I do when creating a new .NET website/app is to add Log4net. I usually find some old code, and

  1. copy the log4net.dll,
  2. copy the log4net.config
  3. copy the c# code that loads the config file

For a lot of the smaller projects/solutions I am working on – there is no need at all to change log levels / appenders etc. during run time – so I configure log4net directly from my c# code. This means that I can drop the log4net.config file.

Here is a piece of code that creates a simple FileAppender. It can easily be modified to handle RollingFileAppenders etc..


Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();
hierarchy.Root.RemoveAllAppenders(); /*Remove any other appenders*/

FileAppender fileAppender = new FileAppender();
fileAppender.AppendToFile = true;
fileAppender.LockingModel = new FileAppender.MinimalLock();
fileAppender.File = Server.MapPath(“/”) + “log.txt”;
PatternLayout pl = new PatternLayout();
pl.ConversionPattern = “%d [%2%t] %-5p [%-10c] %m%n%n”;
pl.ActivateOptions();
fileAppender.Layout = pl;
fileAppender.ActivateOptions();

log4net.Config.BasicConfigurator.Configure(fileAppender);

//Test logger
ILog log =LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
log.Debug(“Testing!”);

The result of the log test is:
2010-11-13 14:52:46,611 [20] DEBUG [_Default ] Testing!
A good place to put this code is in the entrypoint of your App (the Main(string[] args) method), or in the Global.asax if you are creating a web app (remember to grant the NETWORK SERVICE user write access to the folder you are logging to).

Happy logging!

-N

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) ");