【问题标题】:How to Log Exception in a file?如何在文件中记录异常?
【发布时间】:2010-06-07 12:25:20
【问题描述】:

我希望能够在每个 catch 块中进行日志记录。像这样。

catch (Exception exception)
{
  Logger.Write(exception);
}

然后配置中的设置将使用客户侦听器获取 Message 和 StackTrace 属性等。

我想使用 Enterprise Library Logging Application Block。我敢肯定有人已经这样做了。

【问题讨论】:

    标签: c# wcf logging enterprise-library


    【解决方案1】:

    其他人已经发布了一些关于让日志记录应用程序块 (LAB) 工作的好链接,所以我不会在这里重复。

    在格式化您的异常方面,您有 3 个我能想到的选择:

    1. 使用默认的Exception.ToString()实现(还不错)
    2. 编写集成到 LAB 中的自定义格式化程序。
    3. 编写一个辅助函数来执行格式化并将字符串传递给 Write 方法。

    如果选项 1 不能满足您的需求,那么我建议您使用选项 3(因为选项 2 太过分了)。

    一个简单的例子是这样的:

        catch (Exception exception)
        {
            Logger.Write(LogHelper.CreateExceptionString(exception));
        }
    
        ...
    
        public static string CreateExceptionString(Exception e)
        {
            StringBuilder sb = new StringBuilder();
            CreateExceptionString(sb, e);
    
            return sb.ToString();
        }
    
        private static void CreateExceptionString(
            StringBuilder sb,
            Exception e,
            string indent = "")
        {
            if (indent.Length > 0)
            {
                sb.AppendFormat("{0}Inner ", indent);
            }
    
            sb.AppendFormat("Exception Found:\n{0}Type: {1}",
                indent, e.GetType().FullName);
            sb.AppendFormat("\n{0}Message: {1}",
                indent, e.Message);
            sb.AppendFormat("\n{0}Source: {1}",
                indent, e.Source);
            sb.AppendFormat("\n{0}Stacktrace: {1}",
                indent, e.StackTrace);
    
            if (e.InnerException != null)
            {
                sb.Append("\n");
                CreateExceptionString(sb, e.InnerException, indent + "  ");
            }
        }
    

    【讨论】:

    • 包含异常类型的名称也很有帮助。但其他方面都很好。
    • @Andrew:是的,或者您可以添加一些代码从 Data 属性中提取 IDictionary。
    • Here 是另一个解决方案。希望有所帮助。
    • 我使用了 Shaijut 解决方案,对于我的目的来说似乎更简单,谢谢大家
    【解决方案2】:

    Microsoft 在此提供了广泛的指导:Developing Applications Using the Logging Application Block

    非常值得熟悉他们所说的话,因为它非常强大。

    如果您想要更脚踏实地的东西,这篇博客文章中提供了一些工作示例:How To Configure and Use the Logging Application Block

    如果您在阅读这些内容后仍然遇到问题,请编辑您的帖子,提供有关问题所在的更具体的详细信息。

    【讨论】:

    • 我可以做一些事情来直接传递异常对象,以便它提供详细的堆栈跟踪等,这将有助于调试吗?
    • 您可以创建一个非常简单的方法和/或 string.format 模板,然后在调用 Logger.Write 时使用它。
    • 配置链接直接转到广告。
    • 根据你的第一个链接,这项技术现在已经过时了。
    【解决方案3】:

    @iSid 这是你要的吗

    public static void printException(Exception ex){
                    Console.WriteLine("HelpLink = {0}", ex.HelpLink);
                    Console.WriteLine("Message = {0}", ex.Message);
                    Console.WriteLine("Source = {0}", ex.Source);
                    Console.WriteLine("StackTrace = {0}", ex.StackTrace);
                    Console.WriteLine("TargetSite = {0}", ex.TargetSite);
    
                }
    

    【讨论】:

      【解决方案4】:

      您需要为文本文件添加适当的侦听器 - 请参阅 this 帖子,它适用于 ASP.NET,但配置文件在应用程序中的工作方式相同。

      【讨论】:

      • 我可以做些什么来直接传递异常对象,以便它提供详细的堆栈跟踪等,这将有助于调试。
      猜你喜欢
      • 2021-06-08
      • 2018-01-14
      • 2012-02-24
      • 1970-01-01
      • 2011-08-22
      • 2010-11-17
      • 1970-01-01
      • 2023-04-02
      相关资源
      最近更新 更多