程序语言C#,用于写日志,日志文件长度为1M,超过1M自动创建新文件。


文章目录
1.文件配置
在Web.config 的<appSetting></appSetting>中增加LogFilePath及LogType设置,分别用于配置日志存放目录及日志类型
<add key="LogFilePath" value="Log" />
<!--Info1 Debug2 Error3-->
<add key="LogType" value="Error3" />

2.创建日志类型枚举类型
public enum LogTypeEnum
{
Info1 = 1,
Debug2 = 2,
Error3 = 3,
}
3.创建日志类LogManager
3.1 日志路径获取
3.1.1 添加引用
添加配置文件操作引用以及IO类引用
using System.Configuration;
using System.IO;
3.1.2 获取路径配置
利用ConfigurationManager.AppSettings[“LogFilePath”]获取路径配置
public static string LogPath = (ConfigurationManager.AppSettings["LogFilePath"].IndexOf(":") < 0) ? Path.Combine(AppDomain.CurrentDomain.BaseDirectory, ConfigurationManager.AppSettings["LogFilePath"]) : ConfigurationManager.AppSettings["LogFilePath"];
3.1.3 配置缓存时间
定义一个时间变量,用于缓存日志写入时间,减少写日志频率,提升效率
private static DateTime RefreshManagerTime = DateTime.Now;
定义一个LogTypeEnum类型的成员OutLogType,用于获取日志写入等级,这里可以根据日志配置的等级来判断是否写入日志记录。
这个配置是为了调试和发布方便,例如一些查看sql、查看接口成员、登录信息的日志可以配置为Info1等级;一些调试的输出可以配置为Debug2等级,一些异常和错误判断日志配置为Debug2等级。在配置文件中配置为Info1时,日志全部输出;配置为Debug2时,仅输出Debug2日志和Error3日志;配置为Error3时,仅输出错误日志。在我们测试环境配置为Infor1或Debug2等级方便我们进行错误定位,在正式环境修改为Error3,则会仅记录错误日志,从而减少正式环境服务器存储压力。
public static LogTypeEnum OutLogType
{
get
{
if ((DateTime.Now - RefreshManagerTime).TotalSeconds > 600)
{
ConfigurationManager.RefreshSection("appSettings");
RefreshManagerTime = DateTime.Now;
}
string _logType = ConfigurationManager.AppSettings["LogType"];
if (string.IsNullOrEmpty(_logType))
{
return LogTypeEnum.Error3;
}
else
{
LogTypeEnum retValue = LogTypeEnum.Error3;
try { retValue = (LogTypeEnum)Enum.Parse(typeof(LogTypeEnum), _logType); }
catch { retValue = LogTypeEnum.Error3; }
return retValue;
}
}
}
3.2 编写调用方法WriteLog
WriteLog方法定义静态方法,要求接收错误信息,日志类型
public static void WriteLog(string errorMessage, LogTypeEnum logType = LogTypeEnum.Error3)
{
if (OutLogType > logType)
{
return;
}
string fileName = "Log.txt";
StreamWriter sr;
string filePath = Path.Combine(LogPath, fileName);
if (File.Exists(filePath))
{
FileInfo fileInfo = new FileInfo(filePath);
//文件大于1M新建日志文件
if (fileInfo.Length >= 1024 * 1024)
{
int i = 1;
string bkFileName = string.Empty;
while (true)
{
bkFileName = string.Format("{0}{1}{2}{3}", fileName.Substring(0, fileName.LastIndexOf('.')), "-", i, fileName.Substring(fileName.LastIndexOf('.')));
if (!File.Exists(Path.Combine(LogPath, bkFileName)))
{
break;
}
i++;
}
fileInfo.MoveTo(Path.Combine(LogPath, bkFileName));
if (!Directory.Exists(LogPath))
{
DirectoryInfo di = new DirectoryInfo(LogPath);
di.Create();
}
sr = File.CreateText(filePath);
sr.Write("时间: ");
sr.WriteLine(DateTime.Now);
sr.Write("错误: ");
sr.WriteLine(errorMessage);
sr.WriteLine("---------------------------------------------------");
}
else
{
sr = File.AppendText(filePath);
sr.Write("时间: ");
sr.WriteLine(DateTime.Now);
sr.Write("错误: ");
sr.WriteLine(errorMessage);
sr.WriteLine("---------------------------------------------------");
}
}
else //如果文件不存在
{
DirectoryInfo di = new DirectoryInfo(LogPath);
di.Create();
sr = new StreamWriter(filePath, true);
sr.Write("时间: ");
sr.WriteLine(DateTime.Now);
sr.Write("错误: ");
sr.WriteLine(errorMessage);
sr.WriteLine("---------------------------------------------------");
}
sr.Close();
}
3.2.1 增加 WriteLog方法的多种参数及返回类型
这里为了方便我们调用时方便操作,可以多些几种调用方法,具体如下
public static Exception WriteLog(Exception ex, LogTypeEnum logType = LogTypeEnum.Error3)
{
if (OutLogType > logType)
{
return null;
}
string fileName = "Log.txt";
StreamWriter sr;
string filePath = Path.Combine(LogPath, fileName);
if (File.Exists(filePath))
{
FileInfo fileInfo = new FileInfo(filePath);
//文件大于1M新建日志文件
if (fileInfo.Length >= 1024 * 1024)
{
int i = 1;
string bkFileName = string.Empty;
while (true)
{
bkFileName = string.Format("{0}{1}{2}{3}", fileName.Substring(0, fileName.LastIndexOf('.')), "-", i, fileName.Substring(fileName.LastIndexOf('.')));
if (!File.Exists(Path.Combine(LogPath, bkFileName)))
{
break;
}
i++;
}
fileInfo.MoveTo(Path.Combine(LogPath, bkFileName));
if (!Directory.Exists(LogPath))
{
DirectoryInfo di = new DirectoryInfo(LogPath);
di.Create();
}
sr = File.CreateText(filePath);
sr.Write("时间: ");
sr.WriteLine(DateTime.Now);
sr.Write("错误: ");
sr.WriteLine(ex.Message);
sr.Write("错误堆栈分析: ");
sr.WriteLine(ex.StackTrace);
sr.WriteLine("---------------------------------------------------");
}
else
{
sr = File.AppendText(filePath);
sr.Write("时间: ");
sr.WriteLine(DateTime.Now);
sr.Write("错误: ");
sr.WriteLine(ex.Message);
sr.Write("错误堆栈分析: ");
sr.WriteLine(ex.StackTrace);
sr.WriteLine("---------------------------------------------------");
}
}
else //如果文件不存在
{
if (!Directory.Exists(LogPath))
{
DirectoryInfo di = new DirectoryInfo(LogPath);
di.Create();
}
sr = File.CreateText(filePath);
sr.Write("时间: ");
sr.WriteLine(DateTime.Now);
sr.Write("错误: ");
sr.WriteLine(ex.Message);
sr.Write("错误堆栈分析: ");
sr.WriteLine(ex.StackTrace);
sr.WriteLine("---------------------------------------------------");
}
sr.Close();
return ex;
}
public static void WriteLog(Exception ex, string ErrorMessage, LogTypeEnum logType = LogTypeEnum.Error3)
{
if (OutLogType > logType)
{
return;
}
string fileName = "Log.txt";
StreamWriter sr;
string filePath = Path.Combine(LogPath, fileName);
if (File.Exists(filePath))
{
FileInfo fileInfo = new FileInfo(filePath);
//文件大于1M新建日志文件
if (fileInfo.Length >= 1024 * 1024)
{
int i = 1;
string bkFileName = string.Empty;
while (true)
{
bkFileName = string.Format("{0}{1}{2}{3}", fileName.Substring(0, fileName.LastIndexOf('.')), "-", i, fileName.Substring(fileName.LastIndexOf('.')));
if (!File.Exists(Path.Combine(LogPath, bkFileName)))
{
break;
}
i++;
}
fileInfo.MoveTo(Path.Combine(LogPath, bkFileName));
if (!Directory.Exists(LogPath))
{
DirectoryInfo di = new DirectoryInfo(LogPath);
di.Create();
}
sr = File.CreateText(filePath);
sr.Write("时间: ");
sr.WriteLine(DateTime.Now);
sr.Write("错误: ");
sr.WriteLine(ErrorMessage);
sr.Write("错误堆栈分析: ");
sr.WriteLine(ex.StackTrace);
sr.WriteLine("---------------------------------------------------");
}
else
{
sr = File.AppendText(filePath);
sr.Write("时间: ");
sr.WriteLine(DateTime.Now);
sr.Write("错误: ");
sr.WriteLine(ErrorMessage);
sr.Write("错误堆栈分析: ");
sr.WriteLine(ex.StackTrace);
sr.WriteLine("---------------------------------------------------");
}
}
else //如果文件不存在
{
if (!Directory.Exists(LogPath))
{
DirectoryInfo di = new DirectoryInfo(LogPath);
di.Create();
}
sr = File.CreateText(filePath);
sr.Write("时间: ");
sr.WriteLine(DateTime.Now);
sr.Write("错误: ");
sr.WriteLine(ErrorMessage);
sr.Write("错误堆栈分析: ");
sr.WriteLine(ex.StackTrace);
sr.WriteLine("---------------------------------------------------");
}
sr.Close();
}
public static void WriteLog(string errorMessage, LogTypeEnum logType = LogTypeEnum.Error3, params string[] paras)
{
WriteLog(string.Format(errorMessage, paras), logType);
}
4.调用写日志
在需要调用日志的地方将类的命名空间引入,并直接使用如下方法进行调用
LogManager.WriteLog("此处为错误信息", LogTypeEnum.Error3);
或在try…catch(Exception ex)中这样调用
return LogManager.WriteLog(ex, LogTypeEnum.Error3);
其他的调用方法类似,再此不在赘述。
5.总结
本文仅仅使用到配置文件对日志路径及错误等级进行配置,利用System.IO的文件读写操作进行日志输出。将日志输出进行了封装,方便调用。建议将LogManger放在独立的dll中封装,以便在需要的Dll中进行引用,避免Dll引用的依赖冲突。

这篇博客介绍了如何使用C#编写一个日志管理类LogManager,包括配置文件设置日志路径和类型,创建日志枚举,以及实现日志写入方法。通过缓存策略提升写入效率,根据日志等级配置控制输出。建议将LogManager封装到独立DLL以减少依赖冲突。

2589

被折叠的 条评论
为什么被折叠?



