支持异步写入的日志类,支持Framework2.0
因为工作需要需要在XP上运行一个C#编写的Winform插件,我就用Framework2.0,因为存在接口交互所以想保留交易过程的入参出参。
考虑到插件本身实施的因素,就没有使用Log4、NLog等成熟的日志插件。在网上搜索了一个是通过TextWriterTraceListener实现的,但是实际使用
过程中发现并没实现我想要的功能,于是乎自己重新造了个轮子,如果大家有需要可以参考下。
/// <summary>
/// 日志类型
/// </summary>
public enum LogType
{
Error,
Trace,
Info
} /// <summary>
/// 日志类
/// 支持同步和异步
/// </summary>
public sealed class Logger
{ #region 变量|常量 /// <summary>
/// 用于Trace的组织输出的类别名称
/// </summary>
private const string error = "\r\n***********************EXCEPTION {0}***********************"; /// <summary>
/// 跟踪
/// </summary>
private const string trace = "\r\n*************************TRACE {0}*******************************"; /// <summary>
/// 信息
/// </summary>
private const string info = "\r\n****************************INFO {0}********************************"; /// <summary>
/// 1 仅控制台输出
/// 2 仅日志输出
/// 3 控制台+日志输出
/// </summary>
private static readonly int flag = ; //可以修改成从配置文件读取 #endregion #region 委托 private delegate void AsyncLogException(Exception ex);
private delegate void AyyncLog(string msg, LogType type);
private delegate void AsyncLogSqlCommand(SqlCommand cmd);
private delegate void AsyncLogSql(string sql, params SqlParameter[] parameter); private static void BeginError(Exception ex)
{
if (null != ex)
{
string path = GetLogPath(LogType.Error);
//输出日志头
WriteLog(path, string.Format(error, DateTime.Now));
while (null != ex)
{
WriteLog(path, string.Format("{0} {1}\r\n{2}\r\nSource:{3}", ex.GetType().Name, ex.Message, ex.StackTrace, ex.Source));
ex = ex.InnerException;
}
}
} private static void BeginTrace(string msg, LogType type)
{
if (string.IsNullOrEmpty(msg)) return;
string path = GetLogPath(type);
//输出日志头
WriteLog(path, string.Format(trace, DateTime.Now));
//输出日志内容
WriteLog(path, msg);
}
#endregion #region IO操作
/// <summary>
/// 获取日志类型对应的日志存储环境
/// </summary>
/// <param name="type">日志类型</param>
/// <returns></returns>
private static string GetLogPath(LogType type)
{
DateTime time = DateTime.Now;
string subdir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "logs");
subdir = Path.Combine(subdir, type.ToString());
subdir = Path.Combine(subdir, time.ToString("yyyyMM"));
if (!Directory.Exists(subdir))
{
Directory.CreateDirectory(subdir);
}
string result = Path.Combine(subdir, time.ToString("yyyyMMdd") + ".log");
return result;
} /// <summary>
/// 写入日志
/// </summary>
/// <param name="path">日志环境</param>
/// <param name="text">写入的文本值</param>
private static void WriteLog(string path, string text)
{
string filePath = Path.GetDirectoryName(path);
if (Directory.Exists(filePath) == false)
{
Directory.CreateDirectory(filePath);
}
if (File.Exists(path))
{
using (StreamWriter sw = File.AppendText(path))
{
sw.WriteLine(text + "\n");
sw.Flush();
sw.Close();
}
}
else
{
StreamWriter sr = File.CreateText(path);
sr.WriteLine(text + "\n");
sr.Flush();
sr.Close();
}
}
#endregion #region 发布的方法
/// <summary>
/// 写入异常日志
/// </summary>
/// <param name="ex">异常对象</param>
/// <param name="isAsync">是否异步,默认异步</param>
public static void Error(Exception ex, bool isAsync = true)
{
if (isAsync)
new AsyncLogException(BeginError).BeginInvoke(ex, null, null);
else
BeginError(ex);
} /// <summary>
/// 写入错误日志
/// </summary>
/// <param name="msg">错误信息</param>
/// <param name="isAsync">是否异步,默认异步</param>
public static void Error(string msg, bool isAsync = false)
{
if (isAsync)
new AyyncLog(BeginTrace).BeginInvoke(msg, LogType.Error, null, null);
else
BeginTrace(msg, LogType.Error);
} /// <summary>
/// 异步跟踪日志
/// </summary>
/// <param name="msg"></param>
public static void Trace(string msg, bool isAsync = true)
{
if (isAsync)
new AyyncLog(BeginTrace).BeginInvoke(msg, LogType.Trace, null, null);
else
BeginTrace(msg, LogType.Trace);
} /// <summary>
/// 写入日志信息,日志类型为info
/// </summary>
/// <param name="msg">日志信息</param>
/// <param name="isAsync">是否异步,默认异步</param>
public static void Info(string msg, bool isAsync = true)
{
if (isAsync)
new AyyncLog(BeginTrace).BeginInvoke(msg, LogType.Info, null, null);
else
BeginTrace(msg, LogType.Info);
}
#endregion }
}
调用代码:
private void button1_Click_1(object sender, EventArgs e)
{
Logger.Info("测试");
}
运行效果如下:
支持异步写入的日志类,支持Framework2.0的更多相关文章
- C#写文本日志帮助类(支持多线程)
代码: using System; using System.Configuration; using System.IO; using System.Threading.Tasks; namespa ...
- python日志,支持彩色打印和文件大小切片写入和写入mongodb
1.项目中使用了自定义的ColorHandler和MongoHandler,使用了内置的RotatingFileHandler和三方库的ConcurrentRotatingFileHandler. 支 ...
- Android开发调试日志工具类[支持保存到SD卡]
直接上代码: package com.example.callstatus; import java.io.File; import java.io.FileWriter; import java.i ...
- C#写文本日志帮助类(支持多线程)改进版(不适用于ASP.NET程序)
由于iis的自动回收机制,不适用于ASP.NET程序 代码: using System; using System.Collections.Concurrent; using System.Confi ...
- BAE3.0还不支持本地写入文件
BAE3.0对比2.0做了很大的改动,对于安装应用方面也方便了很多,普通的应用表面上(下文就是讲为什么说表面上)不需要做什么适配.比如wp博客,直接修改wp-config.php,把数据库信息填一下就 ...
- TNetHttpClient支持异步访问(Delphi 10.1 Berlin,红鱼儿的博客)
Delphi 10.1进一步改进自Delphi 10带来的Http访问控件TNetHttpClient,支持异步访问,同时增加ConnectionTimeout及ResponseTimeout两个超时 ...
- 支持异步同步的分布式CommandBus MSMQ实现
支持异步同步的分布式CommandBus MSMQ实现 先上一张本文所描述的适用场景图 分布式场景,共3台server: 前端Server Order App Server Warehouse App ...
- LogStation 支持浏览器实时查看日志
我们在logback 分布式日志汇总中已经将日志输出到了all.logs,LogStation支持浏览器实时查看日志,适合研发和运维彼此独立的场景:研发没有服务器权限,却想看日志实时输出.再配合ngi ...
- Java - IO System类支持和缓冲流
System类的支持和缓冲流 System类对IO的支持 在System类中,为了支持IO操作提供了三个常量: 错误输出: public static final PrintStream err; 输 ...
随机推荐
- Github把自己的本地项目托管到git上
开篇之前说下题外话,之前写过一篇博客,IOS-一步一步教你自定义评分星级条RatingBar,群里有人想要源码,我上传到github上了,有需要的可以去看一下,github地址自定义评分星级条 言归正 ...
- STS(Spring Tool Suite)下SSM(Spring+SpringMVC+Mybatis)框架搭建(二)
继完成controller配置并使用controller实现页面跳转,现连接数据库进行登录. 在SSM框架中,使用Mybatis与数据库连接,因此需要配置关于mybatis的配置. 废话少说直接开始: ...
- Java之hashCode的作用和equals方法的重构规则
这个是博主对hashcode的初步理解,以后加深了会再来更新: 1.hashcode是什么? hashcode是对象的散列码,不同的对象几乎不一样,说几乎是因为还是可以一样的. 特点:每一个对象都有h ...
- 初识Jmeter
初识Jmeter 测试计划是根节点,其下可以有多个Thread Group,起始可配setUp Thread Group和tearDown Group.在每个Group下可创建其它节点,模拟各类实际行 ...
- JetBrains系列IDE快捷键大全(转载)
编辑 快捷键组合 说明 Ctrl + Space 代码自动完成提示(选择) Alt + Enter 显示意图动作和快速修复 Ctrl + P 参数信息 (在调用方法参数忘记的时候,提示) Ctrl + ...
- CDN(Content Delivery Network)技术原理概要
简介 CDN(Content Delivery Network)即内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡.内容分发.调度等功能,使用户就近获取所需内容,提高用户访问响应速度和 ...
- 盒子模型/div标签/益出处理
/* <div></div>没有任何功能,不属于功能标签 可以放文字,图片以及各种元素的块标签 常常用来布局 span标签属于行内标签,无法设置宽高 */ <!docty ...
- c# 右下角弹出窗口
public partial class Form2 : Form { System.Diagnostics.Stopwatch sth = new System.Diagnostics.Stopwa ...
- 微服务架构-选择Spring Cloud,放弃Dubbo
Spring Cloud 在国内中小型公司能用起来吗?从 2016 年初一直到现在,我们在这条路上已经走了一年多. 在使用 Spring Cloud 之前,我们对微服务实践是没有太多的体会和经验的.从 ...
- Python爬虫7-Cookie & Session
GitHub代码练习地址:1.手动利用cookie访问网页:https://github.com/Neo-ML/PythonPractice/blob/master/SpiderPrac10_cook ...