2016-08-22 3 views
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. Что такое лучший командлет для очистки записей> 60 дней? Как представляется, командлет «delete» для записей в файле отсутствует. Я ожидал, что «если дата> 60 дней, а затем удалить функцию записи».
  3. Нужно ли добавить заголовок в текстовый файл?

ответ

0

Посмотрите на следующий код, чтобы читать из вашего комбинированного журнала, а затем отфильтровывать строки, находящиеся в пределах диапазона дат. Вы получаете объект DateTime из (get-date) .AddDays(); вы получаете объект 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 
    } 
} 
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 
+0

Благодаря Ansgar ..... работал отлично. Я понимаю, что поворот журналов будет вариантом, но есть моменты, когда нам нужно найти запись, и мы не знаем дату и должны будем искать каждый отдельный журнал. –

+0

FTR, поиск нескольких текстовых файлов в том же каталоге не намного сложнее, чем поиск одного файла, но что бы ни плавало на вашей лодке. –

Смежные вопросы