详细介绍:C#系统日志

news/2025/10/25 10:32:23/文章来源:https://www.cnblogs.com/yxysuanfa/p/19164857

一、什么是“系统日志 / 日志系统”,以及它的作用

  • 日志(Log):记录程序在运行时,某一时刻发生了什么(事件、数据、错误、性能)。

  • 作用

    1. 排障与回溯(哪里报错、什么时候、堆栈)

    2. 运行洞察(用户行为、接口耗时、业务关键路径)

    3. 合规审计(谁做了什么)

    4. 运维监控(通过日志采集/告警)

二、传统日志信息

 初学时采用控制台显示程序运行结果是 Console.WriteLine("hello world!");

1.运行代码

    static void Main(string[] args){Console.WriteLine("hello world!"); //日志监控1return;  //模拟异常退出Console.WriteLine("OK");//日志监控2}

2.运行结果

3.缺点:没有时间、没有存储、没有区分日志信息等级

围绕以上缺点去开可以能满足自己的日志系统。当然也有一些比较好用的第三方日志库,但建议自己开发,比较是学习。

三、自定义日志信息

1.添加日志时间

   internal class Program{static void Main(string[] args){Log("hello world!"); //日志监控1return;  //模拟异常退出Log("OK");//日志监控2}static void Log(string message) {string logEntry = $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss:fff}]{message}";Console.WriteLine(logEntry);}}

 封装一个Log方法,每当日志显示时,自动添加当前的时间。

[2025-08-22 23:29:05:862]hello world!

2.添加本地存储(.txt)

    internal class Program{static void Main(string[] args){Log("Debug", "This is a debug message");}static void Log(string level, string message) {string logFilePath = $"d:/log-{DateTime.Now:yyyy-MM-dd}.txt";string logEntry = $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss:fff}] [{level}] {message}";Console.WriteLine(logEntry);using (var writer = new StreamWriter(logFilePath, true, Encoding.UTF8)){writer.AutoFlush = false;writer.WriteLineAsync(logEntry);}}}
[2025-09-02 00:12:58:142] [Debug] This is a debug message
E:\code\c#\TestLog\TestLog\bin\Debug\TestLog.exe (进程 13340)已退出,代码为 0 (0x0)。
按任意键关闭此窗口. . .

3.添加日志类型

定义日志级别,例如 Info、Warning、Error、Debug、Log。 如果日志多的话,在.txt分类基本查询。

    internal class Program{static void Main(string[] args){for (int i = 0; i < 1000; i++){if (i < 500){Log("debug", i.ToString());continue;}Log("info", i.ToString());}}static void Log(string level, string message) {string logFilePath = $"d:/log/log-{DateTime.Now:yyyy-MM-dd}.txt";string logEntry = $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss:fff}] [{level}] {message}";Console.WriteLine(logEntry);using (var writer = new StreamWriter(logFilePath, true, Encoding.UTF8)){writer.AutoFlush = false;writer.WriteLineAsync(logEntry);}}}

4.封装成单例者模式

  一个类在整个应用程序生命周期里只会有唯一一个实例,并且提供一个全局的访问点。

  internal class Program{public sealed class Logger{// 1) 单例(全局唯一)private static readonly Lazy _instance = new Lazy(() => new Logger());public static Logger Instance => _instance.Value;private readonly string _basePath = "d:/log";// 2) 构造函数私有化private Logger(){if (!Directory.Exists(_basePath)){Directory.CreateDirectory(_basePath);}}// 3) 日志方法public void Log(string level, string message){string logFilePath = Path.Combine(_basePath, $"log-{DateTime.Now:yyyy-MM-dd}.txt");string logEntry = $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss:fff}] [{level}] {message}";Console.WriteLine(logEntry);// 写入文件using (var writer = new StreamWriter(logFilePath, true, Encoding.UTF8)){writer.WriteLine(logEntry);}}// 便捷方法(可选)public void Debug(string msg) => Log("debug", msg);public void Info(string msg) => Log("info", msg);public void Error(string msg) => Log("error", msg);}static void Main(string[] args){//方法一Logger.Instance.Debug("这是一个Debug日志");Logger.Instance.Info("这是一个Info日志");Logger.Instance.Error("程序结束出现了一个错误示例");//方法二Logger.Instance.Log("TCP", "TPC通讯已打开!");Logger.Instance.Log("相机日志", "相机驱动已连接!");}}
[2025-09-02 00:26:59:803] [debug] 这是一个Debug日志
[2025-09-02 00:26:59:803] [info] 这是一个Info日志
[2025-09-02 00:26:59:803] [error] 程序结束出现了一个错误示例
[2025-09-02 00:26:59:804] [TCP] TPC通讯已打开!
[2025-09-02 00:26:59:804] [相机日志] 相机驱动已连接!
E:\code\c#\TestLog\TestLog\bin\Debug\TestLog.exe (进程 3344)已退出,代码为 0 (0x0)。
按任意键关闭此窗口. . .

5.异步日志

  • 线程安全队列(Channel 或 BlockingCollection) 缓存日志;

  • 启动一个 后台 Task 专门把日志写到文件;

  • 主线程只负责把日志塞进队列,性能更高。

  internal class Program{public sealed class Logger : IDisposable{//readonly 只读// 单例private static readonly Lazy _instance = new Lazy(() => new Logger());public static Logger Instance => _instance.Value;private readonly string _basePath = @"d:\log";private readonly BlockingCollection _queue;private readonly Thread _worker;private volatile bool _running = true;private Logger(){if (!Directory.Exists(_basePath))Directory.CreateDirectory(_basePath);_queue = new BlockingCollection(new ConcurrentQueue());_worker = new Thread(WorkerLoop){IsBackground = true,Name = "LoggerWorker"};_worker.Start();}public void Log(string level, string message){string logFilePath = Path.Combine(_basePath, $"log-{DateTime.Now:yyyy-MM-dd}.txt");string logEntry = $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss:fff}] [{level}] {message}";Console.WriteLine(logEntry);_queue.Add($"{logFilePath}|{logEntry}");}public void Debug(string msg) => Log("debug", msg);public void Info(string msg) => Log("info", msg);public void Error(string msg) => Log("error", msg);private void WorkerLoop(){Console.WriteLine("OK");while (_running || _queue.Count > 0){try{string item;if (!_queue.TryTake(out item, Timeout.Infinite)) {continue;}var parts = item.Split('|');var logFilePath = parts[0];var logEntry = parts[1];using (var writer = new StreamWriter(logFilePath, true, Encoding.UTF8)){writer.WriteLine(logEntry);}}catch (Exception ex){// 写日志出错时,写到控制台Console.Error.WriteLine("Logger error: " + ex);}}}public void Dispose(){_running = false;_queue.CompleteAdding();if (!_worker.Join(2000)){_worker.Abort();}}}static void Main(string[] args){//方法一Logger.Instance.Debug("这是一个Debug日志");Logger.Instance.Info("这是一个Info日志");Logger.Instance.Error("程序结束出现了一个错误示例");//方法二Logger.Instance.Log("TCP", "TPC通讯已打开!");Logger.Instance.Log("相机日志", "相机驱动已连接!");}}

1.知识扩张(来自AI总结)

readonly

  • 作用:修饰字段,使字段只能在 定义时构造函数里 赋值,之后不能修改。

  • 好处:避免对象生命周期中被错误更改。

volatile

  • 作用:告诉编译器和 CPU,字段的值可能被多个线程同时修改,不要优化缓存,每次都要去内存里取最新的值。

  • 常用场景:线程通信(标志位)

IDisposableDispose()

  • 作用:用于 释放资源(文件句柄、数据库连接、线程等)。

  • 模式:实现 IDisposable 接口 → 提供 Dispose() 方法 → 在 using 里用时自动释放。

BlockingCollection<T>

  • 作用:线程安全的集合,用于 生产者-消费者模式

  • 特点:如果队列满了,Add 会阻塞;如果队列空了,Take 会阻塞。

  • 应用:日志异步写入、任务队列。

IsBackground = true

  • 作用:设置线程为 后台线程,当主程序退出时,后台线程会自动结束(不会阻止进程退出)。

  • 区别:前台线程必须执行完,程序才会结束。

sealed 关键字

  • 意思:禁止类被继承(final class)。

  • 作用

    1. 设计意图明确:告诉别人这个类就是最终实现,不允许再派生子类。

    2. 安全性:防止子类随意更改逻辑(比如日志单例类,如果能被继承,可能会破坏单例模式)。

    3. 性能优化:JIT 编译器对 sealed 类的虚方法调用可以优化得更快。

四、打包封装DLL

1.创建类库(.NET Framework)

2.日志程序写入你新建的DLL

3.运行 生产DLL。

五、DLL调用

1.创建程序,调用生产的日志DLL。安装以下步骤添加。

2.记得勾上添加的DLL。

3.检查引用区域是添加。

4.添加自己的namespace 。我的是using myLog;

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using myLog;
namespace TestLogApp
{public partial class Form1 : Form{public Form1(){InitializeComponent();Logger.Instance.Info("Form1 初始化完成!");}private void button1_Click(object sender, EventArgs e){Logger.Instance.Info("点击了按钮1");}private void button2_Click(object sender, EventArgs e){Logger.Instance.Debug("点击了按钮2");}private void button3_Click(object sender, EventArgs e){Logger.Instance.Error("点击了按钮3");}private void Form1_Load(object sender, EventArgs e){Logger.Instance.Info("Form1 加载完成!");}}
}

5.大概做几个按钮 监控按钮的使用情况。

6.生产了操作日志在本地。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/946002.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年自动除渣颗粒热风炉厂家权威推荐榜单:生物质热风炉/大棚供暖热风炉/颗粒热风炉源头厂家精选。

随着环保政策的深入推进和能源结构的转型,自动除渣颗粒热风炉以其高效、清洁、智能等优势,在工业供暖、农业大棚、干燥工艺等领域广泛应用。该设备采用生物质颗粒燃料,通过自动除渣技术有效解决传统热风炉结焦、积灰…

2025年知名的污水格栅机,格栅机品牌厂家排行榜

2025年知名的污水格栅机品牌厂家排行榜 行业概述 污水格栅机作为污水处理系统中的核心设备之一,广泛应用于市政、工业、农业等领域,主要用于拦截和清除污水中的固体悬浮物,确保后续处理工艺的稳定运行。随着环保要…

2025年比较好的渡线煤矿道岔,盾构施工煤矿道岔厂家最新推荐权威榜

2025年比较好的渡线煤矿道岔,盾构施工煤矿道岔厂家最新推荐权威榜行业概述煤矿道岔作为矿山运输系统的关键设备,其质量直接关系到煤矿生产的安全性和效率。随着2025年煤矿智能化建设的深入推进,对渡线道岔和盾构施工…

2025 年高低温试验箱厂家最新推荐,技术实力与市场口碑深度解析恒温恒湿试验箱/高低温试验箱厂家推荐

引言 高低温试验箱作为工业研发与质量检测的核心设备,其性能直接决定检测数据的可靠性与产品迭代效率。2025 年行业数据显示,国内试验箱市场规模突破 90 亿元,但超 30% 的中小品牌因技术缺陷导致设备温度波动度超标…

【Azure Entra ID】当Entra ID中的用户所属Group数量超过200个之后的问题

问题描述 使用Azure Entra ID进行用户的登录授权管理,但是当这个用户所属的组(Group)超过200个之后,在ID Token中就无法全部包含,而是返回一个endpoint,需要再次通过这个Endpoint来获取完整的Group List。例如: #…

2025年靠谱的聚酯切片吨袋,危化品吨袋厂家最新TOP实力排行

2025年靠谱的聚酯切片吨袋、危化品吨袋厂家最新TOP实力排行 在化工、食品、矿产等行业中,聚酯切片吨袋和危化品吨袋是重要的包装运输工具,其质量直接影响货物的安全性和运输效率。选择一家实力强、口碑好的吨袋生产…

2025年质量好的胶印油墨,平版胶印油墨厂家最新热销排行

2025年质量好的胶印油墨,平版胶印油墨厂家最新热销排行胶印油墨行业概述胶印油墨作为印刷行业的核心材料,其质量直接影响印刷品的色彩表现、耐久性和环保性能。随着2025年环保法规的日益严格和印刷技术的不断升级,市…

2025年保洁托管外包服务推荐榜:上海臣峰环境五星领跑,长三角跨区域服务适配单位/小区/商场/办公楼/住宅多场景

2025 年保洁行业愈发注重 “专业化 + 科技化 + 跨区域服务能力”,从基础清洁向 “设施环境全链条服务” 升级。以下推荐榜基于企业真实资质、服务案例与运营实力筛选,为不同场景需求方提供参考。 上海臣峰环境工程有…

2025年靠谱的低温伴热带,铠装伴热带厂家推荐及采购指南

2025年靠谱的低温伴热带,铠装伴热带厂家推荐及采购指南低温伴热带行业概述低温伴热带和铠装伴热带作为现代工业保温防冻的关键产品,已广泛应用于石油化工、电力、建筑、食品医药等多个领域。随着2025年工业自动化水平…

2025 年国内连接器厂家最新推荐榜:中国电子元件行业协会测评认证,覆盖多领域的优质制造商精选

引言 随着电子设备在各行业的深度应用,连接器品质愈发关键。为帮助企业精准选择,中国电子元件行业协会联合第三方检测机构开展 2025 年国内连接器厂家测评,本次测评覆盖 120 余家企业,采用 “多维度量化评分” 体系…

Paper: Extracting alignment data in open models

这篇论文的核心观点在于,对开放权重的大型语言模型 (LLMs) 来说,能够有效地提取用于模型对齐的训练数据。研究人员通过利用在模型后训练阶段引入的聊天模板和特殊标记,能够有效地促使模型“反刍”出类似对齐数据的信…

php直播源码,写代码实现缩进的快捷方式 - 云豹科技

php直播源码,写代码实现缩进的快捷方式有时候,你的代码可能极度让你发狂:if a == b: .... .... .... .... .... .... else: .... .... .... .... .... .... ....热火朝天地写了一大堆,结果发现忘了缩进!这该怎么办…

2025年知名的逆变器高压直流继电器,航空航天高压直流继电器厂家最新实力排行

2025年知名的逆变器高压直流继电器,航空航天高压直流继电器厂家最新实力排行 行业概述 高压直流继电器作为新能源、航空航天、工业自动化等领域的核心元器件,其性能与可靠性直接影响系统安全与效率。2025年,随着全…

Qt6学习入门——环境搭建

Qt6学习入门——环境搭建Qt6学习入门——环境搭建 简介 Qt6 是 Qt 框架的最新主要版本,是一个跨平台的 C++ 应用程序开发框架,用于创建图形用户界面和跨平台应用程序。 我们使用的Qt6 是免费的开源版本。 关于 Qt 许…

2025年评价高的快走丝线切割机床,电火花数控线切割机床实力厂家TOP推荐榜

2025年评价高的快走丝线切割机床,电火花数控线切割机床实力厂家TOP推荐榜在制造业智能化转型的浪潮中,快走丝线切割机床和电火花数控线切割机床作为精密加工的核心设备,其性能与稳定性直接影响着产品质量和生产效率。…

2025年热门的航空航天机械加工,自动化零件机械加工厂家实力及用户口碑排行榜

2025年热门的航空航天机械加工,自动化零件机械加工厂家实力及用户口碑排行榜行业概述航空航天机械加工行业正迎来前所未有的发展机遇。随着全球航空业的复苏和航天产业的蓬勃发展,对高精度、高质量机械零件的需求持续…

2025年口碑好的无油烟不粘锅,高档不粘锅TOP实力厂家推荐榜

2025年口碑好的无油烟不粘锅,高档不粘锅TOP实力厂家推荐榜在当今追求健康烹饪的时代,无油烟不粘锅已成为现代厨房的必备品。2025年,随着消费者对厨具品质要求的不断提升,市场上涌现出一批以技术创新和品质保证著称的…

2025年靠谱的无缝半圆管,外半圆管厂家推荐及选择指南

2025年靠谱的无缝半圆管,外半圆管厂家推荐及选择指南 在工业制造、石油化工、电力供热等领域,无缝半圆管和外半圆管因其优异的耐压性、耐腐蚀性和结构稳定性,成为管道系统中的关键组件。随着2025年制造业技术升级,…

读AI赋能09安全恐慌

读AI赋能09安全恐慌1. 安全恐慌 1.1. 新能力总是伴随着新风险1.1.1. 不应盲目追求零风险1.1.2. 应致力于理解现实环境中的风险,并有条不紊地努力管控和降低这些风险1.1.2.1. 迭代部署便是实现这一目标的有效途径1.2. …

直播电商源码,就“对象”而言我们需要了解什么? - 云豹科技

直播电商源码,就“对象”而言我们需要了解什么?对象可以从以下几个方面概论:1、数组是一组数据的有序集合2、对象是一组数据无序的集合,拥有属性方法3、属性:对象拥有的数据4、方法:对象拥有的操作5、内置对象:…