C#使用SqlServer作为日志数据库的设计与实现
作者:亮大大大 发布时间:2024-01-17 05:10:12
标签:c#,sqlserver,日志数据库
前言
做一个简单的日志数据库
功能不需要特别繁琐
主要就是记录普通日志和错误日志(INFO,ERROR)
用数据库作为日志有好处也有坏处
相比于文本来说 更加容易操作
后期查看日志可以根据时间筛选
当然要求也多了点 没那么灵活了
首先你的PC上还要安装一个SqlServer
本来是想用log4net配置去实现的
发现配置很繁琐 决定自己设计一个 肯定有不少不足之处
分为以下几个步骤
1.建立日志数据表
都用一个表来存放,那么字段就要多设置一个 用来区分不同的日志类型
具体怎么设置 也很简单 字段很简单
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RH.Iot.DomainModel.RhLogDto
{
/// <summary>
/// SqlServer数据库记录日志传输模型
/// </summary>
[SugarTable("LogRecord")]
public class RhLogRecordDtoSqlServer
{
/// <summary>
/// 索引
/// </summary>
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]//主键并且自增 (string不能设置自增)
public int Id { get; set; }
/// <summary>
/// 日期
/// </summary>
public string DateTime { get; set; }
/// <summary>
/// 日志等级名称
/// </summary>
public string LevelName { get; set; }
/// <summary>
/// 信息
/// </summary>
public string Message { get; set; }
/// <summary>
///异常
/// </summary>
public string Exception { get; set; }
/// <summary>
/// 无参构造器
/// </summary>
public RhLogRecordDtoSqlServer()
{
}
/// <summary>
/// 有参构造器
/// </summary>
public RhLogRecordDtoSqlServer(int Id,string DateTime,string LevelName,string Message,string Exception)
{
this.Id = Id;
this.DateTime = DateTime;
this.LevelName =LevelName;
this.Message = Message;
this.Exception = Exception;
}
}
}
我这里用到了SqlSugar这个Orm框架
不会的话可以去学一下 用数据库少不了与这个框架打交道
如果你已经初步了解了SqlSugar 请再看一下它的仓储概念
然后引入你的程序 如果你不想也可以 你子要可以保证自己的程序可以访问数据库并且进行基本的插入数据操作就好了
上面是数据库表的映射类
那么表的建立和它的Sql语句
CREATE TABLE [dbo].[LogRecord] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[DateTime] NVARCHAR (20) NULL,
[LevelName] NCHAR (10) NULL,
[Message] NVARCHAR (MAX) NULL,
[Exception] NVARCHAR (MAX) NULL,
PRIMARY KEY CLUSTERED ([Id] ASC)
);
2.建立相关的数据访问层
我这里使用了仓储 ,你也可以使用自己的方式
3.帮助操作类
using Microsoft.Extensions.Logging;
using RH.Iot.DomainModel.RhLogDto;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RH.Iot.DbAccess.RhSqlServerDbAccess.RhLogDbAccess
{
/// <summary>
/// LogDbHelper 数据库日志操作
/// 使用SqlServer做数据存储
/// 目前提供异常和普通日志记录
/// 方法待扩充
/// 如果遇到数据库连接不上的问题 日志模式回归到txt模式(规划中...)
/// </summary>
public class RhLogDbHelper
{
/// <summary>
/// 模型
/// </summary>
public RhLogRecordDtoSqlServer rhLogRecordDtoSqlServer;
/// <summary>
/// 私有化数据访问器
/// </summary>
private RhLogRecordDtoDbAccessSqlServer DbAccess;
/// <summary>
/// 构造器注入
/// </summary>
/// <param name="dbAccess">提供相应的数据访问类</param>
public RhLogDbHelper(RhLogRecordDtoDbAccessSqlServer dbAccess)
{
DbAccess = dbAccess;
rhLogRecordDtoSqlServer = new RhLogRecordDtoSqlServer();
}
public void LogInfo(string msg) {
rhLogRecordDtoSqlServer.DateTime = DateTime.Now.ToString();
rhLogRecordDtoSqlServer.LevelName = "INFO";
rhLogRecordDtoSqlServer.Message = msg;
DbAccess.InsertAsync(rhLogRecordDtoSqlServer);
}
public void LogError(string msg,Exception ex)
{
rhLogRecordDtoSqlServer.DateTime = DateTime.Now.ToString();
rhLogRecordDtoSqlServer.LevelName = "ERROR";
rhLogRecordDtoSqlServer.Message = msg;
rhLogRecordDtoSqlServer.Exception = ex.ToString();
DbAccess.InsertAsync(rhLogRecordDtoSqlServer);
}
}
}
这些内容不可直接复制
因为项目引用不一样
但可以参考
4.使用
RhLogDbHelper rldh = new RhLogDbHelper(new RhLogRecordDtoDbAccessSqlServer());
rldh.LogInfo("hhahaha");
try
{
int a = 1;
int b = a / 0;
}
catch (Exception ex)
{
rldh.LogError("除法异常",ex);
}
5.结果
这只是很简单的一个日志数据库
后面还要加上更多功能
来源:https://blog.csdn.net/weixin_38083655/article/details/112171120


猜你喜欢
- 第一种方案、最简单、普通的方法:SELECT TOP 30 * FROM ARTICLE WHERE ID NOT IN(SELECT TO
- 大家好哈,上一节我们研究了一下爬虫的异常处理问题,那么接下来我们一起来看一下Cookie的使用。为什么要使用Cookie呢?Cookie,指
- 一、弱网简介弱网看字面意思就是网络比较弱,我们通称为信号差,网速慢。1、弱网的影响在地铁、隧道、电梯和车库等场景下使用APP ,网络会出现延
- 插入记录时,影响插入速度的主要是索引、唯一性校验、一次插入记录条数等。根据这些情况,可以分别进行优化,本节将介绍优化插入记录速度的几种方法。
- python提供了4种方式来满足进程间的数据通信1. 使用multiprocessing.Queue可以在进程间通信,但不能在Pool池创建
- 关于《回访确认》这件事情,在我blog和5Gme的回复里普遍出现这么几个疑问:1、下了订单却放弃支付的心理因素是什么?2、回访电话可以促进订
- 前言在C语言中,由于变量一定是先声明,后使用,所以我们可以清楚的知道,现在使用的变量是全局还是局部,比如:int a = 5; void t
- 本文实例讲述了php中$_GET与$_POST过滤sql注入的方法,分享给大家供大家参考。具体分析如下:此函数只能过滤一些敏感的sql命令了
- 目录1.按照一列数值进行排序1.1按照五缺失值的一列进行排序1.1.1升序排列1.1.2 降序排列1.2按照有缺失值的一列进行排序1.2.1
- 将无权点文件转化成邻接矩阵目前点文件是两列Excel代码,在进行复杂网络运算时需要转化成邻接矩阵。我在网上找了一个代码,稍微修改了下,亲测可
- 最近自己很关注文档的撰写,包括如何制作PPT。因为发现自己在表达想法和观点的时候,从自己的语言到文字都异常的欠缺。常常需要“高人”帮忙翻译。
- google找到这样一个解决方法: 在上传控件中插入了值,就只能通过form的reset功能来清空了,但是form里面其他的值也被reset
- 本文实例讲述了Django restframework 框架认证、权限、限流用法。分享给大家供大家参考,具体如下:概述Django Rest
- 前言Iframe 是一种将网页嵌入到另一个页面的内容中的方法。这是通过使用 HTML 元素、外部网站的 URL 以及窗口在您的网站上的外观参
- 一、原理概述v-for指令时在模板编译的代码生成阶段实现的,当遍历数组或对象时需要使用列表渲染指令v-for。当Vue.js用v-for正在
- 在参加“数据挖掘”比赛中遇到了关于函数高次拟合的问题,然后就整理了一下源码,以便后期的学习与改进。在本次“数据挖掘”比赛中感觉收获最大的还是
- 现状≠将来?程序员做设计本身就很悲哀,纠结于客户与坚持之间就更是如此。无论我今后的路会怎么走,我想始终不变的事情就是与客户博弈了。无论是放弃
- 如下所示:python3:img_path = ' 'im = cv2.imdecode(np.fromfile
- ?? 罪魁祸首一个常见的场景是在表格行内以el-popover的形式对行内信息进行一些业务操作。在表格分页10条、20条的情况下页面运行良好
- Python注释python中单行注释采用 # 开头。python 中多行注释使用三个单引号(''')或三个双引号(