开源日志log4net使用起来很方便,但是项目中不让用,所以自己重写了一个类,用来记录日志,比较简单。

1、首先是可以把日志分成多个类型,分别记录到不同的文件中

    /// <summary>
/// 日志类型
/// </summary>
public enum LogType
{
/// <summary>
/// 插入型
/// </summary>
Insert,
/// <summary>
/// 更新型
/// </summary>
Update,
/// <summary>
/// 所有
/// </summary>
All,
/// <summary>
/// 结尾,放在最后
/// </summary>
End
}

我的是分三个,insert插入,update更新,all包括所有的日志。

2、接下来是LogHelper类,代码中已注释,不多说,直接上代码

     /// <summary>
/// 记录日志
/// </summary>
public class LogHelper
{ #region 自定义变量
/// <summary>
/// 异常信息的队列
/// </summary>
private static Queue<string> qMsg = null;
/// <summary>
/// 文件大小最大值,单位:Mb
/// </summary>
private static int maxFileSize = ;
/// <summary>
/// 当天创建同一类型的日志文件的个数
/// </summary>
private static int[] createdFileCounts = new int[(int)LogType.End];
/// <summary>
/// 日志文件存放路径
/// </summary>
private static string logFilePath = "";
#endregion #region 属性
/// <summary>
/// 文件大小最大值,单位:Mb。小于0时则不限制
/// </summary>
public static int MaxFileSize
{
get { return maxFileSize; }
set { maxFileSize = value; }
}
/// <summary>
/// 日志文件存放路径
/// </summary>
public static string LogFilePath
{
set { logFilePath = value; }
get
{
if (!String.IsNullOrEmpty(logFilePath))
{
return logFilePath;
}
else
{
return System.Windows.Forms.Application.StartupPath + "\\Log\\" + DateTime.Now.ToString("yyyy-MM-dd");
}
}
}
#endregion #region 构造函数
/// <summary>
/// 静态构造函数
/// </summary>
static LogHelper()
{
qMsg = new Queue<string>();
SetCreatedFileCount();
RunThread();
}
#endregion #region 辅助
/// <summary>
/// 获取日志文件的全路径
/// </summary>
/// <param name="logType"></param>
/// <returns></returns>
private static string GetLogPath(LogType logType, bool isCreateNew)
{
string logPath = LogFilePath;
if (!Directory.Exists(logPath))
{
Directory.CreateDirectory(logPath);
//看成是新的一天,要将昨天的数据清空
for (int i = ; i < createdFileCounts.Length; i++)
{
createdFileCounts[i] = ;
}
}
switch (logType)
{
case LogType.Insert:
logPath = logPath + "\\" + "Insert";
break;
case LogType.Update:
logPath = logPath + "\\" + "Update";
break;
default:
logPath = logPath + "\\" + "All";
break;
}
if (isCreateNew)
{
int num = ++createdFileCounts[(int)logType];
logPath += string.Format("({0}).log", num);
return logPath;
} logPath += ".log";
//createdFileCounts[(int)logType] = 0;
if (!File.Exists(logPath))
{
//File.Create(logPath);
FileStream fs = File.Create(logPath);
fs.Close();
fs.Dispose();
} return logPath;
} /// <summary>
/// 运行线程
/// </summary>
private static void RunThread()
{
ThreadPool.QueueUserWorkItem(u =>
{
while (true)
{
string tmsg = string.Empty;
lock (qMsg)
{
if (qMsg.Count > )
tmsg = qMsg.Dequeue();
} //往日志文件中写错误信息
if (!String.IsNullOrEmpty(tmsg))
{
int index = tmsg.IndexOf("&&");
string logTypeStr = tmsg.Substring(, index);
LogType logType = LogType.All;
if (logTypeStr == string.Format("{0}", LogType.Insert))
{
logType = LogType.Insert;
}
else if (logTypeStr == string.Format("{0}", LogType.Update))
{
logType = LogType.Update;
} //记录所有日志
WriteLog(tmsg.Substring(index + ));
//分开记录日志
if (logType != LogType.All)
{
WriteLog(tmsg.Substring(index + ), logType);
}
} if (qMsg.Count <= )
{
Thread.Sleep();
}
}
});
} /// <summary>
/// 程序刚启动时 检测已创建的日志文件个数
/// </summary>
private static void SetCreatedFileCount()
{
string logPath = LogFilePath;
if (!Directory.Exists(logPath))
{
for (int i = ; i < createdFileCounts.Length; i++ )
{
createdFileCounts[i] = ;
}
}
else
{
DirectoryInfo dirInfo = new DirectoryInfo(logPath);
FileInfo[] fileInfoes = dirInfo.GetFiles("*.log");
foreach (FileInfo fi in fileInfoes)
{
string fileName = Path.GetFileNameWithoutExtension(fi.FullName).ToLower();
if (fileName.Contains('(') && fileName.Contains(')'))
{
fileName = fileName.Substring(, fileName.LastIndexOf('('));
switch (fileName)
{
case "insert":
createdFileCounts[(int)LogType.Insert]++;
break;
case "update":
createdFileCounts[(int)LogType.Update]++;
break;
case "all":
createdFileCounts[(int)LogType.All]++;
break;
default:
break;
}
}
} }
}
#endregion #region 写日志 /// <summary>
/// 写日志
/// </summary>
/// <param name="strLog">日志内容</param>
public static void WriteLog(string strLog)
{
WriteLog(strLog, LogType.All);
} /// <summary>
/// 写日志
/// </summary>
/// <param name="strLog">日志内容</param>
/// <param name="logType">日志类型</param>
public static void WriteLog(string strLog, LogType logType)
{
if (String.IsNullOrEmpty(strLog))
{
return;
}
strLog = strLog.Replace("\n", "\r\n"); FileStream fs = null;
try
{
string logPath = GetLogPath(logType, false);
FileInfo fileInfo = new FileInfo(logPath);
if (MaxFileSize > && fileInfo.Length > ( * * MaxFileSize))
{
fileInfo.MoveTo(GetLogPath(logType, true));
}
fs = File.Open(logPath, FileMode.OpenOrCreate);
//fs = File.OpenWrite(logPath);
byte[] btFile = Encoding.UTF8.GetBytes(strLog);
//设定书写的開始位置为文件的末尾
fs.Position = fs.Length;
//将待写入内容追加到文件末尾
fs.Write(btFile, , btFile.Length);
}
finally
{
if (fs != null)
{
fs.Close();
fs.Dispose();
}
}
} /// <summary>
/// 写入错误日志队列
/// </summary>
/// <param name="msg">错误信息</param>
public static void WriteLogAsync(string strLog, LogType logType)
{
//将错误信息添加到队列中
lock (qMsg)
{
qMsg.Enqueue(string.Format("{0}&&{1}\r\n", logType, strLog));
}
}
#endregion }

使用时,可以直接调用WriteLogAsync函数,将消息添加到队列中,然后在另外的线程中处理队列中的消息。

其中,如果没有给LogFilePath属性赋值,则有一个默认的文件存放路径。MaxFileSize属性是用来限制日志文件大小的,如果小于等于0则表示不限制。如果有限制,当文件大小超过这个最大值后会将原来的文件重命名,然后再创建一个“自己”。例如:正在存放日志的文件名为"All.log",当它满了以后就成为“All(n).log”文件,n为从1开始递增的数字,然后会重新创建一个“All.log”文件接着存放日志。

日志记录类LogHelper的更多相关文章

  1. 【个人使用.Net类库】(2)Log日志记录类

    开发接口程序时,要保证程序稳定运行就要时刻监控接口程序发送和接收的数据,这就需要一个日志记录的类将需要的信息记录在日志文件中,便于自己维护接口程序.(Web系统也是如此,只是对应的日志实现比这个要复杂 ...

  2. C# 简单日志帮助类LogHelper

    调用: LogHelper.Debug(""); LogHelper.Info(""); LogHelper.Error(""); 项目添加 ...

  3. 【C#通用类】日志记录类

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Tex ...

  4. C#日志记录类

    public class WriteLog { /// <summary> /// 将错误写入文件中 /// </summary> /// <param name=&qu ...

  5. 日志记录类库log4net的使用总结

    log4net是一个开源的日志记录类库,经过配置后可以自动抓取程序中的错误.异常信息,并写入磁盘,也可以在异常发生时执行其他指定的操作,比如:通知某人右键.写入数据库等.这里写个ASP.NET MVC ...

  6. 利用AOP与ToStringBuilder简化日志记录

    刚学spring的时候书上就强调spring的核心就是ioc和aop blablabla...... IOC到处都能看到...AOP么刚开始接触的时候使用在声明式事务上面..当时书上还提到一个用到ao ...

  7. 将错误日志记录在txt文本里

    引言 对于已经部署的系统一旦出错对于我们开发人员来说是比较痛苦的事情,因为我们不能跟踪到错误信息,不能 很快的定位到我们的错误位置在哪,这时候如果能像开发环境一样记录一些堆栈信息就可以了,这时候我们就 ...

  8. Spring AOP进行日志记录

    在java开发中日志的管理有很多种.我一般会使用过滤器,或者是Spring的拦截器进行日志的处理.如果是用过滤器比较简单,只要对所有的.do提交进行拦截,然后获取action的提交路径就可以获取对每个 ...

  9. Java 基于log4j的日志工具类

    对log4j日志类进行了简单封装,使用该封装类的优势在于以下两点: 1.不必在每个类中去创建对象,直接类名 + 方法即可 2.可以很方便的打印出堆栈信息 package com.tradeplatfo ...

随机推荐

  1. nyoj 16 矩形嵌套

    矩形嵌套 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a& ...

  2. [OC Foundation框架 - 1] 常用结构体

    底层封装是使用了typedef定义的结构体 typedef struct _NSString{ xxx xxx } NSString;   1. NSRange 结构体 #注意结构体不是对象 3种定义 ...

  3. ScrollView详解

    创建方式 1:StoryBoard/Xib 这里StoarBoard就不多说,直接拖就可以,说太多没意思,如果连这个都不会我只能先给你跪了! 2:代码: 1 2 3 CGRect bounds = [ ...

  4. 理解js中的原型链,prototype与__proto__的关系

    说到prototype,就不得不先说下new的过程. 我们先看看这样一段代码: 1 <script type="text/javascript"> 2 var Pers ...

  5. JavaScript要点(九)HTML DOM

    通过 HTML DOM,可访问 JavaScript HTML 文档的所有元素. HTML DOM (文档对象模型) 当网页被加载时,浏览器会创建页面的文档对象模型(Document Object M ...

  6. AndroidStudio快捷键汇总

    最近开始全面转向Android Studio开发了,经常要去查快捷键,索性汇总下,自己方便查找 IDE 按键 说明 F1 帮助 Alt(Option)+F1 查找文件所在目录位置 Alt(Option ...

  7. setsockopt()使用方法(參数具体说明)

    int setsockopt(SOCKET s,int level,int optname,const char* optval,int optlen); s(套接字): 指向一个打开的套接口描写叙述 ...

  8. windows消息钩子

    1.消息钩子的概念: Windows应用程序是基于消息驱动的,不论什么线程仅仅要注冊窗体类都会有一个消息队列用于接收用户输入的消息和系统消息.为了拦截消息,Windows提出了钩子的概念.钩子(Hoo ...

  9. OpenCV快速遍历矩阵元素方法

    OpenCV中Mat矩阵data数据的存储方式和二维数组不一致,二维数组按照行优先的顺序依次存储,而Mat中还有一个标示行步进的变量Step.使用Mat.ptr<DataTyte>(row ...

  10. EasyUI基础入门之Easyloader(载入器)

    在了解完easyui的parser(解析器)之后,接下来就是easyloader(简单载入器)的学习了. 什么是EasyLoader 正如其名字一样easyloader的作用是为了动态的载入组件所需的 ...