LogInfoHelper
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading; namespace Model
{
/// <summary>
/// 日志文件帮助类
/// </summary>
public class LogInfoHelper
{
#region Field
private static Object m_Lock = new object();
// 消息队列 (内部加锁访问)
private Queue<IGetWriteLogInfo> m_MessageQueue = new Queue<IGetWriteLogInfo>();
private Thread m_BackWriteThread;
private static LogInfoHelper m_Instance = null;
private static readonly object syncObj = new object();
#endregion #region Method
/// <summary>
/// 向日志文件中写入运行时信息
/// </summary>
/// <param name="message">要写入的运行时消息</param>
/// <param name="messageType"></param>
/// <returns></returns>
private bool WriteRunTimeMessage(IGetWriteLogInfo logInfo)
{
lock (m_Lock)
{
m_MessageQueue.Enqueue(logInfo);
}
return true;
} /// <summary>
/// 向日志文件中写入运行时的程序信息
/// </summary>
/// <param name="Message">要写入到日志文件中的信息</param>
/// <param name="messageType">要写入的日志类型</param>
/// <param name="isAutoAddTimeInfo">是否在写入的信息前加上当前系统时间</param>
/// <returns></returns>
public bool WriteRunTimeMessage(IGetWriteLogInfo logInfo, bool isAutoAddTimeInfo)
{
logInfo.Message = DateTime.Now.ToString() + "->" + logInfo.Message;
return WriteRunTimeMessage(logInfo);
}
/// <summary>
/// 异步写文件线程入口函数
/// </summary>
private void WriteTreadHandler()
{
Queue<IGetWriteLogInfo> tempQueue = new Queue<IGetWriteLogInfo>();
while (true)
{
StreamWriter sw = null;
#region 加锁拷贝部分
lock (m_MessageQueue)
{
int nowMessageCount = m_MessageQueue.Count;
for (int i = 0; i < nowMessageCount; i++)
{
try
{
tempQueue.Enqueue(m_MessageQueue.Dequeue());
}
catch (System.InvalidOperationException exp)
{
break;
}
}
}
#endregion
try
{
int nowTempQueueCount = tempQueue.Count;
for (int i = 0; i < nowTempQueueCount; i++)
{
IGetWriteLogInfo messageInfo = tempQueue.Dequeue();
long fileSize = 0; DateTime dtNow = DateTime.Now;
//日志文件名称
string FileName = messageInfo.BaseFileName + "-" + dtNow.ToShortDateString() + ".log";
//日志文件的完整路径
string FilePath = System.IO.Path.Combine(messageInfo.DictionaryPath, FileName);
FilePath = FilePath.Replace("/", "-");
//判断日志文件的大小
if (File.Exists(FilePath))
{
FileInfo FileInfo = new FileInfo(FilePath);
fileSize = FileInfo.Length / 1024 / 1024;
//当天异常日志大于10M的时候停止继续写入异常信息(PS:万一异常超级多 硬盘岂不是要炸~_~ 服务器上全天跑着鬼知道那儿有bug)
if (fileSize > 10)
{
continue;
}
}
sw = new StreamWriter(FilePath, true, Encoding.UTF8, 1024);
sw.AutoFlush = true;
sw.WriteLine(messageInfo.Message);
sw.Close();
//sw.WriteLine("------------------------------------------------------------");
}
}
catch (Exception exp)
{
throw exp;
}
finally
{
if (sw != null)
{
sw.Close();
sw.Dispose();
}
}
Thread.Sleep(1000);
}
}
#endregion #region Constructor
/// <summary>
/// 实例化对象的时候初始化写入线程
/// </summary>
private LogInfoHelper()
{
m_BackWriteThread = new Thread(WriteTreadHandler);
m_BackWriteThread.IsBackground = true;
m_BackWriteThread.Name = "异步写入日志文件线程";
m_BackWriteThread.Start();
}
#endregion
/// <summary>
/// 获取LogInfoHelper的实例
/// </summary>
public static LogInfoHelper GetInstance()
{
if (null == m_Instance)
{
lock (syncObj)
{
if (null == m_Instance)
{
m_Instance = new LogInfoHelper();
}
}
}
return m_Instance;
} } /// <summary>
/// 运行时需要写入到日志文件的信息类型
/// </summary>
public class LogMessageInfo : IGetWriteLogInfo
{ #region field
private string m_BaseName; private string m_MessageType; private string m_Message = string.Empty; private string m_DictionaryPath = string.Empty;
#endregion #region property
/// <summary>
/// 写入日志文件的基础文件名称
/// </summary>
public string BaseFileName
{
get { return m_BaseName; }
}
/// <summary>
/// 写入日志文件的日志类型
/// </summary>
public string MessageType
{
get { return m_MessageType; }
}
/// <summary>
/// 写入日志文件的日志信息
/// </summary>
public string Message
{
get { return m_Message; }
set { if (!string.IsNullOrEmpty(value)) { m_Message = value; } }
}
/// <summary>
/// 写入日志的文件存放目录
/// </summary>
public string DictionaryPath
{
get { return m_DictionaryPath; }
}
#endregion #region constructor
public LogMessageInfo(string DictionaryPath, string MessageFileBaseString, string MessageType, string Message)
{
if (!string.IsNullOrEmpty(DictionaryPath) && System.IO.Directory.Exists(DictionaryPath))
{
m_DictionaryPath = DictionaryPath;
}
else
{
throw new Exception("指定存放异常文件的目录不存在或者错误!!");
}
if (!string.IsNullOrEmpty(MessageFileBaseString) && !string.IsNullOrEmpty(MessageType))
{
m_BaseName = MessageFileBaseString;
m_MessageType = MessageType;
m_Message = Message;
}
}
#endregion /// <summary>
/// 获取要写入到日志文件的字符串数据
/// </summary>
/// <returns></returns>
public string GetLogString()
{
return m_Message;
}
} /// <summary>
/// 获取要写入到日志文件中的文字字符串
/// </summary>
public interface IGetWriteLogInfo
{
/// <summary>
/// 获取要写入到日志文件的字符串信息
/// </summary>
/// <returns></returns>
string GetLogString();
/// <summary>
/// 获取写入的日志文件的基名称
/// </summary>
string BaseFileName { get; }
/// <summary>
/// 获取写入的日志的日志类型
/// </summary>
string MessageType { get; }
/// <summary>
/// 获取要写入的日志的消息
/// </summary>
string Message { get; set; }
/// <summary>
/// 获取要写入日志文件的文件夹路径
/// </summary>
string DictionaryPath { get; }
}
}
LogInfoHelper的更多相关文章
- Pagination.js + Sqlite web系统分页
前端使用 jquery pagination.js 插件. 环境准备:jquery.js.pagination.js.pagination.css 附件下载:https://files.cnblogs ...
随机推荐
- 线段树双tag+差分数组——cf1208E
写了一上午 /* 对于每个数组a[],先排序然后从大到小把a[i]放进线段树更新 设a[i]的位置是pos,那么其可更新的区间是[pos,w-(li-pos)] 线段树结点保存 tag=now表示当前 ...
- Linux文件大小 指令&编程
在工作和日常的编程中时常需要确定文件的大小,一些基本的查看方式在此做一个总结. 一. linux shell环境下 df可以查看一级文件夹大小.使用比例.档案系统及其挂入点,但对文件却无能为力. ...
- 【前端控件】JQuery datepicker 日期控件设置
datepicker控件可通过参数设置进行语言切换,以下可实现,系统所有日期控件默认为中文,在特定页面或者特定条件下可切换成英语!~ HTML: <!DOCTYPE html> <h ...
- OpenFileDialog 打开图片存储到电脑本地上
替换图片 private void btnSkin_Click(object sender, RoutedEventArgs e) { string fName; OpenFileDialog ofd ...
- springboot上传图片大小限制
背景:springboot项目上传图片超过1M报错,经了解,springboot默认上传文件1M 需求:更改默认配置,控制上传文件大小 方法:①更改配置文件(经试验不可行,不知道为什么):②更改启动B ...
- 【构造共轭函数+矩阵快速幂】HDU 4565 So Easy! (2013 长沙赛区邀请赛)
[解题思路] 给一张神图,推理写的灰常明白了,关键是构造共轭函数,这一点实在是要有数学知识的理论基础,推出了递推式,接下来就是矩阵的快速幂了. 神图: 给个大神的链接:构造类斐波那契数列的矩阵快速幂 ...
- 2018湘潭大学程序设计竞赛【A】
题目链接:https://www.nowcoder.com/acm/contest/105/A 题意:给你起始和结束的天时分,让你算总秒数. 题解:输入格式.注意long long.签到题. #inc ...
- spring boot Swagger2(version=2.7.0) 注解@ApiImplicitParam的属性dataType值为”自定义泛型“应用
注解: @ApiImplicitParams @ApiImplicitParam name="需注解的API输入参数", value="接收参数的意义描述" ...
- 搭建一个自己的SVN服务器
其实方法非常简单,点点鼠标就好了. 上网搜索“VisualSVN Server”,一般来说都是会找到 https://www.visualsvn.com/server/ 这个网站的. 点击上边的Dow ...
- ubuntu16.04安装python虚拟环境
自己也是搜的教程,亲测有效 ubuntu16.04创建虚拟环境 一.linux环境 Ubuntu16.04 二.安装和配置虚拟环境 安装虚拟环境 sudo pip install virtualenv ...