使用StreamWriter实现滚动日志,并从顶部删除

2023-12-21

我的 C# winforms 4.0 应用程序一直使用线程安全的流编写器来执行内部调试日志记录信息。当我的应用程序打开时,它会删除该文件并重新创建它。当应用程序关闭时,它会保存文件。

我想做的是修改我的应用程序,以便它进行附加而不是替换。这是一个简单的修复。

但是,这是我的问题:

我想将我的日志文件最大保留在 10 MB 左右。我的限制很简单。当您要关闭文件时,如果文件大于 10 MB,请修剪掉前 10%。

是否有“更好”的方法来执行以下操作:

  1. 关闭文件
  2. 检查文件是否 > 10 meg
  3. 如果有,请打开该文件
  4. 解析整个事情
  5. 剔除前 10%
  6. 将文件写回
  7. 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(使用前将#替换为@)

使用StreamWriter实现滚动日志,并从顶部删除 的相关文章

  • 更新面板工作速度非常慢

    我正在编写一个用户可以注册的应用程序 注册时 可以选择多个选项 并根据这些注册字段可见或不可见以及是否必需 我想出了一个想法 所有字段都将位于 updatePanel 中 当用户更改注册选项时 我将在服务器端设置这些字段的可见性 它可以工作
  • 在 HKCR 中创建新密钥有效,但不起作用

    我有以下代码 它返回 成功 但使用两种不同的工具使用搜索字符串 3BDAAC43 E734 11D5 93AF 00105A990292 搜索注册表不会产生任何结果 RegistryKey RK Registry ClassesRoot C
  • 尝试了解使用服务打开对话框

    我已经阅读了有关使用 mvvm 模式打开对话框的讨论 我看过几个使用服务的示例 但我不明白所有部分如何组合在一起 我发布这个问题寻求指导 以了解我应该阅读哪些内容 以更好地理解我所缺少的内容 我将在下面发布我所拥有的内容 它确实有效 但从我
  • Grpc - 将消息从一个客户端发送到连接到同一服务器的另一个客户端

    是否可以将消息从一个客户端发送到连接到同一服务器的另一个客户端 我想将数据从一个客户端发送到服务器然后发送到特定客户端 我想我需要获取客户端 ID 但我不知道如何获取此 ID 以及如何从服务器将此消息发送到该客户端 我这里有一个样本 这是一
  • 如何在类文件中使用 Url.Action() ?

    如何在 MVC 项目的类文件中使用 Url Action Like namespace 3harf public class myFunction public static void CheckUserAdminPanelPermissi
  • 按扩展名过滤搜索文件返回太多结果

    我正在开发一个 C 控制台应用程序 它必须管理 Windows 操作系统上的文件 我需要获取具有特定扩展名的文件名 列表 我找到了很多解决方案 最建议的是以下一种 HANDLE hFind WIN32 FIND DATA data hFin
  • 当事件button.click发生时,如何获取按钮名称/标签?

    我以编程方式制作按钮并将它们添加到堆栈面板中 以便每次用户导航到页面时按钮都会发生变化 我正在尝试做这样的事情 当我单击创建的按钮时 它将获取按钮的标签并转到正确的页面 但是 我无法使用 RoutedEventHandler 访问按钮元素
  • 传递 constexpr 对象

    我决定给予新的C 14的定义constexpr旋转并充分利用它 我决定编写一个小的编译时字符串解析器 然而 我正在努力保持我的对象constexpr将其传递给函数时 考虑以下代码 include
  • 无法注册时间触发的后台任务

    对于 Windows 8 应用程序 在 C Xaml 中 我尝试注册后台任务 很难说 但我想我的后台任务已正确注册 但是当我单击调试位置工具栏上的后台任务名称时 我的应用程序停止工作 没有任何消息 我查看了事件查看器上的日志 得到 具有入口
  • 如何在 C# Designer.cs 代码中使用常量字符串?

    如何在 designer cs 文件中引用常量字符串 一个直接的答案是在我的 cs 文件中创建一个私有字符串变量 然后编辑 Designer cs 文件以使用此变量 而不是对字符串进行硬编码 但设计者不喜欢这样抛出错误 我明白为什么这行不通
  • 如何使用 Regex.Replace 从字符串中删除数字?

    我需要使用Regex Replace从字符串中删除所有数字和符号 输入示例 123 abcd33输出示例 abcd 请尝试以下操作 var output Regex Replace input d string Empty The d标识符
  • 在 VS 中运行时如何查看 C# 控制台程序的输出?

    我刚刚编写了一个名为 helloworld 的聪明程序 它是一个 C NET 4 5 控制台应用程序 在扭曲的嵌套逻辑迷宫深处 使用了 Console WriteLine 当我在命令行运行它时 它会运行并且我会看到输出 我可以执行其他命令并
  • memcpy/memmove 到联合成员,这是否设置“活动”成员?

    重要说明 一些评论者似乎认为我是从工会抄袭的 仔细看memcpy 它从普通旧地址复制uint32 t 它不包含在联合中 另外 我正在复制 通过memcpy 到工会的特定成员 u a16 or u x in a union 不直接到整个联盟本
  • 模板类中的无效数据类型生成编译时错误?

    我正在使用 C 创建一个字符串类 我希望该类仅接受数据类型 char 和 wchar t 并且我希望编译器在编译时使用 error 捕获任何无效数据类型 我不喜欢使用assert 我怎样才能做到这一点 您可以使用静态断言 促进提供一个 ht
  • 如何解压 msgpack 文件?

    我正在将 msgpack 编码的数据写入文件 在编写时 我只是使用 C API 的 fbuffer 如 我为示例删除了所有错误处理 FILE fp fopen filename ab msgpack packer pk msgpack pa
  • 将 Lambda 表达式树与 IEnumerable 结合使用

    我一直在尝试了解有关使用 Lamba 表达式树的更多信息 因此我创建了一个简单的示例 这是代码 如果作为 C 程序粘贴到 LINQPad 中 它可以工作 void Main IEnumerable
  • 代码中的.net Access Forms身份验证“超时”值

    我正在向我的应用程序添加注销过期警报 并希望从我的代码访问我的 web config 表单身份验证 超时 值 我有什么办法可以做到这一点吗 我认为您可以从 FormsAuthentication 静态类方法中读取它 这比直接读取 web c
  • 是否允许全局静态标识符以单个 _ 开头?

    换句话说 可能static 文件范围 全局变量恰好以一个下划线开头 而不会产生与 C 实现发生名称冲突的可能性 https www gnu org software libc manual html node Reserved Names
  • MySqlConnectionStringBuilder - 使用证书连接

    我正在尝试连接到 Google Cloud Sql 这是一个 MySql 解决方案 我能够使用 MySql Workbench 进行连接 我如何使用 C 连接MySqlConnectionStringBuilder 我找不到提供这三个证书的
  • 如何在 C 中将 char 连接到 char* ?

    我怎样才能前置char c to char myChar 我有c值为 A and myChar值为 LL 我怎样才能前置c to myChar使 ALL 这应该有效 include

随机推荐

  • ORDER_BY 日期 LIMIT 1 [重复]

    这个问题已经存在了 我有一个名为 notify 的表 其中包含 寻求者 捐赠者 日期 列 datetime 类型的日期列 它存储以下格式 YYYY MM DD HH MM SS我正在尝试从通知表中选择具有最新日期的 1 条记录 然后将该日期
  • WPF Datagrid selectitem = MVVM 中的 null

    我正在尝试使用 MVVM 模式来处理数据网格 问题是 每当我将绑定到 SelectedItem 的 VM 属性更改为 null 时 视图不会 取消选择 当前选定的项目 这是我在 xaml 中的绑定
  • 如何查找页面中的所有元素

    我知道有两种方法可以找到页面中的所有元素 document getElementsByTagName and document all 有更好的方法还是其中最好的方法之一 我正在制作一个元素选择器 主要用于练习 我想知道获取页面中所有元素的
  • 使用分类数据的Python堆积条形图

    我有一个 Pandas 数据框 1800 obs 看起来像这样 A B C D 1 CL0 CL1 CL2 CL0 2 CL2 CL1 CL1 CL3 3 CL3 CL2 CL0 CL1 n CL2 CL1 CL0 CL3 我想创建一个堆叠
  • 映射到 PetaPoco 中的集合?

    有没有办法将以下内容映射到Dictionary
  • 如何将“无”分配给 std::Optional

    阅读有关std optional http en cppreference com w cpp utility optional 我对分配值的标准方法感到困惑某物 and nothing to an optional I guess ope
  • 字典(键,值)顺序

    假设我有以下代码 var dictionary cat 2 dog 4 snake 8 mutable dictionary var keys dictionary keys var values dictionary values for
  • 良好的 Haskell 编码标准

    有人可以提供一个良好的 Haskell 编码标准的链接吗 我发现了this http urchin earth li ian style haskell html and this http www haskell org haskellw
  • 如何从 Linux x64 主机到 Linux arm64 交叉构建 flutter 应用

    我正在尝试从 linux x64 编译到 linux arm64 当我打字时flutter build linux target platform linux arm64我收到此错误 Cross build from Linux x64 h
  • PHP 星期几数字到星期几文本

    这可能真的很简单 但我找不到 PHP 函数来做到这一点 OK so dow numeric date w 给出星期几的数字 0 6 表示星期日到星期六 And dow text date D 给出文本星期几的 3 个字母缩写 Sun Mon
  • 将 ggplot 保存在函数中

    我正在尝试使用图形设备在函数中保存 ggplot 但我发现代码生成空图 下面是一个非常非常简单的例子 library ggplot2 ff lt function jpeg a jpg qplot 1 20 1 20 dev off ff
  • 怎样才能让海龟认出一个圆圈呢?

    我正在尝试使用 Turtle Graphics 制作一个 Python 程序 在矩形内绘制两个重叠的圆圈 如维恩图 并在维恩图上绘制随机点 我已经成功地做到了这一点 但现在我想让程序识别一个点是在其中一个圆中还是在维恩图的交点中 然后我想根
  • 当两个路径可能是相对的时,将路径与 Windows API 结合起来

    我需要能够将两个不同的 Windows 路径 这两个路径都可能是相对的 组合成一个路径 通过将第二个路径应用为第一个路径的扩展 文件系统上是否实际存在任何一条路径都无关紧要 例子 C abc def gt C abc def C abc d
  • 在编写 Tkinter 文本小部件时更新它,而不是在课程结束后更新

    我陷入困境 因为这是在机密机器上编写的 所以我无法在此处复制 粘贴 作为一个新手 我的方法可能是非正统的 我有一个用 Tkinter 编写的 GUI 带有几个按钮 每个按钮都链接到一个类 该类实际上运行一个简短的脚本 单击按钮时 我初始化一
  • redux-saga:对回调返回做出反应的 eventChannel 和侦听器

    在反应原生中后处理程序 https facebook github io react native docs backhandler侦听器对回调函数做出反应并采取适当的行动 我需要读取我的商店并根据它返回 true 或 false 但我无法
  • 在 Swift 中逐行淡入 UITableViewCell

    我是 swift 的新手 我试图拥有一个 UITableView 并且单元格将被动画化以一一出现 我怎样才能做到这一点 另外 如果新出现的单元格行不在屏幕上 隐藏在表格下方 当每个单元格出现时如何向上移动表格 var tableData1
  • 创建效果 上滑时顶部图片被内容覆盖

    I have to create an effect like in the images but I don t know how to do it and also don t know how to call this effect
  • SQL 语句中文字前面的冒号是什么意思?

    使用 在变量之前 例如 userId在这段代码中 public function removeUser userId command Yii app gt db gt createCommand command gt delete tbl
  • AX 形式的图像

    在 Dynamics AX 中 我们在自定义表单中出于各种目的使用大量图像和图标 目前 我们必须在每台客户端计算机上单独安装图像 图标包才能使一切正常工作 有没有一种方法 或最佳实践 来处理 Dynamics 中的图像和图标 这样就不需要在
  • 使用StreamWriter实现滚动日志,并从顶部删除

    我的 C winforms 4 0 应用程序一直使用线程安全的流编写器来执行内部调试日志记录信息 当我的应用程序打开时 它会删除该文件并重新创建它 当应用程序关闭时 它会保存文件 我想做的是修改我的应用程序 以便它进行附加而不是替换 这是一