【问题标题】:Modify exception data while logging with NLog使用 NLog 记录时修改异常数据
【发布时间】:2016-02-14 22:40:04
【问题描述】:

我的应用程序方法周围有一个全局 try/catch 来记录未处理的异常并显示错误消息。对于日志记录,我使用 NLog。如果我处理异常并手动记录它,我会在异常数据对象中设置一个键“记录”,以防止第二个日志来自全局 try/catch。

public partial class App : Application
{
    public static void Main(string[] args)
    {
        try
        {
            // Application stuff            
            SomeMethod();
        }
        catch (Exception ex)
        {
            if (ex.Data['logged'] == false)
            {
                logger.Error(ex, "A unhandled exception occured.")
                ex.Data['logged'] = true;
            }

            // Show error dialog
        }
    }

    public static void SomeMethod()
    {
        try
        {
            // Method stuff
        }
        catch (Exception ex)
        {
            logger.Error(ex, "A handled exception occured.")
            ex.Data['logged'] = true;
            throw;
        }
    }
}

我想简化流程,这样我就不必手动调用ex.Data['logged'] = true;。有没有办法在使用 NLog 记录时自动修改异常的数据属性?我尝试使用 MethodCall-Target 但我无法访问异常引用。异常只能作为字符串传递。

【问题讨论】:

    标签: c# exception logging nlog


    【解决方案1】:

    您是否可以使用 NLog 稍微修改您记录异常的方法?

    public partial class App
    {
        private static Logger logger = NLog.LogManager.GetCurrentClassLogger();
    
        public static void Main(string[] args)
        {
            try
            {
                SomeMethod();
            }
            catch (Exception ex)
            {
                logger.ErrorEx(ex, "message");
            }
        }
    
        public static void SomeMethod()
        {
            try
            {
                // Method stuff
            }
            catch (Exception ex)
            {
                logger.ErrorEx(ex, "A handled exception occured.");
                throw;
            }
        }
    }
    
    public static class NLogExt
    {
        public static void ErrorEx(this NLog.Logger logger, Exception ex, string message)
        {
            if (ex.Data["logged"] as bool? == true) return;
            logger.Error(ex, message);
            ex.Data.Add("logged", true);
        }
    }
    

    【讨论】:

    • 感谢您的回答。我也想到了这一点,但我必须为每个日志级别覆盖 15 个重载。我会记住这一点,但希望有一个更紧凑的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2017-11-01
    • 2017-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-30
    • 2011-06-08
    • 2014-10-04
    相关资源
    最近更新 更多