从日志/文本文件中删除记录

时间:2016-08-22 19:10:02

标签: powershell powershell-v3.0

我有几台笔记本电脑正在为进程转换为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. 清除记录的最佳cmdlet是什么> 60天?似乎并没有删除'用于文件中记录的cmdlet。我期待着' if date> 60天,然后删除记录'一种功能。
  3. 我是否需要在文本文件中添加标题?

2 个答案:

答案 0 :(得分:0)

查看以下代码以从组合日志中读取,然后过滤掉日期范围内的行。你从(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
     }
 }

答案 1 :(得分:0)

由于您使用的是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