当前位置: 首页 > news >正文

C#:第一性原理理解日志(log)

目录

第一步:想想现实生活中的“日志”

第二步:把这个概念应用到编程里

第三步:日志在代码中的具体表现

如何使用这些级别?

通俗总结

第四步:日志为什么重要?

第一步:想想现实生活中的“日志”

在现实生活中,“日志”是什么?比如说,你去旅行,可能会有一个旅行日志,里面记下每天去了哪里、吃了什么、发生了什么有趣的事。或者公司里的保安每天会写一份值班日志,记录谁来了,谁走了,有没有异常情况。总之,日志就是一种“记录”,用来保存重要信息,以便以后查看或分析。

第二步:把这个概念应用到编程里

在编程中,日志也是类似的“记录”。当你在写代码(比如用C、C++或C#)开发一个程序时,程序在运行时会做很多事情:处理数据、与用户交互、连接数据库等等。有时候,程序可能会出错,或者你想知道程序在某个时刻做了什么、为什么做了这个决定。这时,日志就派上用场了。

所以,从第一性原理看,日志本质上是一个工具,用来记录程序运行时的各种信息,比如:

  • 程序启动了。

  • 某个功能被调用了。

  • 程序遇到了错误。

  • 程序处理了某些数据,结果是什么。

这些记录可以帮助开发者(或者系统管理员)理解程序的行为,排查问题,或者优化性能。

第三步:日志在代码中的具体表现

在C/C++/C#这样的编程语言中,日志通常是通过特定的库或框架实现的。比如:

  • 在C中,你可能用printf或专门的日志库来输出信息。

  • 在C++中,可能用std::cout或者更专业的日志库像log4cpp。

  • 在C#中,可能用Console.WriteLine或者.NET自带的日志框架。

这些工具会把信息写到文件中、屏幕上,或者其他地方(比如数据库)。比如,你可以在代码里写:

printf("程序开始运行 at %s\n", __TIME__);

或者在C#里写: 

Console.WriteLine("用户登录成功!");

这些就是日志的“输出”。开发者可以设置日志的“级别”,比如:

  • 调试信息(Debug):详细的、用于开发时的信息。

  • 信息(Info):普通的运行信息,比如“程序启动”。

  • 警告(Warning):有些不正常但不致命的问题。

  • 错误(Error):出了大问题,需要马上关注的。

与控制台有什么区别? 

这里我们以Debug为例,对比Console.WriteLine和Debug.WriteLine,简单介绍一下与Console的区别 。

特性

Console.WriteLine

Debug.WriteLine

目的

给用户或任何运行程序的人看的信息

给开发者看,专门用于调试和开发

输出位置

控制台(命令行窗口)

调试工具(如Visual Studio输出窗口)

使用场景

程序运行时的提示、用户交互

开发和测试阶段,排查问题

生产环境是否常用

可能(如果需要用户看到信息)

通常不(只在开发时有用)

灵活性

简单,任何时候都能用

需要调试模式支持,生产环境可能被禁用

级别概念

没有,所有的输出都一样

属于调试级别的一部分,通常与日志系统结合

如何使用这些级别?

在代码中,你可以设置日志的输出级别。比如,你可以告诉程序:“只记录Warning及以上的日志”,这样Debug和Info就不会显示,节省资源,也让重要信息更突出。

在C/C++/C#中,开发者会用日志库(如log4net、log4cplus)来实现这些级别。举个简单的例子,在C#里,你可能会写:

logger.Debug("变量初始化"); // 调试信息
logger.Info("程序启动"); // 普通信息
logger.Warning("配置文件缺失"); // 警告
logger.Error("数据库连接失败"); // 错误
logger.Critical("系统宕机"); // 严重错误

通俗总结

日志级别就像程序的“情绪表达”:Debug是细碎的嘀咕,Info是日常报告,Warning是小心提醒,Error是问题警告,Critical是生死攸关的大事。开发者通过设置级别,可以让日志更高效地服务于他们的需求。

第四步:日志为什么重要?

从第一性原理看,程序就像一个黑箱,你看不到它内部在干什么。日志就像是程序的“自白书”或“日记”,它告诉外界(开发者或维护者):“我做了这个,我遇到了那个,我的状态是怎样的。”有了日志,你就不用猜程序在干什么,也能更快地找到问题所在。


文章转载自:
http://average.gbfuy28.cn
http://aspartame.gbfuy28.cn
http://cataplexy.gbfuy28.cn
http://borehole.gbfuy28.cn
http://bibliokleptomania.gbfuy28.cn
http://backside.gbfuy28.cn
http://aetiology.gbfuy28.cn
http://chlamydospore.gbfuy28.cn
http://bezazz.gbfuy28.cn
http://caulocaline.gbfuy28.cn
http://casque.gbfuy28.cn
http://axillae.gbfuy28.cn
http://abaya.gbfuy28.cn
http://carse.gbfuy28.cn
http://assonance.gbfuy28.cn
http://burying.gbfuy28.cn
http://bacca.gbfuy28.cn
http://butterbox.gbfuy28.cn
http://arthritis.gbfuy28.cn
http://accomplishable.gbfuy28.cn
http://atheoretical.gbfuy28.cn
http://bedstone.gbfuy28.cn
http://boring.gbfuy28.cn
http://cemetery.gbfuy28.cn
http://autarchist.gbfuy28.cn
http://chaos.gbfuy28.cn
http://amg.gbfuy28.cn
http://betweenmaid.gbfuy28.cn
http://baroness.gbfuy28.cn
http://chasmophyte.gbfuy28.cn
http://www.dtcms.com/a/100156.html

相关文章:

  • 从零实现Json-Rpc框架】- 项目实现 - 基于Dispatcher模块的RPC框架
  • `git commit --amend` 详解:修改提交记录的正确方式
  • Content-Type设置内容类型
  • React受控表单绑定
  • wx201基于ssm+vue+uniapp的购物系统设计与实现小程序
  • J2EE框架技术 第二章 Maven环境搭建及使用
  • 向字符串添加空格
  • JavaScript函数-函数的概念
  • 列表,元组,字典,集合,之间的嵌套关系
  • LLM中的KV Cache优化技术
  • MATLAB语言的链表反转
  • cline源码分析 ---2
  • 漏洞挖掘---灵当CRM客户管理系统getOrderList SQL注入漏洞
  • 【MinIO】对象存储核心概念
  • linux中jar命令
  • C++之输入与输出
  • 【MySQL基础-17】MySQL数字函数详解:从基础到高级应用
  • Arthas线上问题诊断器
  • 进程相关概念
  • 3. HTTP协议
  • 局域网数据同步软件,局域网数据备份的方法
  • Linux驱动开发-①I2C驱动②spi驱动③uart驱动
  • UE中不同摄像机震动的区别Camera Shake
  • 分布式系统
  • P9246 [蓝桥杯 2023 省 B] 砍树-题解(最近公共祖先LCA + 树上差分)
  • Matlab人脸识别考勤系统【PCA(主成分分析)+ SVM(支持向量机)】
  • 知识表示方法之四:语义网络表示法(Semantic Network Representation)
  • 脑疾病分类的疑惑【6】:脑疾病分类比较适合使用具有哪些特点的模型?
  • OpenIPC开源FPV之Adaptive-Link关键RF参数
  • python下载m3u8格式视频