我的 C# winforms 4.0 应用程序一直使用线程安全的流编写器来执行内部调试日志记录信息。当我的应用程序打开时,它会删除该文件并重新创建它。当应用程序关闭时,它会保存文件。
我想做的是修改我的应用程序,以便它进行附加而不是替换。这是一个简单的修复。
但是,这是我的问题:
我想将我的日志文件最大保留在 10 MB 左右。我的限制很简单。当您要关闭文件时,如果文件大于 10 MB,请修剪掉前 10%。
是否有“更好”的方法来执行以下操作:
- 关闭文件
- 检查文件是否 > 10 meg
- 如果有,请打开该文件
- 解析整个事情
- 剔除前 10%
- 将文件写回
- Close
编辑:好吧,我最终推出了自己的(如下所示),公开转移到 Log4Net 的建议是一个很好的建议,但是学习新库并将我的所有日志语句(数千条)移过去所花费的时间并不是很好对于我试图做的小改进来说,时间是有效的。
private static void PerformFileTrim(string filename)
{
var FileSize = Convert.ToDecimal((new System.IO.FileInfo(filename)).Length);
if (FileSize > 5000000)
{
var file = File.ReadAllLines(filename).ToList();
var AmountToCull = (int)(file.Count * 0.33);
var trimmed = file.Skip(AmountToCull).ToList();
File.WriteAllLines(filename, trimmed);
}
}
我研究过一次,但从未想出任何办法,但我可以在这里为您提供 B 计划:
我使用下面的选择来保留最多 3 个日志文件。首先,创建并附加日志文件 1。当超过 maxsize 时,将创建日志 2 和稍后的日志 3。当日志 3 太大时,日志 1 将被删除,其余日志将被压入堆栈。
string[] logFileList = Directory.GetFiles(Path.GetTempPath(), "add_all_*.log", SearchOption.TopDirectoryOnly);
if (logFileList.Count() > 1)
{
Array.Sort(logFileList, 0, logFileList.Count());
}
if (logFileList.Any())
{
string currFilePath = logFileList.Last();
string[] dotSplit = currFilePath.Split('.');
string lastChars = dotSplit[0].Substring(dotSplit[0].Length - 3);
ctr = Int32.Parse(lastChars);
FileInfo f = new FileInfo(currFilePath);
if (f.Length > MaxLogSize)
{
if (logFileList.Count() > MaxLogCount)
{
File.Delete(logFileList[0]);
for (int i = 1; i < MaxLogCount + 1; i++)
{
Debug.WriteLine(string.Format("moving: {0} {1}", logFileList[i], logFileList[i - 1]));
File.Move(logFileList[i], logFileList[i - 1]); // push older log files back, in order to pop new log on top
}
}
else
{
ctr++;
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)