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

简单实现log记录保存到文本和数据库

简单保存记录到txt,sqlite数据库,以及console监控记录

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Data.SQLite;
using System.IO;namespace NlogFrame
{public enum  LogType{Trace,Consl,Debug,Info,Warn,Error,Fatal}public class Log{/// <summary>/// 最大缓存数/// </summary>[Browsable(true)]public static int MaxTempListCnt { get; set; } = 300;[Browsable(true)]public static LogType MinLevel { get; set; } = 0;[Browsable(true)]public static bool DebugEnable { get; set; } = true;[Browsable(true)]public static bool TraceEnable { get; set; } = true;[Browsable(true)]public static bool WarnEnable { get; set; } = true;static bool _ConsoleEnable = false;static TextWriter originalOut = null;[Browsable(true)]public static bool ConsoleEnable{get { return _ConsoleEnable; }set{_ConsoleEnable = value;if (value == true){if (originalOut == null){originalOut = Console.Out;}Console.SetOut(logConsole);}else{if (originalOut != null){Console.SetOut(originalOut);originalOut = null;}}}}[Browsable(true)]public string Name { get; set; } = "";static LogConsole logConsole = new LogConsole();public static List<LogInfo> TempLogInfoList => _TempLogInfoList;static List<LogInfo> _TempLogInfoList;public Log(string name){Name = name;}public void Error(string msg){if ((int)LogType.Error >= (int)MinLevel){//logger.Error(msg);AddLog(new LogInfo(DateTime.Now, LogType.Error, msg));}}public void Consl(string msg){if ((int)LogType.Consl >= (int)MinLevel){//logger.Error(msg);AddLog(new LogInfo(DateTime.Now, LogType.Consl, msg));}}public void Trace(string msg){if ((int)LogType.Trace >= MinLevel){// logger.Trace(msg);AddLog(new LogInfo(DateTime.Now, LogType.Trace, msg));}}public void Warn (string msg){if ((int)LogType.Warn >= (int)MinLevel){// logger.Warn(msg);AddLog(new LogInfo(DateTime.Now, LogType.Warn, msg));}}public void Info(string msg){if ((int)LogType.Info >= (int)MinLevel){//logger.Info(msg);AddLog(new LogInfo(DateTime.Now, LogType.Info, msg));}}public void Debug(string msg){if ((int)LogType.Debug >= (int)MinLevel){// logger.Debug(msg);AddLog(new LogInfo(DateTime.Now, LogType.Debug, msg));}}public void Fatal(string msg){if ((int)LogType.Fatal >= (int)MinLevel){//logger.Fatal(msg);AddLog(new LogInfo(DateTime.Now, LogType.Fatal, msg));}}public void WriteLogTxt(LogInfo info){// 定义日志文件的路径  string logFilePath = Environment.CurrentDirectory + "\\logs\\log-" + DateTime.Now.Date.ToString("yyyy-mm-dd") + ".txt";if (!Directory.Exists(Environment.CurrentDirectory + "\\logs\\"))Directory.CreateDirectory(Environment.CurrentDirectory + "\\logs\\");// 使用StreamWriter写入日志  // 如果文件不存在,它将被创建;如果文件已存在,则默认是追加模式  using (StreamWriter writer = new StreamWriter(logFilePath, true)) // 第二个参数为true表示追加模式  {// 写入日志信息  writer.WriteLine(info.ToString());// 你可以继续写入更多的日志信息  }}public void WriteLogSqlite(LogInfo info){// 定义日志文件的路径  string logFilePath = Environment.CurrentDirectory + "\\logs\\db-" + DateTime.Now.Date.ToString("yyyy-mm-dd") + ".db";if (!Directory.Exists(Environment.CurrentDirectory + "\\logs\\"))Directory.CreateDirectory(Environment.CurrentDirectory + "\\logs\\");// 创建数据库(如果尚不存在)  using (var connection = new SQLiteConnection($"Data Source={logFilePath}")){connection.Open();// 创建一个表(如果尚不存在)  string createTableSql = @"  CREATE TABLE IF NOT EXISTS Log (  Id INTEGER PRIMARY KEY AUTOINCREMENT,  Time TEXT NOT NULL,  Name TEXT , Type INTEGER , Message TEXT)";using (var command = new SQLiteCommand(createTableSql, connection)){command.ExecuteNonQuery();}// 插入数据  string insertSql = "INSERT INTO Log (Time,Name ,Type , Message) VALUES (@Time,@Name,@Type, @Message)";using (var command = new SQLiteCommand(insertSql, connection)){command.Parameters.AddWithValue("@Time", info.Time.ToString("yyyy-MM-dd HH:mm:ss.fff"));command.Parameters.AddWithValue("@Name", info.Name);command.Parameters.AddWithValue("@Type", info.Type);command.Parameters.AddWithValue("@Message",info.Message);command.ExecuteNonQuery();}}}public void DeleteFile(){// 指定你想要遍历的文件夹路径  string folderPath = @"C:\你的文件夹路径";// 获取文件夹中的所有文件  string[] files = Directory.GetFiles(folderPath);// 遍历文件  foreach (string file in files){// 获取文件的创建时间  FileInfo fileInfo = new FileInfo(file);DateTime creationTime = fileInfo.CreationTime;// 计算自文件创建以来的天数  TimeSpan span = DateTime.Now - creationTime;double days = span.TotalDays;// 如果文件创建时间超过20天  if (days > 20){try{// 删除文件  File.Delete(file);//Console.WriteLine($"已删除文件: {file}");}catch (Exception ex){// 处理删除文件时可能出现的异常,例如文件正在使用中  Console.WriteLine($"无法删除文件: {file}. 错误: {ex.Message}");}}}Console.WriteLine("处理完成。");Console.ReadKey(); // 暂停,以便查看输出  }private void AddLog(LogInfo info){info.Name = Name;WriteLogTxt(info);WriteLogSqlite(info);if (_TempLogInfoList == null){_TempLogInfoList = new List<LogInfo>();}while (_TempLogInfoList.Count > MaxTempListCnt){_TempLogInfoList.RemoveAt(0);}_TempLogInfoList.Add(info);}}public class LogInfo{[Description("时间")]public DateTime Time { get; set; }[Description("类型")]public LogType Type { get; set; }[Description("对象")]public string Name { get; set; }[Description("信息")]public string Message { get; set; }public LogInfo(DateTime dateTime, LogType type, string msg){Time = dateTime;Type = type;Message = msg;}public override string ToString() => Time.ToString("yyyy-MM-dd HH:mm:ss.fff") + " | " + Type + " | " + Name + " | " + Message;}public class LogConsole : TextWriter{private StringBuilder _sb = new StringBuilder();public override Encoding Encoding => throw new NotImplementedException();public override void WriteLine(string value){Log console = new Log("控制台");//_sb.AppendLine(value);// 这里可以添加额外的逻辑,比如记录到文件或数据库  console.Consl(value);Console.WriteLine($"Intercepted: {value}");//Console.WriteLine($"Intercepted: {value}"); // 仅为了演示  }// 你可以根据需要实现其他重写的方法  // 一个方法用于获取或清空收集的输出  public string GetAndClearOutput(){string output = _sb.ToString();_sb.Clear();return output;}}
}

相关文章:

简单实现log记录保存到文本和数据库

简单保存记录到txt&#xff0c;sqlite数据库&#xff0c;以及console监控记录 using System; using System.Collections.Generic; using System.ComponentModel; using System.Text; using System.Data.SQLite; using System.IO;namespace NlogFrame {public enum LogType{Tr…...

敏感字段加密 - 华为OD统一考试(E卷)

2024华为OD机试(E卷+D卷+C卷)最新题库【超值优惠】Java/Python/C++合集 题目描述 【敏感字段加密】给定一个由多个命令字组成的命令字符串: 1、字符串长度小于等于127字节,只包含大小写字母,数字,下划线和偶数个双引号; 2、命令字之间以一个或多个下划线 进行分割; 3、可…...

go 安装三方库

go版本 go versiongo version go1.23.1 darwin/arm64安装 redis 库 cd $GOPATH说明&#xff1a; 这里可以改 GOPATH的值 将如下 export 语句写入 ~/.bash_profile 文件中 export GOPATH/Users/goproject然后使其生效 source ~/.bash_profile初始化生成 go.mod 文件 go mod…...

Java 中的 volatile和synchronized和 ReentrantLock区别讲解和案例示范

在 Java 的并发编程中&#xff0c;volatile、synchronized 和 ReentrantLock 是三种常用的同步机制。每种机制都有其独特的特性、优缺点和适用场景。理解它们之间的区别以及在何种情况下使用哪种机制&#xff0c;对提高程序的性能和可靠性至关重要。本文将详细探讨这三种机制的…...

从GDAL中 读取遥感影像的信息

从GDAL提供的实用程序来看&#xff0c;很多程序的后缀都是 .py &#xff0c;这充分地说明了Python语言在GDAL的开发中得到了广泛的应用。 1. 打开已有的GeoTIF文件 下面我们试着读取一个GeoTiff文件的信息。第一步就是打开一个数据集。 >>> from osgeo import gdal…...

算法闭关修炼百题计划(一)

多看优秀的代码一定没有错&#xff0c;此篇博客属于个人学习记录 1.两数之和2.前k个高频元素3.只出现一次的数字4.数组的度5.最佳观光组合6.整数反转7.缺失的第一个正数8.字符串中最多数目的子序列9.k个一组翻转链表10.反转链表II11. 公司命名12.合并区间13.快速排序14.数字中的…...

vue3实现打字机的效果,可以换行

之前看了很多文章,效果是实现了,就是没有自动换行的效果,参考了文章写了一个,先上个效果图,卡顿是因为模仿了卡顿的效果,还是很丝滑的 目录 效果图:代码如下 效果图: ![请添加图片描述](https://i-blog.csdnimg.cn/direct/d8ef33d83dd3441a87d6d033d9e7cafa.gif 代码如下 原…...

【如何学习操作系统】——学会学习的艺术

&#x1f41f;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢编程&#x1fab4; &#x1f421;&#x1f419;个人主页&#x1f947;&#xff1a;Aic山鱼 &#x1f420;WeChat&#xff1a;z7010cyy &#x1f988;系列专栏&#xff1a;&#x1f3de;️ 前端-JS基础专栏✨前…...

stm32 flash无法擦除

通过bushound调试代码发现&#xff0c;当上位机发送命令到模组后flash将不能擦除&#xff0c;通过 HAL_FLASH_GetError&#xff08;&#xff09;函数查找原因是FLASH Programming Sequence error&#xff08;编程顺序错误&#xff09;&#xff0c;解决办法是在解锁后清零标志位…...

Android—ANR日志分析

获取ANR日志&#xff1a; ANR路径&#xff1a;/data/anrADB指令&#xff1a;adb bugreport D:\bugrep.zip ANR日志分析步骤&#xff1a; “main” prio&#xff1a;主线程状态beginning of crash&#xff1a;搜索 crash 相关信息CPU usage from&#xff1a;搜索 cpu 使用信息…...

9.29 LeetCode 3304、3300、3301

思路&#xff1a; ⭐进行无限次操作&#xff0c;但是 k 的取值小于 500 &#xff0c;所以当 word 的长度大于 500 时就可以停止操作进行取值了 如果字符为 ‘z’ &#xff0c;单独处理使其变为 ‘a’ 得到得到操作后的新字符串&#xff0c;和原字符串拼接 class Solution { …...

近万字深入讲解iOS常见锁及线程安全

什么是锁&#xff1f; 在程序中&#xff0c;当多个任务&#xff08;或线程&#xff09;同时访问同一个资源时&#xff0c;比如多个操作同时修改一份数据&#xff0c;可能会导致数据不一致。这时候&#xff0c;我们需要“锁”来确保同一时间只有一个任务能够操作这个数据&#…...

linux创建固定大小的文件夹用于测试

在linux上创建固定大小的文件夹用于测试磁盘空间不足时的应用故障。 实验环境为centos7&#xff0c;有两种简易方法&#xff1a; 一、使用ramdisk 1、创建文件夹 mkdir /var/mytest 2、创建一个1m大小的临时文件 mount none /var/mytest -t tmpfs -o size1m size也可以写…...

大模型学习路线:这会是你见过最全最新的大模型学习路线【2024最新】

大模型学习路线 建议先从主流的Llama开始&#xff0c;然后选用中文的Qwen/Baichuan/ChatGLM&#xff0c;先快速上手体验prompt工程&#xff0c;然后再学习其架构&#xff0c;跑微调脚本 如果要深入学习&#xff0c;建议再按以下步骤&#xff0c;从更基础的GPT和BERT学起&…...

了解云计算工作负载保护的重要性,确保数据和应用程序安全

云计算de小白 云计算技术的快速发展使数据和应用程序安全成为一种关键需求&#xff0c;而不仅仅是一种偏好。随着越来越多的客户公司将业务迁移到云端&#xff0c;保护他们的云工作负载&#xff08;指所有部署的应用程序和服务&#xff09;变得越来越重要。云工作负载保护&…...

Swagger3基本使用

Swagger 课程目标 Swagger简介【了解】 Springboot整合swagger【掌握】 Swagger 常用注解【掌握】 knife4j-Swagger【会用】 一、Swagger3简介 Swagger 是一系列 RESTful API 的工具&#xff0c;通过 Swagger 可以获得项目的⼀种交互式文档&#xff0c;客户端 SDK 的自 动…...

如何借助Java批量操作Excel文件?

最新技术资源&#xff08;建议收藏&#xff09; https://www.grapecity.com.cn/resources/ 前言 | 问题背景 在操作Excel的场景中&#xff0c;通常会有一些针对Excel的批量操作&#xff0c;批量的意思一般有两种&#xff1a; 对批量的Excel文件进行操作。如导入多个Excel文件…...

JUC并发编程_Lock锁

JUC并发编程_Lock锁 1、Lock锁介绍2、主要方法3、与 synchronized 的区别4、Condition 使用示例 1、Lock锁介绍 Java中的 Lock 锁是 java.util.concurrent.locks 包下的一个接口&#xff0c;它提供了比 synchronized 关键字更灵活的锁定机制。 2、主要方法 lock()&#xff1a…...

Unity中的功能解释(数学位置相关和事件)

向量计算 Vector3.Slerp&#xff08;起点坐标&#xff0c;终点坐标&#xff0c;t&#xff09;&#xff0c;可是从起点坐标以一个圆形轨迹到终点坐标&#xff0c;有那么多条轨迹&#xff0c;那怎么办 Vector3.Slerp 进行的是沿球面插值&#xff0c;因此并不是沿着严格的“圆形…...

ElementPlus---Timeline 时间线组件使用示例

介绍 使用ElementPlus时间线组件在后台首页实现通知公告列表展示&#xff0c;使用Vue3开发。 实现代码 Vue3代码 <el-timeline><el-timeline-itemstyle"max-width: 600px"v-for"(activity, index) in activities":key"index":times…...

从零开始:使用TCP调试助手V1.9进行网络通信调试的完整流程

从零开始&#xff1a;使用TCP调试助手V1.9进行网络通信调试的完整流程 在软件开发与网络调试领域&#xff0c;TCP/UDP通信测试是每个开发者迟早要面对的必修课。无论是物联网设备的数据传输验证&#xff0c;还是分布式系统的组件间通信检查&#xff0c;一个可靠的调试工具能让我…...

AI建站避坑指南:10个高频问题与风险防范全解析

用AI建站虽然快&#xff0c;但过程中隐藏的风险如果没到&#xff0c;轻则内容效果差&#xff0c;重则可能有版权或合规隐患。这份避坑指南&#xff0c;围绕大家最关心的10个核心问题&#xff0c;给出客观的分析和可操作的防范建议&#xff0c;帮你安心用好AI建站工具。\### 核心…...

乳腺癌治疗新思路:除了ER/PR/HER2,你的单细胞数据里还藏着哪些靶点?(附PLK1抑制剂案例)

乳腺癌精准治疗新靶点&#xff1a;单细胞数据驱动的PLK1抑制剂开发路径 当临床医生面对三阴性乳腺癌患者时&#xff0c;传统分子分型往往无法提供足够的治疗指引。最新单细胞测序技术揭示&#xff0c;在ER/PR/HER2这些经典标志物之外&#xff0c;肿瘤微环境中还隐藏着更具临床价…...

用Python手把手实现乘幂法:从理论到代码,5分钟搞定矩阵最大特征值计算

用Python手把手实现乘幂法&#xff1a;从理论到代码&#xff0c;5分钟搞定矩阵最大特征值计算 矩阵特征值计算是线性代数的核心问题之一&#xff0c;在机器学习、物理模拟和工程分析中无处不在。但当你面对一个实际项目时&#xff0c;真正需要的往往不是繁琐的数学推导&#xf…...

计算机毕业设计springboot基于的养老平台的设计与实现 SpringBoot架构下智慧养老综合服务系统的设计与实现 基于Java的社区养老数字化管理平台开发

计算机毕业设计springboot基于的养老平台的设计与实现&#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。我国正加速步入老龄化社会&#xff0c;老年人口规模持续扩大&#xff0c;传…...

asp毕业设计下载(全套源码+配套论文)——基于asp+access的会员管理系统设计与实现

基于aspaccess的会员管理系统设计与实现&#xff08;毕业论文程序源码&#xff09; 大家好&#xff0c;今天给大家介绍基于aspaccess的会员管理系统设计与实现&#xff0c;更多精选毕业设计项目实例见文末哦。 文章目录&#xff1a; 基于aspaccess的会员管理系统设计与实现&a…...

ESP32电池电量检测实战:MicroPython ADC配置避坑指南(附完整代码)

ESP32电池电量检测实战&#xff1a;MicroPython ADC配置避坑指南&#xff08;附完整代码&#xff09; 当你在凌晨三点调试一个即将交付的物联网设备时&#xff0c;突然发现电量显示在30%到70%之间随机跳动——这种场景对嵌入式开发者来说再熟悉不过了。本文将带你深入ESP32的AD…...

OpenClaw本地知识库:nanobot处理私有化文档问答

OpenClaw本地知识库&#xff1a;nanobot处理私有化文档问答 1. 为什么需要本地知识库助手 去年我接手了一个技术文档整理项目&#xff0c;团队积累了超过2000份内部技术文档、会议纪要和产品说明。每次新人入职或者遇到特定技术问题时&#xff0c;我们都要在这些文档里大海捞…...

嵌入式NMEA-0183零内存分配解析器设计与实现

1. NMEA-0183 协议解析库深度技术解析&#xff1a;面向嵌入式系统的轻量级、零内存分配实现 NMEA-0183&#xff08;National Marine Electronics Association 0183&#xff09;是全球航海电子设备事实上的标准通信协议&#xff0c;自1983年发布以来&#xff0c;已广泛应用于GPS…...

逻辑回归毕设效率优化实战:从特征工程到推理加速的全流程提速方案

最近在帮学弟学妹们看逻辑回归相关的毕业设计&#xff0c;发现一个普遍问题&#xff1a;大家把重点都放在了模型原理上&#xff0c;但代码一跑起来&#xff0c;训练慢、预测卡&#xff0c;整个流程效率低下&#xff0c;非常影响实验进度和最终演示效果。其实&#xff0c;逻辑回…...