使用 NLog 记录时修改异常数据

Posted

技术标签:

【中文标题】使用 NLog 记录时修改异常数据【英文标题】:Modify exception data while logging with 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 但我无法访问异常引用。异常只能作为字符串传递。

【问题讨论】:

【参考方案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 个重载。我会记住这一点,但希望有一个更紧凑的解决方案。

以上是关于使用 NLog 记录时修改异常数据的主要内容,如果未能解决你的问题,请参考以下文章

使用 NLog 在 ASP.NET Web API 2.1 中进行全局异常处理?

NLog插入数据库异常处理

使用记录集修改 Excel 数据透视表并刷新:异常

Binlog的三种模式

C#使用NLOG System.TypeInitializationException,类型初始值设定项引发异常

如何使用 NLog JsonLayout 减少异常数据属性的输出?