目录
一、日志的介绍
①日志存储方式:数据库/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开发中发挥着至关重要的作用,它不仅帮助开发和运维人员更好地理解和管理系统,还提高了系统的可维护性和安全性。确保日志记录符合最佳实践,并合理管理和分析日志数据,可以极大地提升系统的稳定性和性能。