Web开发:在 try-catch 块中有效捕捉和记录日志的最佳实践

目录

一、日志的介绍

二、控制台程序(demo)

三、封装方法

【打印日志信息】

【打印实体信息(引用类型)】

 【打印变量信息(值类型)】

四、实现效果

五、try-catch嵌套上抛错误到外层

六、总结 


一、日志的介绍

①日志存储方式:数据库/txt

  • 日志量和复杂性:如果日志量大且需要复杂查询,数据库更为适合;如果日志量较小且不需要复杂查询,文本文件可能更为简便。
  • 性能要求:高频率的日志记录可能需要数据库的性能优化支持,而文本文件则适合低频或中等频率的记录。
  • 预算和资源:数据库通常需要更多的资源和费用,而文本文件的存储和维护成本较低。


②必要性:生产环境中不能debug,但是可以靠日志定位错误;监控用户行为;


③日志级别:(如 DEBUG, INFO, WARN, ERROR, FATAL)区分信息的重要性和紧急程度;

二、控制台程序(demo)

using System.Diagnostics;

namespace Progaram
{
    class Program
    {
        public class Student
        {
            public int Id { get; set; }
            public string Name { get; set; }
            public int Age { get; set; }
        }
        static void Main()
        {
            try
            {
                int result = 10 / int.Parse("0");
            }
            catch (Exception ex)
            {
                LoggerMessAge(ex);//任务二
            }
        }

          private static void LoggerMessAge(Exception ex)
        {
          string message = $@"
          【报错时间】{DateTime.Now}
          【报错内容】{ex.Message}
          【报错位置】{ex.StackTrace?.Trim()}
          【报错类库】{ex.Source}
          【报错的类】{ex.TargetSite?.DeclaringType?.FullName}
          【报错方法】{ex.TargetSite}" + "\n";
          Console.WriteLine(message);
          Debug.WriteLine(message);
          File.AppendAllText("error.log", message);
      }
    }
}


三、封装方法

【打印日志信息】

  private static void LoggerMessAge(Exception ex)
  {
      string message = $@"
      【报错时间】{DateTime.Now}
      【报错内容】{ex.Message}
      【报错位置】{ex.StackTrace?.Trim()}
      【报错类库】{ex.Source}
      【报错的类】{ex.TargetSite?.DeclaringType?.FullName}
      【报错方法】{ex.TargetSite}" + "\n";
      Console.WriteLine(message);
      Debug.WriteLine(message);
      File.AppendAllText("error.log", message);
  }

【打印实体信息(引用类型)】

private static string GetEntityContent<T>(string name , T? entity) where T : class //【输出引用类型信息】反射实现输出所有字段名、字段的值
{
    //Student entitys = new Student();//调用示例
    //var result = GetEntityContent<Student>(nameof(entitys), entitys);
    if (entity == null)
    {
        return $"类{typeof(T).Name}的对象{name}的值为null!";
    }
    string result = $"类{typeof(T).Name}的对象{name}的值为:  ";
    foreach (var filed in typeof(T).GetProperties())
    {
        result += $"{filed.Name}:{filed.GetValue(entity)}  ";
    }
    return result;
}

 【打印变量信息(值类型)】

public static string GetVariableInfo<T>(string variableName, T a)//【输出值类型信息】
{
    return $"变量【{variableName}】的类型是【{a.GetType().Name}】,值是【{a}】";//示例:int b = 1000 ; GetVariableInfo(nameof(b),b)
}

四、实现效果

【日志输出位置】.\bin\Debug\net8.0\error.log.txt

【控制台输出】

【Debug窗口输出】 

五、try-catch嵌套上抛错误到外层

演示: 

try
{

}
catch(Exception ex)
{
    try
    {

    }
    catch(Exception ex)
    {
        throw; // 重新抛出异常
    }
}

 demo:

class Program
{
    static void Main()
    {
        try
        {
            // 外层代码
            TestMethod();
        }
        catch (Exception ex)
        {
            Console.WriteLine("外层捕获到异常: " + ex.Message);
        }
    }

    static void TestMethod()
    {
        try
        {
            // 内层代码,故意抛出异常
            int a = 0;
            int b = 100 / a;
        }
        catch (Exception ex)
        {
            Console.WriteLine("内层捕获到异常: " + ex.Message);
            throw; // 重新抛出异常
        }
    }
}

demo输出:

内层捕获到异常: Attempted to divide by zero.
外层捕获到异常: Attempted to divide by zero.

六、总结 

        日志记录在Web开发中发挥着至关重要的作用,它不仅帮助开发和运维人员更好地理解和管理系统,还提高了系统的可维护性和安全性。确保日志记录符合最佳实践,并合理管理和分析日志数据,可以极大地提升系统的稳定性和性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值