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

c# 一个自定义日志类

通过内置队列异步定时写日志

 /// <summary>/// 通过内置队列异步定时写日志/// </summary>public static class Logger{public static ConcurrentQueue<Sys_Log> loggerQueueData = new ConcurrentQueue<Sys_Log>();private static DateTime lastClearFileDT = DateTime.Now.AddDays(-1);private static string _loggerPath = AppSetting.DownLoadPath + "Logger\\Queue\\";static Logger(){Task.Run(() => { Start(); });}public static void Info(string message){Info(LoggerType.Info, message);}public static void Info(LoggerType loggerType, string message = null){Info(loggerType, message, null, null);}public static void Info(LoggerType loggerType, string requestParam, string resposeParam, string ex = null){Add(loggerType, requestParam, resposeParam, ex, LoggerStatus.Info);}public static void OK(string message){OK(LoggerType.Success, message);}public static void OK(LoggerType loggerType, string message = null){OK(loggerType, message, null, null);}public static void OK(LoggerType loggerType, string requestParam, string resposeParam, string ex = null){Add(loggerType, requestParam, resposeParam, ex, LoggerStatus.Success);}public static void Error(string message){Error(LoggerType.Error, message);}public static void Error(LoggerType loggerType, string message){Error(loggerType, message, null, null);}public static void Error(LoggerType loggerType, string requestParam, string resposeParam, string ex = null){Add(loggerType, requestParam, resposeParam, ex, LoggerStatus.Error);}/// <summary>/// /// </summary>/// <param name="requestParameter">请求参数</param>/// <param name="responseParameter">响应参数</param>/// <param name="success">响应结果1、成功,2、异常,0、其他</param>/// <param name="userInfo">用户数据</param>private static void Add(LoggerType loggerType, string requestParameter, string responseParameter, string ex, LoggerStatus status){Sys_Log log = null;try{HttpContext context = Utilities.HttpContext.Current;if (context.Request.Method == "OPTIONS") return;ActionObserver cctionObserver = (context.RequestServices.GetService(typeof(ActionObserver)) as ActionObserver);if (context == null){WriteText($"未获取到httpcontext信息,type:{loggerType.ToString()},reqParam:{requestParameter},respParam:{responseParameter},ex:{ex},success:{status.ToString()}");return;}UserInfo userInfo = UserContext.Current.UserInfo;log = new Sys_Log(){BeginDate = cctionObserver.RequestDate,EndDate = DateTime.Now,User_Id = userInfo.User_Id,UserName = userInfo.UserTrueName,Role_Id = userInfo.Role_Id,LogType = loggerType.ToString(),ExceptionInfo = ex,RequestParameter = requestParameter,ResponseParameter = responseParameter,Success = (int)status};SetServicesInfo(log, context);}catch (Exception exception){log = log ?? new Sys_Log(){BeginDate = DateTime.Now,EndDate = DateTime.Now,LogType = loggerType.ToString(),RequestParameter = requestParameter,ResponseParameter = responseParameter,Success = (int)status,ExceptionInfo = ex + exception.Message};}loggerQueueData.Enqueue(log);}private static void Start(){DataTable queueTable = CreateEmptyTable();while (true){try{if (loggerQueueData.Count() > 0 && queueTable.Rows.Count < 500){DequeueToTable(queueTable); continue;}//每5秒写一次数据Thread.Sleep(1000);if (queueTable.Rows.Count == 0) { continue; }DBServerProvider.SqlDapper.BulkInsert(queueTable, "Sys_Log", SqlBulkCopyOptions.KeepIdentity, null, _loggerPath);queueTable.Clear();if ((DateTime.Now - lastClearFileDT).TotalDays > 1){Utilities.FileHelper.DeleteFolder(_loggerPath);lastClearFileDT = DateTime.Now;}}catch (Exception ex){Console.WriteLine($"日志批量写入数据时出错:{ex.Message}");WriteText(ex.Message + ex.StackTrace + ex.Source);queueTable.Clear();}}}private static void WriteText(string message){try{Utilities.FileHelper.WriteFile(_loggerPath + "WriteError\\", $"{DateTime.Now.ToString("yyyyMMdd")}.txt", message + "\r\n");}catch (Exception ex){Console.WriteLine($"日志写入文件时出错:{ex.Message}");}}private static void DequeueToTable(DataTable queueTable){loggerQueueData.TryDequeue(out Sys_Log log);DataRow row = queueTable.NewRow();if (log.BeginDate == null || log.BeginDate?.Year < 2010){log.BeginDate = DateTime.Now;}if (log.EndDate == null){log.EndDate = DateTime.Now;}//  row["Id"] = log.Id;row["LogType"] = log.LogType;row["RequestParameter"] = log.RequestParameter?.Replace("\r\n", "");row["ResponseParameter"] = log.ResponseParameter?.Replace("\r\n", "");row["ExceptionInfo"] = log.ExceptionInfo;row["Success"] = log.Success ?? -1;row["BeginDate"] = log.BeginDate;row["EndDate"] = log.EndDate;row["ElapsedTime"] = ((DateTime)log.EndDate - (DateTime)log.BeginDate).TotalMilliseconds;row["UserIP"] = log.UserIP;row["ServiceIP"] = log.ServiceIP;row["BrowserType"] = log.BrowserType;row["Url"] = log.Url;row["User_Id"] = log.User_Id ?? -1;row["UserName"] = log.UserName;row["Role_Id"] = log.Role_Id ?? -1;queueTable.Rows.Add(row);}private static DataTable CreateEmptyTable(){DataTable queueTable = new DataTable();queueTable.Columns.Add("LogType", typeof(string));queueTable.Columns.Add("RequestParameter", typeof(string));queueTable.Columns.Add("ResponseParameter", typeof(string));queueTable.Columns.Add("ExceptionInfo", typeof(string));queueTable.Columns.Add("Success", Type.GetType("System.Int32"));queueTable.Columns.Add("BeginDate", Type.GetType("System.DateTime"));queueTable.Columns.Add("EndDate", Type.GetType("System.DateTime"));queueTable.Columns.Add("ElapsedTime", Type.GetType("System.Int32"));queueTable.Columns.Add("UserIP", typeof(string));queueTable.Columns.Add("ServiceIP", typeof(string));queueTable.Columns.Add("BrowserType", typeof(string));queueTable.Columns.Add("Url", typeof(string));queueTable.Columns.Add("User_Id", Type.GetType("System.Int32"));queueTable.Columns.Add("UserName", typeof(string));queueTable.Columns.Add("Role_Id", Type.GetType("System.Int32"));return queueTable;}public static void SetServicesInfo(Sys_Log log, HttpContext context){string result = String.Empty;log.Url = context.Request.Scheme + "://" + context.Request.Host + context.Request.PathBase +context.Request.Path;log.UserIP = context.GetUserIp()?.Replace("::ffff:", "");log.ServiceIP = context.Connection.LocalIpAddress.MapToIPv4().ToString() + ":" + context.Connection.LocalPort;log.BrowserType = context.Request.Headers["User-Agent"];if (log.BrowserType.Length>190){log.BrowserType = log.BrowserType.Substring(0, 190);}if (string.IsNullOrEmpty(log.RequestParameter)){try{log.RequestParameter = context.GetRequestParameters();if (log.RequestParameter != null){log.RequestParameter = HttpUtility.UrlDecode(log.RequestParameter, Encoding.UTF8);}}catch (Exception ex){log.ExceptionInfo += $"日志读取参数出错:{ex.Message}";Console.WriteLine($"日志读取参数出错:{ex.Message}");}}}}public enum LoggerStatus{Success = 1,Error = 2,Info = 3}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【JAVA 常用API】数据库字段存储JSON格式数据,JAVA中如何将List<Entity>或者对象实体转换为字符串
  • Linux shell编程学习笔记65: nice命令 显示和调整进程优先级
  • linux文本查看命令
  • 概率论原理精解【1】
  • 基于YOLO8的目标检测系统:开启智能视觉识别之旅
  • 【Linux】Linux的基本使用
  • 开源防病毒工具--ClamAV
  • linux 报错:bash: /etc/profile: 行 32: 语法错误:未预期的文件结束符
  • css性能优化的方法
  • 如何判断国民经济的好坏
  • 北京交通大学《深度学习》专业课,实验3卷积、空洞卷积、残差神经网络实验
  • 基于trace_id实现SpringCloudGateway网关的链路追踪
  • 比较 WordPress 、 Baklib 和 BetterDocs
  • Qt开发网络嗅探器02
  • webSocket模块组件
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • ComponentOne 2017 V2版本正式发布
  • Docker入门(二) - Dockerfile
  • HTML5新特性总结
  • LeetCode29.两数相除 JavaScript
  • Shadow DOM 内部构造及如何构建独立组件
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • 初识 beanstalkd
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 码农张的Bug人生 - 初来乍到
  • 前端学习笔记之观察者模式
  • 如何使用 JavaScript 解析 URL
  • 使用putty远程连接linux
  • elasticsearch-head插件安装
  • 回归生活:清理微信公众号
  • 树莓派用上kodexplorer也能玩成私有网盘
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • (11)MSP430F5529 定时器B
  • (160)时序收敛--->(10)时序收敛十
  • (6)添加vue-cookie
  • (floyd+补集) poj 3275
  • (二)hibernate配置管理
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转载)从 Java 代码到 Java 堆
  • (转载)深入super,看Python如何解决钻石继承难题
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET_WebForm_layui控件使用及与webform联合使用
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接
  • [ MSF使用实例 ] 利用永恒之蓝(MS17-010)漏洞导致windows靶机蓝屏并获取靶机权限
  • [ 常用工具篇 ] AntSword 蚁剑安装及使用详解
  • [ 物联网 ]拟合模型解决传感器数据获取中数据与实际值的误差的补偿方法
  • []AT 指令 收发短信和GPRS上网 SIM508/548
  • [android]-如何在向服务器发送request时附加已保存的cookie数据
  • [BeginCTF]真龙之力
  • [C++]模板与STL简介
  • [DAU-FI Net开源 | Dual Attention UNet+特征融合+Sobel和Canny等算子解决语义分割痛点]