C# Winform 日志系统

目录

一、效果

1.刷新日志效果

2.单独日志的分类

3.保存日志的样式

二、概述

三、日志系统API

1.字段

Debug.IsScrolling

Debug.Version

Debug.LogMaxLen

Debug.LogTitle

Debug.IsConsoleShowLog

2.方法

Debug.Log(string)

Debug.Log(string, params object[])

Debug.Logs(string)

Debug.Logs(string, params object[])

Debug.LogSave(string)

Debug.LogSave(string, params object[])

Debug.Warning(string)

Debug.Warning(string, params object[])

Debug.Warnings(string)

Debug.Warnings(string, params object[])

Debug.Error(string)

Debug.Error(string, params object[])

Debug.Errors(string)

Debug.Errors(string, params object[])

Debug.ErrorSave(string)

Debug.ErrorSave(string, params object[])

Debug.ErrorSave(string, Exception)

Debug.ErrorSave(string, Exception, params object[])

Debug.Clear

Debug.Show

Debug.Show(int, int)

Debug.Show(Control)

Debug.Show(control, int, int)

结束


一、效果

1.刷新日志效果

由于 gif 图片的问题,界面有点闪烁,真实效果要比这个流程的多。另一个也可以看出,快速的更新日志并没有什么问题。

2.单独日志的分类

我这里分了四个类型,可以根据分类查看单独的日志

3.保存日志的样式

保存日志的目录

日志保存后的样式

二、概述

在我开发这个日志系统之前,我一直都是使用 Winform 自带的控制台作为日志系统,熟悉我文章的朋友都知道,我经常将 Winform 程序和控制台混和一起使用的,控制台输出日志确实非常方便,但它同时也有缺点,比如,在 Winform 程序运行后,任务栏会同时显示两个应用,控制台也算一个单独的程序,如果说单独运行一个 Winform 程序,还不会觉得有什么影响,但如果同时启动四五个 Winform 程序,那任务栏就基本全部被占满了,另一个,这个控制台还不能关闭,一关闭,就会连窗体程序一起关闭了,这还不算,如果你用 Winform 写一些小工具,放到 Window Server 服务器系统上,一打开程序,控制台会默认全屏,瞬间整个屏幕都是黑的,而且每次都得手动的去调整它的大小,非常的麻烦,后面我也不得不去开发一个日志系统,用的时候就把它打开,不用的时候就把它关闭,再次打开时,日志依然还在。

三、日志系统API

日志的界面用的是 ListView 开发的,另外加入了导出日志,和清理日志的功能,导出日志能导出 csv 格式的日志,办公软件或者记事本都可以查看。

在使用日志系统之前,请先安装 log4net,不然调用日志系统的接口会报错

下面我介绍下日志系统的一些接口,源码的下载方式在文章的最后面

1.字段

Debug.IsScrolling

是否滚动日志,

public static bool IsScrolling { get; set; }

在日志界面打开后,有新的日志输出时,是否自动向上滚动。

Debug.Version

日志的版本号

 public static string Version { get; private set; }

主要用来读取当前 dll 的版本号

Debug.LogMaxLen

日志的最大长度

 public static int LogMaxLen { get; set; }

日志界面中显示的日志最大行数,如果当前日志条数超过了最大长度,那么会自动移除最顶部的日志。

Debug.LogTitle

日志的标题

 public static string LogTitle { get; set; }

就是自定义窗体的 title,如下图

这是防止在多个程序中使用,分不清当前日志系统是哪一个程序的日志窗体。

Debug.IsConsoleShowLog

是否在控制台输出

public static bool IsConsoleShowLog { get; set; }

虽然日志系统可以输出日志,但是,如果你想同时在控制台一起输出,设置为 true 即可。

2.方法

Debug.Log(string)

在日志窗体中输出普通日志,不会保存到本地

public static void Log(string message)

Debug.Log(string, params object[])

在日志窗体中输出普通日志,不会保存到本地

public static void Log(string message, params object[] objs)

使用 params 可变参数,主要是考虑在字符串中加入各种参数的需求,比如打印这么一句

Debug.Log("用户名:{0},状态:{1}", "张三", "正常");

Debug.Logs(string)

在日志窗体中输出普通日志,并将日志保存到本地

public static void Logs(string message)

和上面 Log 方法不同的是,这里只是在 Log 方法后面加了个 s,主要也是为了写起来方便,不想方法的名字过于的长。

Debug.Logs(string, params object[])

在日志窗体中输出普通日志,并将日志保存到本地

public static void Logs(string message, params object[] objs)

用法同 Debug.Log(string, params object[]) 一致。

Debug.LogSave(string)

不会在日志窗体中输出日志,但会保存到本地

 public static void LogSave(string message)

这个方法的主要作用是保存日志,而不需要在日志窗体中输出。

Debug.LogSave(string, params object[])

不会在日志窗体中输出日志,但会保存到本地

public static void LogSave(string message, params object[] objs)

同上面方法一样,主要用于字符串中的参数嵌套。

Debug.Warning(string)

在日志窗体中输出异常日志,不会保存到本地

public static void Warning(string message)

和普通日志不同的是,异常日志在日志窗体中的图标不同。

Debug.Warning(string, params object[])

在日志窗体中输出异常日志,不会保存到本地

 public static void Warning(string message, params object[] objs)

异常日志的可变参数重载版本。

Debug.Warnings(string)

在日志窗体中输出异常日志,并将日志保存到本地

public static void Warnings(string message)

Debug.Warnings(string, params object[])

在日志窗体中输出异常日志,并将日志保存到本地

public static void Warnings(string message, params object[] objs)

异常日志的可变参数重载版本。

Debug.Error(string)

在日志窗体中输出错误日志,不会保存到本地

public static void Error(string message)

Debug.Error(string, params object[])

在日志窗体中输出错误日志,不会保存到本地

public static void Error(string message, params object[] objs)

Debug.Errors(string)

在日志窗体中输出错误日志,并将日志保存到本地

public static void Errors(string message)

Debug.Errors(string, params object[])

在日志窗体中输出错误日志,并将日志保存到本地

Debug.ErrorSave(string)

不会在日志窗体中输出日志,但会保存到本地

public static void ErrorSave(string message)

和上面普通日志的区别是,在保存时显示的日志类型是错误类型。

Debug.ErrorSave(string, params object[])

不会在日志窗体中输出日志,但会保存到本地

public static void ErrorSave(string message, params object[] objs)

Debug.ErrorSave(string, Exception)

不会在日志窗体中输出日志,但会保存到本地

public static void ErrorSave(string message, Exception ex)

能将 C# 运行时的异常保存到本地的日志中

Debug.ErrorSave(string, Exception, params object[])

不会在日志窗体中输出日志,但会保存到本地

public static void ErrorSave(string message, Exception ex, params object[] objs)

能将 C# 运行时的异常保存到本地的日志中,日志能同时加入可变参数。

Debug.Clear

清除所有日志

 public static void Clear()

Debug.Show

显示日志窗体(会受跨线程问题影响)

 public static void Show()

在UI线程调用,是不会受到线程问题的影响的,当前方法打开的日志窗体是一个默认的大小。

Debug.Show(int, int)

显示日志窗体,并指定日志窗体的宽和高(会受跨线程问题影响)

 public static void Show(int width, int height)

在UI线程内调用不会受到影响。

Debug.Show(Control)

使用指定的控件线程来显示日志窗体

public static void Show(System.Windows.Forms.Control control)

在UI线程内调用不会受到影响。

Debug.Show(control, int, int)

使用指定的控件线程来显示日志窗体,并指定日志窗体的宽和高

public static void Show(System.Windows.Forms.Control control, int width, int height)

当前日志系统,我花了一段时间写出来的,在工作中用了几个月,在后面也是陆陆续续的更新,还是比较稳定的,代码我没有贴出来,有需要的可以去支持一下我。

在 csnd 出售资源是有分成的,csdn 官方差不多要拿一半左右,我这里其实没多少收益,或者你也可以通过捐赠的方式(我主页的置顶文章),付款后私信我。

如果对源码有疑问的欢迎私信我,我看到后会回复的。

下载地址:点击跳转

结束

如果这个帖子对你有所帮助,欢迎 关注 + 点赞 + 留言

end

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

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

相关文章

FFmpeg抽取视频h264数据重定向

根据视频重定向技术解析中的 截获解码视频流的思路,首先需要解决如何输出视频码流的问题。 目前只针对h264码流进行获取,步骤如下: 打开mp4文件并创建一个空文件用于存储H264数据 提取一路视频流资源 循环读取流中所有的包(AVPacket),为…

线程安全3--wait和notify

文章目录 wait and notify(等待通知机制notify补充 wait and notify(等待通知机制 引入wait notify就是为了能够从应用层面上,干预到多个不同线程代码的执行顺序,这里说的干预,不是影响系统的线程调度策略&#xff08…

uni-app应用设置 可以根据手机屏幕旋转进行 (横/竖) 屏切换

首先 我们打开项目的 manifest.json 在左侧导航栏中找到 源码视图 然后找到 app-plus 配置 在下面加上 "orientation": [//竖屏正方向"portrait-primary",//竖屏反方向"portrait-secondary",//横屏正方向"landscape-primary",//横屏…

IDEA启动应用时报错:错误: 找不到或无法加载主类 @C:\Users\xxx\AppData\Local\Temp\idea_arg_filexxx

IDEA启动应用时报错,详细错误消息如下: C:\devel\jdk1.8.0_201\bin\java.exe -agentlib:jdwptransportdt_socket,address127.0.0.1:65267,suspendy,servern -XX:TieredStopAtLevel1 -noverify -Dspring.output.ansi.enabledalways -Dcom.sun.management…

基于以太坊的智能合约开发Solidity(事件日志篇)

//声明版本号(程序中的版本号要和编译器版本号一致) pragma solidity ^0.5.17; //合约 contract EventTest {//状态变量uint public Variable;//构造函数constructor() public{Variable 100;}event ValueChanged(uint newValue); //事件声明event Log(…

class064 Dijkstra算法、分层图最短路【算法】

class064 Dijkstra算法、分层图最短路【算法】 算法讲解064【必备】Dijkstra算法、分层图最短路 code1 743. 网络延迟时间 // Dijkstra算法模版(Leetcode) // 网络延迟时间 // 有 n 个网络节点,标记为 1 到 n // 给你一个列表 times&…

法律服务网站建设效果如何

律师事务所及法律知识咨询机构等往往是众多人群需求的服务,服务多样化及内容多元化,市场中也有大量品牌,在实际消费服务中大多以本地事务所为主,而线上咨询服务则一般没有区域限制,同行增多及人们知识获取渠道增加&…

C++-引用和指针区别

文章目录 1.变量的组成2.指针2.1 定义2.2 使用指针操作变量2.3 为什么使用指针 3.引用3.1 定义3.2 引用注意事项 4.引用和指针的区别 1.变量的组成 变量的组成:变量地址,变量名,变量值 例: int i 12;2.指针 2.1 定义 指针用于存…

如何为游戏角色3D模型设置纹理贴图

在线工具推荐: 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 当谈到游戏角色的3D模型风格时,有几种不同的风格&#xf…

Mybatis中的查询操作

单表查询 单表查询在《初始Mybatis》中已经介绍过&#xff0c;这里就不在介绍了。咱们这里只说单表查询中的“like查询”。like查询单独使用#{}报错 <select id"selectByKeyword" resultType"com.example.demo.entity.Userinfo">select * from use…

计网Lesson8 - NAT技术与链路层概述

文章目录 NAT 技术1. 因特网的接入方式2. 公网和私网3. NAT 技术 链路层1. 数据链路层概述2. 数据链路层的三个问题2.1 封装成帧2.2 透明传输2.3 差错检测 NAT 技术 1. 因特网的接入方式 光猫将电信号转换为数字信号发送给路由器 光纤入户 光纤传递的就是数字信号&#xff0c…

python+pytest接口自动化(12)-自动化用例编写思路 (使用pytest编写一个测试脚本)

经过之前的学习铺垫&#xff0c;我们尝试着利用pytest框架编写一条接口自动化测试用例&#xff0c;来厘清接口自动化用例编写的思路。 我们在百度搜索天气查询&#xff0c;会出现如下图所示结果&#xff1a; 接下来&#xff0c;我们以该天气查询接口为例&#xff0c;编写接口测…

每日一练2023.12.9—— 矩阵A乘以B【PTA】

题目链接&#xff1a;L1-048 矩阵A乘以B 题目要求&#xff1a; 给定两个矩阵A和B&#xff0c;要求你计算它们的乘积矩阵AB。需要注意的是&#xff0c;只有规模匹配的矩阵才可以相乘。即若A有Ra​行、Ca​列&#xff0c;B有Rb​行、Cb​列&#xff0c;则只有Ca​与Rb​相等时&a…

Linux Shell 基础命令

Linux 是一个开源的操作系统&#xff0c;其命令行界面是它的重要组成部分。在这个界面下&#xff0c;Shell 是一个能够与操作系统进行交互的工具。Shell 是一种程序&#xff0c;它能够接收用户输入的命令&#xff0c;并将这些命令发送到操作系统中进行处理。 在 Linux 中&…

VINS-MONO代码解读5----vins_estimator(marginalization部分)

文章目录 0. 前言1.1 Marginalization Pipiline 1. marg factor构建1.1 变量及维度理解1.2 IMUFactor1.3 ProjectionTdFactor(ProjectionFactor)1.4 MarginalizationFactor( e p e_p ep​推导更新&#xff0c;FEJ解决的问题)1.4.1 先验残差的更新1.4.2 先验Jacobian的更新 2. R…

windows install git

refer: https://developers.weixin.qq.com/miniprogram/dev/devtools/wechatvcs.html https://blog.csdn.net/weixin_40228200/article/details/128451324 在使用小程序的时候&#xff0c;需要初始化项目&#xff0c;需要注册Git账号 1.在本地确认cmd没有安装Git,进入Git官网…

docker:安装mysql以及最佳实践

文章目录 1、拉取镜像2、运行容器3、进入容器方式一方式二方式三容器进入后连接mysql和在宿主机连接mysql的区别 持久化数据持久化数据最佳实践 1、拉取镜像 docker pull mysql2、运行容器 docker run -d -p 3307:3306 --name mysql-container -e MYSQL_ROOT_PASSWORD123456 …

Botton进一步了解(点击事件)

点击事件和长按事件 监听器&#xff1a;专门监听控件的动作行为。只有控件发生了指定的动作&#xff0c;监听器才会触发开关区执行对应的代码逻辑。按钮控件有两种常用的监听器&#xff1a; 点击监听器&#xff1a;通过setOnClickListener方法设置。按钮被按住少于500ms时会触…

2023济南大学acm新生赛题解

通过答题情况的难度系数&#xff1a; 签到&#xff1a;ACI 铜牌题&#xff1a;BG 银牌题&#xff1a;EF 金牌题&#xff1a;DHJKO 赛中暂未有人通过&#xff1a;LMNP A - AB Problem 直接根据公式计算就行。 #include<stdio.h> int main(){int a,b;scanf("%…

安卓MediaRecorder(2)录制源码分析

文章目录 前言JAVA new MediaRecorder() 源码分析android_media_MediaRecorder.cpp native_init()MediaRecorder.java postEventFromNativeandroid_media_MediaRecorder.cpp native_setup() MediaRecorder 参数设置MediaRecorder.prepare 分析MediaRecorder.start 分析MediaRec…