【问题标题】:Deleting records from a log/text file从日志/文本文件中删除记录
【发布时间】:2016-08-23 04:05:37
【问题描述】:

我有几台笔记本电脑正在为一个进程生成 txt 文件的日常活动日志。我已经想出了如何编写脚本以每天将日志附加到一个主文件中,但现在我担心文件大小。我想在我的主文件中保留 60 天的滚动数据。

这是我的数据格式:

2016-06-23T04:02:33,JE5030UA,88011702312014569339,0000000034626,01451560610600980

使用Get-Date.AddDays(-60) 我可以获得截止日期,但它是MM/dd/yyy 格式。

如果我设置一个变量来获取与我的文件格式相同的日期 (Get-Date -format 'yyyyMMdd),我不能使用 .AddDays() 方法来获取截止日期。

这就是我到目前为止所走的路。我会包括代码,但那里没有太多。附加文件的脚本非常简单。我不敢相信清除旧记录如此困难。

我的问题:

  1. 我在日期问题上遗漏了什么?
  2. 清除记录 > 60 天的最佳 cmdlet 是什么?文件中的记录似乎没有“删除”cmdlet。我期待一个“如果日期 > 60 天,则删除记录”的功能。
  3. 是否需要在文本文件中添加标题?

【问题讨论】:

    标签: powershell powershell-3.0


    【解决方案1】:

    查看以下代码以从您的组合日志中读取数据,然后过滤掉您的日期范围内的行。你从 (get-date).AddDays(); 得到一个 DateTime 对象。您从文件中的时间戳中获取 DateTime 对象,然后您可以比较它们。无论如何,这是一种方法。

     $cutoffDate = (get-date).AddDays(-60);
    
     $fileContents = get-content C:\your\path\combinedLog.txt
    
     foreach($line in $fileContents)
     {
         write-host "Current line = $line"
         $words = $line.Split(',')
         $date=get-date $words[0];
         write-host "Date of line = $date"
         if($date -gt $cutoffDate)
         {
            # Append $line to your trimmed log
         }
     }
    

    【讨论】:

      【解决方案2】:

      由于您使用的是 ISO 日期格式,因此您可以相应地删除早于给定截止日期 formatting 截止日期的记录,并将每行的第一个字段与之进行比较:

      $file   = 'C:\path\to\your.log'
      $cutoff = (Get-Date).AddDays(-60).ToString('yyyy-MM-dd\THH:mm:ss')
      
      (Get-Content $file) |
          Where-Object { $_.Split(',')[0] -ge $cutoff } |
          Set-Content $file
      

      但是,轮换日志通常比清除单个文件更好。每天将您的日志写入不同的文件,例如像这样:

      ... | Set-Content "C:\path\to\master_$(Get-Date -f 'yyyyMMdd).log"
      

      因此您可以在日志的最后修改日期之前简单地删除它们:

      $cutoff = (Get-Date).AddDays(-60)
      
      Get-ChildItem 'C:\log\folder\master_*.log' |
          Where-Object { $_.LastWriteTime -lt $cutoff } |
          Remove-Item
      

      【讨论】:

      • 感谢 Ansgar .....工作得很好。我知道轮换日志是一种选择,但有时我们需要查找记录而我们不知道日期,因此必须继续搜索每个单独的日志。
      • FTR,在同一个目录中搜索多个文本文件并不比搜索单个文件难得多,但不管你的船是什么。