如何配置log4net以显示调用堆栈&内部异常 [英] How can I configure log4net to display the call stack & inner exception

查看:351
本文介绍了如何配置log4net以显示调用堆栈&内部异常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想要的是基本的,让日志显示异常的InnerException和每个调用的堆栈.

What I want is basic, to have the log display the InnerException(s) for an exception and the call stack for each.

我的配置是:

<log4net debug="false">
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
        <param name="File" value="C:\temp\DotNetEngine.log" />
        <param name="AppendToFile" value="true" />
        <param name="MaxSizeRollBackups" value="2" />
        <param name="MaximumFileSize" value="500KB" />
        <param name="RollingStyle" value="Size" />
        <param name="StaticLogFileName" value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <param name="ConversionPattern" value="%date [%thread] %level %logger - %message%exception%newline" />
        </layout>
    </appender>
    <root>
        <level value="debug" />
        <appender-ref ref="RollingFileAppender" />
    </root>
</log4net>

但是我得到的只是:

2019-05-06 16:28:28,042 [1]错误 RunReport.net.windward.samples.RunReport- RunReportnet.windward.env.DataSourceException:无法加载文件: c:\ test \ xyz.docx; subtype = INVALID_FILENAME;

2019-05-06 16:28:28,042 [1] ERROR RunReport.net.windward.samples.RunReport - RunReportnet.windward.env.DataSourceException: Could not load file: c:\test\xyz.docx; subtype=INVALID_FILENAME;

上述异常确实具有InnerException(已通过调试器验证).

And the above exception does have an InnerException (verified with the debugger).

我正在使用最新的log4net 2.0.8

I am using log4net 2.0.8 which is the latest

推荐答案

将以下类添加到您的代码中:

Add the following class to your code:

/// <summary>
/// Displays inner exceptions for log4net for Exceptions based on java.lang.Throwable. Needed because
/// System.Exception.ToString() returns the call stacks and inner exceptions. java.lang.Throwable does not.
/// </summary>
public class ThrowablePatternConverter : PatternLayoutConverter
{
    /// <summary>
    /// Write out the info for a logging event. Only writes for a java.lang.Throwable
    /// </summary>
    /// <param name="writer">The log output.</param>
    /// <param name="loggingEvent">The logging event - only if java.lang.Throwable</param>
    protected override void Convert(TextWriter writer, log4net.Core.LoggingEvent loggingEvent)
    {
        Exception ex = loggingEvent.ExceptionObject as java.lang.Throwable;
        if (ex == null)
            return;
        bool first = true;
        while (ex != null)
        {
            if (! first)
                writer.Write($"Caused by: {ex.GetType().FullName}: ");
            first = false;
            writer.WriteLine(ex.Message);

            // call stack
            writer.WriteLine(ex.StackTrace);

            ex = ex.InnerException;
        }
    }
}

并将以下内容添加到您的配置文件中:

And add the following to your config file:

                                        <layout type="log4net.Layout.PatternLayout">
                                                        <converter>
                                                                        <name value="throwable" />
                                                                        <type value="Kailua.net.windward.utils.ThrowablePatternConverter" />
                                                        </converter>
                                                        <param name="ConversionPattern" value="%date [%thread] %level %logger - %message%exception%throwable%newline" />
                                        </layout>

这篇关于如何配置log4net以显示调用堆栈&amp;内部异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆