Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to log stack trace using log4net (C#)

Tags:

c#

log4net

How to log stack trace with log4net? I am using .Net version.

They way I have is Log.Error(ex).

Thanks

like image 907
CoolArchTek Avatar asked Feb 16 '12 22:02

CoolArchTek


3 Answers

Use this:

void Error(object message,Exception t)

Reason is in log4net documentation for void Error(object message):

WARNING Note that passing an Exception to this method will print the name of the Exception but no stack trace. To print a stack trace use the void Error(object,Exception) form instead.

Error(object message, Exception t) is the most flexible way to log exception data because it goes as an Exception rather than Object and that can be used in appenders to narrow logs to a particular exception class (rather than by searching for a string which is much slower and less consistent)

There are special versions of all non-format logging methods that take message and exception:

namespace log4net
{
    public interface ILog
    {
        ...
        /* Log a message object and exception */
        void Debug(object message, Exception t);
        void Info(object message, Exception t);
        void Warn(object message, Exception t);
        void Error(object message, Exception t);
        void Fatal(object message, Exception t);
        ...
    }
}
like image 133
Maciej Avatar answered Oct 21 '22 03:10

Maciej


You need to ensure that the definition of the layout pattern is structured to output what format and data you want.

log4Net Pattern Layout

Used to output the stack trace of the logging event The stack trace level specifier may be enclosed between braces. For example, %stacktrace{level}. If no stack trace level specifier is given then 1 is assumed

Output uses the format: type3.MethodCall3 > type2.MethodCall2 > type1.MethodCall1

This pattern is not available for Compact Framework assemblies.

like image 39
Lloyd Avatar answered Oct 21 '22 04:10

Lloyd


There are two basic forms, one that takes an object and an exception explicitly:

catch(Exception ex)
{
    // the form that takes two args has an exception as second, prints trace...
    _log.Error("My custom message", ex);
}

And one that takes any object and performs a ToString() on it:

catch(Exception ex)
{
    // the form that takes one arg uses ToString()
    _log.Error(ex);
}

The former allows you to attach a more meaningful message on the log entry first to give any additional detail you'd like. The latter will do the job but only prints the exception details using ToString(), which gives you:

The default implementation of ToString obtains the name of the class that threw the current exception, the message, the result of calling ToString on the inner exception, and the result of calling Environment.StackTrace. If any of these members is Nothing, its value is not included in the returned string.

like image 12
James Michael Hare Avatar answered Oct 21 '22 05:10

James Michael Hare