支持异步写入的日志类,支持Framework2.0

因为工作需要需要在XP上运行一个C#编写的Winform插件,我就用Framework2.0,因为存在接口交互所以想保留交易过程的入参出参。

考虑到插件本身实施的因素,就没有使用Log4、NLog等成熟的日志插件。在网上搜索了一个是通过TextWriterTraceListener实现的,但是实际使用

过程中发现并没实现我想要的功能,于是乎自己重新造了个轮子,如果大家有需要可以参考下。

  1   /// <summary>
  2     /// 日志类型
  3     /// </summary>
  4     public enum LogType
  5     {
  6         Error,
  7         Trace,
  8         Info
  9     }
 10
 11     /// <summary>
 12     /// 日志类
 13     /// 支持同步和异步
 14     /// </summary>
 15     public sealed class Logger
 16     {
 17
 18         #region 变量|常量
 19
 20         /// <summary>
 21         /// 用于Trace的组织输出的类别名称
 22         /// </summary>
 23         private const string error = "\r\n***********************EXCEPTION {0}***********************";
 24
 25         /// <summary>
 26         /// 跟踪
 27         /// </summary>
 28         private const string trace = "\r\n*************************TRACE {0}*******************************";
 29
 30         /// <summary>
 31         /// 信息
 32         /// </summary>
 33         private const string info = "\r\n****************************INFO {0}********************************";
 34
 35         /// <summary>
 36         /// 1   仅控制台输出
 37         /// 2   仅日志输出
 38         /// 3   控制台+日志输出
 39         /// </summary>
 40         private static readonly int flag = 2;         //可以修改成从配置文件读取
 41
 42         #endregion
 43
 44         #region 委托
 45
 46         private delegate void AsyncLogException(Exception ex);
 47         private delegate void AyyncLog(string msg, LogType type);
 48         private delegate void AsyncLogSqlCommand(SqlCommand cmd);
 49         private delegate void AsyncLogSql(string sql, params SqlParameter[] parameter);
 50
 51         private static void BeginError(Exception ex)
 52         {
 53             if (null != ex)
 54             {
 55                 string path = GetLogPath(LogType.Error);
 56                 //输出日志头
 57                 WriteLog(path, string.Format(error, DateTime.Now));
 58                 while (null != ex)
 59                 {
 60                     WriteLog(path, string.Format("{0} {1}\r\n{2}\r\nSource:{3}", ex.GetType().Name, ex.Message, ex.StackTrace, ex.Source));
 61                     ex = ex.InnerException;
 62                 }
 63             }
 64         }
 65
 66         private static void BeginTrace(string msg, LogType type)
 67         {
 68             if (string.IsNullOrEmpty(msg)) return;
 69             string path = GetLogPath(type);
 70             //输出日志头
 71             WriteLog(path, string.Format(trace, DateTime.Now));
 72             //输出日志内容
 73             WriteLog(path, msg);
 74         }
 75         #endregion
 76
 77         #region IO操作
 78         /// <summary>
 79         /// 获取日志类型对应的日志存储环境
 80         /// </summary>
 81         /// <param name="type">日志类型</param>
 82         /// <returns></returns>
 83         private static string GetLogPath(LogType type)
 84         {
 85             DateTime time = DateTime.Now;
 86             string subdir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "logs");
 87             subdir = Path.Combine(subdir, type.ToString());
 88             subdir = Path.Combine(subdir, time.ToString("yyyyMM"));
 89             if (!Directory.Exists(subdir))
 90             {
 91                 Directory.CreateDirectory(subdir);
 92             }
 93             string result = Path.Combine(subdir, time.ToString("yyyyMMdd") + ".log");
 94             return result;
 95         }
 96
 97         /// <summary>
 98         /// 写入日志
 99         /// </summary>
100         /// <param name="path">日志环境</param>
101         /// <param name="text">写入的文本值</param>
102         private static void WriteLog(string path, string text)
103         {
104             string filePath = Path.GetDirectoryName(path);
105             if (Directory.Exists(filePath) == false)
106             {
107                 Directory.CreateDirectory(filePath);
108             }
109             if (File.Exists(path))
110             {
111                 using (StreamWriter sw = File.AppendText(path))
112                 {
113                     sw.WriteLine(text + "\n");
114                     sw.Flush();
115                     sw.Close();
116                 }
117             }
118             else
119             {
120                 StreamWriter sr = File.CreateText(path);
121                 sr.WriteLine(text + "\n");
122                 sr.Flush();
123                 sr.Close();
124             }
125         }
126         #endregion
127
128         #region 发布的方法
129         /// <summary>
130         /// 写入异常日志
131         /// </summary>
132         /// <param name="ex">异常对象</param>
133         /// <param name="isAsync">是否异步,默认异步</param>
134         public static void Error(Exception ex, bool isAsync = true)
135         {
136             if (isAsync)
137                 new AsyncLogException(BeginError).BeginInvoke(ex, null, null);
138             else
139                 BeginError(ex);
140         }
141
142         /// <summary>
143         /// 写入错误日志
144         /// </summary>
145         /// <param name="msg">错误信息</param>
146         /// <param name="isAsync">是否异步,默认异步</param>
147         public static void Error(string msg, bool isAsync = false)
148         {
149             if (isAsync)
150                 new AyyncLog(BeginTrace).BeginInvoke(msg, LogType.Error, null, null);
151             else
152                 BeginTrace(msg, LogType.Error);
153         }
154
155         /// <summary>
156         /// 异步跟踪日志
157         /// </summary>
158         /// <param name="msg"></param>
159         public static void Trace(string msg, bool isAsync = true)
160         {
161             if (isAsync)
162                 new AyyncLog(BeginTrace).BeginInvoke(msg, LogType.Trace, null, null);
163             else
164                 BeginTrace(msg, LogType.Trace);
165         }
166
167
168         /// <summary>
169         /// 写入日志信息,日志类型为info
170         /// </summary>
171         /// <param name="msg">日志信息</param>
172         /// <param name="isAsync">是否异步,默认异步</param>
173         public static void Info(string msg, bool isAsync = true)
174         {
175             if (isAsync)
176                 new AyyncLog(BeginTrace).BeginInvoke(msg, LogType.Info, null, null);
177             else
178                 BeginTrace(msg, LogType.Info);
179         }
180         #endregion
181
182     }
183 }

调用代码:

private void button1_Click_1(object sender, EventArgs e)
{
     Logger.Info("测试");
}

运行效果如下:

时间: 2024-08-29 07:51:04

支持异步写入的日志类,支持Framework2.0的相关文章

django 异步 查看 服务器日志 | 利用 channels==2.0.2

django 异步 查看 服务器日志 实例 可以查看我编写的这个项目:https://github.com/hequan2017/chain 模块 需要安装以下模块 安装后会有一个版本号报错,不影响 channels==2.0.2 channels-redis==2.1.0 amqp==1.4.9 anyjson==0.3.3 asgi-redis==1.4.3 asgiref==2.3.0 async-timeout==2.0.0 attrs==17.4.0 cd /tmp/ wget htt

线程托管日志类

using System;using System.Collections.Generic;using System.IO;using System.Text;using System.Threading; namespace BLL{ /// <summary> /// 日志类 /// </summary> /// <remarks>此日志类提供高性能的日志记录实现. /// 当调用Write方法时不会造成线程阻塞,而是立即完成方法调用,因此调用线程不用等待日志写入文

python日志,支持彩色打印和文件大小切片写入和写入mongodb

支持不同logger name的日志写入不同的文件,不同logger name日志写入不同的mongodb 的collection.LogManager比较容易调用,因为里面的内部方法全都使用了下划线,使用了下划线的就是保护和私有方法不需要外界调用,也不需要看懂他,在调用时候pycharm不会自动补全提示这些带下划线的无关方法了,只暴露了get_and_add_handlers和get_without_handlers两个可能需要调用的方法,pyrcharm可以自动补全这两个方法. 主要思路和模

Android开发调试日志工具类[支持保存到SD卡]

直接上代码: package com.example.callstatus; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.net.UnknownHostException; import java.text.SimpleDateFormat; impor

C#写文本日志帮助类(支持多线程)

using System;using System.Configuration;using System.IO;using System.Threading; namespace FQDService.Utils{ /// <summary> /// 写日志类 /// </summary> public class FileLogger { #region 字段 public static readonly object _lock = new object(); #endregi

PHP 文件操作类(创建文件并写入) 生成日志

<?php /** * 文件操作(生成日志)支持多条插入 * (如果插入多条语句并换行 用','逗号分开) * */ class log { public $path = './info.txt'; //默认值文件 public $mode = 'a'; //默认追加写 public $content = '默认值:空'; //默认内容是 空 public function addlog($path = null, $mode = null, $content = null) { //判断写入的

android 写行为日志到SD卡 并发处理 异步写入数据到文件不影响界面响应时间

公司在做一个项目 要求记录用户行为,写行为日志文件到SD卡.实现思想 不影响界面用户体验,要时时记录日志 不能漏掉. 1.并发处理日志 写一个类负责管理各个线程传过来的日志数据,日志数据放在队列中等待写线程去处理.这里每次添加一条日志数据都会检查写日志线程是否在工作,同时为了并发处理传过来的数据采用synchronized 同步: ConcurrentLinkedQueue 是基于链接节点的.线程安全的队列.并发访问不需要同步.因为它在队列的尾部添加元素并从头部删除它们,所以只要不需要知道队列的

ASP.NET MVC 5 局部视图不支持异步问题

[ChildActionOnly] public async Task<ActionResult> TopLeftFlowPartialView() { var user = Session[Constants.SESSION] as UserSessionViewModel; var hotelInventory = await _homeService.GetHotelInventoryAsync(user.HotelCd); return PartialView("_TopLe

扩展于RCLabel的支持异步加载网络图片的富文本引擎的设计

扩展于RCLabel的支持异步加载网络图片的富文本引擎的设计 在iOS开发中,图文混排一直都是UI编程的一个核心点,也有许多优秀的第三方引擎,其中很有名的一套图文混排的框架叫做DTCoreText.但是在前些日的做的一个项目中,我并没有采用这套框架,原因有二,一是这套框架体积非常大,而项目的需求其实并不太高:二是要在这套框架中修改一些东西,难度也非常大,我最终采用的是一个叫做RCLabel的第三方控件,经过一些简单的优化和完善,达到了项目的要求. 先来介绍一下我项目中的图文混排的需求:首先我从服