您的位置:首页 > 编程语言 > ASP

asp.net c# 异步日志通用类(3)

2017-08-19 14:05 381 查看
通过测试,发现验证是否要保存日志验证很慢,我试了好多种方法验证都还是不理想,所以把删除了,只能按需调用方法就行 了,示例代码如下:

/*********************************************
* CLR 版本: 4.0.30319.42000
* 类 名 称: Logger
* 机器名称: MS-20170310FLQY
* 命名空间: Utils
* 文 件 名: Logger
* 创建时间: 2017/5/12 10:16:17
* 作 者: Choj
* 说 明:
* 修改时间:
* 修 改 人:
*
*********************************************/

using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Runtime.Remoting.Messaging;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace Utils
{
/// <summary>
/// 异步日志实现类
/// </summary>
public class Logger
{
#region 属性
/// <summary>
/// 实例化
/// </summary>
public static Logger Instance = new Logger();
/// <summary>
/// 日志保存的路径
/// </summary>
string LogPath = ConfigurationManager.AppSettings["LogPath"];
/// <summary>
/// 文件夹路径
/// </summary>
string LogDir = ConfigurationManager.AppSettings["LogDir"];
/// <summary>
/// 文件夹路径
/// </summary>
string LogDateFormat = ConfigurationManager.AppSettings["LogDateFormat"] ?? "yyyyMMddHH";
/// <summary>
/// 委托
/// </summary>
/// <p
c105
aram name="msg">信息</param>
/// <param name="fileName">文件名</param>
/// <param name="parms">其他的参数</param>
delegate void LogException(string msg, string fileName, params object[] parms);
#endregion

#region 构造函数
/// <summary>
/// 默认构造函数
/// </summary>
public Logger()
{ }

/// <summary>
/// 够着函数
/// </summary>
/// <param name="LogDir">日志的文件夹</param>
public Logger(string LogDir)
{
this.LogDir = LogDir;
}

/// <summary>
/// 构造函数
/// </summary>
/// <param name="path"></param>
/// <param name="LogDir"></param>
public Logger(string path, string LogDir)
{
this.LogPath = path;
this.LogDir = LogDir;
}

/// <summary>
/// 构造函数
/// </summary>
/// <param name="path">路径</param>
/// <param name="LogDir">日志路径</param>
/// <param name="logDateFormat">文件格式</param>
public Logger(string path, string logDir, string logDateFormat)
{
this.LogPath = path;
this.LogDir = logDir;
this.LogDateFormat = logDateFormat;
}
#endregion

#region 错误日志记录
/// <summary>
/// 添加错误日志
/// </summary>
/// <param name="ex">错误的信息</param>
/// <param name="parms">其他的参数</param>
public void Error(Exception ex, params object[] parms)
{
var strMsg = new StringBuilder();
strMsg.AppendFormat("\r\n");
strMsg.AppendFormat("Message:{0}", ex.Message);
strMsg.AppendFormat("\r\n");
strMsg.AppendFormat("StackTrace:{0}", ex.StackTrace);
strMsg.AppendFormat("\r\n");
strMsg.AppendFormat("source:{0}", ex.Source);
strMsg.AppendFormat("\r\n");
strMsg.AppendFormat("InnerException:{0}", ex.InnerException);
strMsg.AppendFormat("\r\n");

new LogException(AddQueue).BeginInvoke(strMsg.ToString(), "Error", parms, new AsyncCallback(CallBack), null);
}

/// <summary>
/// 调试日志
/// </summary>
/// <param name="msg">信息</param>
/// <param name="parms">其他的参数</param>
public void Debug(string msg, params object[] parms)
{
new LogException(AddQueue).BeginInvoke(msg, "Debug", parms, new AsyncCallback(CallBack), null);
}

/// <summary>
/// 调试日志
/// </summary>
/// <param name="msg">信息</param>
/// <param name="parms">其他的参数</param>
public void Info(string msg, params object[] parms)
{
new LogException(AddQueue).BeginInvoke(msg, "Info", parms, new AsyncCallback(CallBack), null);
}

/// <summary>
/// 警告
/// </summary>
/// <param name="msg">信息</param>
/// <param name="parms">其他的参数</param>
public void Warn(string msg, params object[] parms)
{
new LogException(AddQueue).BeginInvoke(msg, "Warn", parms, new AsyncCallback(CallBack), null);
}

/// <summary>
/// 错误
/// </summary>
/// <param name="msg">信息</param>
/// <param name="parms">其他的参数</param>
public void Error(string msg, params object[] parms)
{
new LogException(AddQueue).BeginInvoke(msg, "Error", parms, new AsyncCallback(CallBack), null);
}

/// <summary>
/// 致命错误
/// </summary>
/// <param name="msg">信息</param>
/// <param name="parms">其他的参数</param>
public void Fatal(string msg, params object[] parms)
{
new LogException(AddQueue).BeginInvoke(msg, "Fatal", parms, new AsyncCallback(CallBack), null);
}
/// <summary>
/// 异步回调
/// </summary>
/// <param name="result">异步调用</param>
static void CallBack(IAsyncResult result)
{
var handler = ((AsyncResult)result).AsyncDelegate as LogException;
if (handler != null)
{
handler.EndInvoke(result);
}
}
#endregion

#region 添加日志到队列
/// <summary>
/// 添加日志到队列
/// </summary>
/// <param name="msg"></param>
/// <param name="level"></param>
/// <param name="parms"></param>
private void AddQueue(string msg, string level, params object[] parms)
{
QueueHelper<LogEntity>.Instance.Enqueue(new LogEntity()
{
Level = level,
Msg = msg,
Parms = parms
});
}
#endregion

#region 保存日志信息
/// <summary>
/// 初始化
/// </summary>
public void Init()
{
ThreadPool.QueueUserWorkItem(o =>
{
while (true)
{
var queue = QueueHelper<LogEntity>.Instance.Dequeue();

if (queue != null)
{
#region 基本的设置
var fileName = System.DateTime.Now.ToString(LogDateFormat) + ".log";
string path = LogPath;
if (string.IsNullOrEmpty(path))
{
path = System.AppDomain.CurrentDomain.BaseDirectory;
}
path = string.Format("{0}\\Log\\{1}\\{2}\\", path, queue.Level, LogDir);

while (path.Contains(@"\\"))
{
path = path.Replace(@"\\", @"\");
}
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
string filePath = path + fileName;
#endregion

using (var sw = new StreamWriter(filePath, true))
{
var strMsg = new StringBuilder();
strMsg.AppendFormat(DateTime.Now.ToString());
strMsg.Append("\r\n");
strMsg.AppendFormat("{0}", queue.Msg);
if (queue.Parms != null)
{//--- 其他的参数 ---
foreach (var parm in queue.Parms)
{
strMsg.Append("\r\n");
strMsg.Append(parm);
}
}
strMsg.Append("\r\n");

sw.WriteLine(strMsg.ToString());
}
}
}
});
}
#endregion
}
/// <summary>
/// 保存日志
/// </summary>
public class LogEntity
{
private string msg;
/// <summary>
/// 日志基本信息
/// </summary>
public string Msg
{
get { return msg; }
set { msg = value; }
}
private string level;
/// <summary>
/// 日志等级
/// </summary>
public string Level
{
get { return level; }
set { level = value; }
}
private object[] parms;
/// <summary>
/// 其他的参数
/// </summary>
public object[] Parms
{
get { return parms; }
set { parms = value; }
}
}
}


测试代码:
Utils.Logger.Instance.Init();

var sw = new Stopwatch();
sw.Start();

for (int i = 0; i < 10000; i++)
{
Utils.Logger.Instance.Debug("Logger测试");
}

sw.Stop();
Console.WriteLine("Logger 日志循环10000次,总耗时:" + sw.ElapsedMilliseconds);

sw = new Stopwatch();
sw.Start();

Parallel.For(0, 100, (i) =>
{
for (int j = 0; j < 100; j++)
{
Utils.Logger.Instance.Debug("Logger测试");
}
});

sw.Stop();
Console.WriteLine("Logger 并行循环10000次,总耗时:" + sw.ElapsedMilliseconds);

Console.ReadKey();





快是快多了,但是要是按需写入日志就没有办法实现了,有时间在研究一下,怎么验证效率才会更高
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐