【问题标题】:Can I remove/clear some content from a txt file without retrieving the content first?我可以在不先检索内容的情况下从 txt 文件中删除/清除某些内容吗?
【发布时间】:2014-04-08 01:39:03
【问题描述】:

对于我想在这里做的事情,我可能会走上完全错误的道路,所以请随时提出更好的选择/解决方案。

我有一堆 PowerShell 脚本,它们都有自己的日志文件。日志记录是通过单独的函数文件中的函数完成的。我希望在文件达到一定大小时开始删除日志中最旧的行,以免文件变得太大。

我的问题是如何删除最旧的行。我不喜欢使用“Get-Content”的想法,删除顶行,然后使用“Set-Content”将日志文件替换为相同的日志减去顶行,然后重复直到日志低于指定最大尺寸。

例如:

While ((Get-ChildItem $LogFile).Length -gt $MaxLogSize)
{
    $TopLine,$Remainder = Get-Content $LogFile
    Set-Content -Value $Remainder -Path $LogFile
}

这显然不够,因为它必须将整个日志放入一个变量中,然后再将其放回日志文件中。

我想知道 PowerShell 是否可以简单地删除日志文件中的第一行并重复该操作直到文件小于最大文件大小?我知道有“清除内容”cmdlet,但据我所知,这只会清除整个文件。

【问题讨论】:

  • 我不认为我见过这种日志记录行为,并且希望程序在旧日志文件达到大小/年龄限制时创建一个新日志文件。每小时/每天/每周都有一个新的日志文件,您还可以选择要保留的“哪些”数据,而不仅仅是“多少”。您是否已经考虑并拒绝创建新日志并使用单独的脚本删除旧日志?
  • 为什么不使用像 NLog 或 log4net 这样的日志框架呢?在 PowerShell 中使用它们非常简单,并且两个框架都提供了处理日志文件的策略。
  • @TessellatingHeckler 环形缓冲区是在 60 年代发明的。有关此类日志记录的实际示例,Windows XP/2003 使用了一个用于任务计划程序。

标签: powershell logging


【解决方案1】:

您所描述的更广为人知的是ring buffer,也称为循环或循环缓冲区。

为了实现这样的系统,有几种方法。您的日志条目是固定长度的吗?如果是,则通过将行大小乘以行数来计算更新位置就足够简单了。

通常日志行的长度不同,因此您必须读取日志文件并计算换行符(或作为记录分隔符获得的任何内容)才能找到要写入的位置。

唯一的问题是如何存储日志写入点。一些实现将其存储为日志的第一行,一些将其保存在内存中并通过读取日志文件一次并查找最旧的条目来对其进行初始化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-27
    • 2020-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多