Форум программистов, компьютерный форум, киберфорум
PowerShell
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 06.03.2013
Сообщений: 32
1

Ошибка при чтении лог-файла командой Get-Content с выставленным ReadCount

16.11.2018, 11:56. Показов 889. Ответов 1

Author24 — интернет-сервис помощи студентам
Доброго дня!

Написал скрипт для подсчёта количества строк в лог-файле, совпадающих с шаблоном и записанных в лог в определённое время (в последний час с момента запуска скрипта).
Файл, по которому производится поиск, большой (пиковый объём информации - 600 МБ или 4,5 млн строк). Пример содержимого файла ниже:
PowerShell
1
2
2018-11-16 00:00:00 [103] INFO  - text1
2018-11-16 00:00:00 [103] INFO  - text2 success. text3
Текст скрипта:
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$file = "D:\logs\logfile.txt" # Файл, по которому производится поиск
$currentdatetime = Get-Date -Format "yyyy-MM-dd HH:mm:ss" # Фиксируем время начало работы скрипта
$resultfile = "D:\STATISTICS\result.txt" # Файл, в который будет выведен результат
[int]$counter = 0 # Число совпадений с шаблоном
$getfile = gc $file -ReadCount 500 # Чтение файла
foreach ($line in $getfile) {
    [DateTime]$stringdatetime = [DateTime]::ParseExact($line.substring(0, 19), "yyyy-MM-dd HH:mm:ss", $null)
    $TimeDiff = New-TimeSpan -Start $stringdatetime -End $currentdatetime
    if ($TimeDiff.TotalMinutes -lt 60 -and $line -like "*success*") {
        $counter++;
    } 
} #end foreach
$currentdatetime2 = Get-Date -Format "HH:mm:ss" # Фиксируем время окончания работы скрипта
"$counter Start: $currentdatetime Finish: $currentdatetime2" | Out-File $resultfile # Выводим результат в файл
После выполнения скрипта в консоли ошибка, которая повторяется много раз:
PowerShell
1
2
3
4
5
6
Exception calling "ParseExact" with "3" argument(s): "String was not recognized as a valid DateTime."
At D:\STATISTICS\Untitled1.ps1:7 char:5
+     [DateTime]$stringdatetime = [DateTime]::ParseExact($line.substrin ...
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : FormatException
У меня есть другие версии решения задачи (например, с помощью чтения файла лога методами .NET или Get-Content без указания Read-Count) и в тех случаях данная ошибка не наблюдается. Но по быстродействию эти способы значительно проигрывают.
Просьба помочь с устранением ошибки в работе этого скрипта.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.11.2018, 11:56
Ответы с готовыми решениями:

Ошибка при чтении файла
Всем привет. Пытаюсь считать из файла, который программно не создаю, создаю на диске и прописываю...

Ошибка при чтении файла
Необработанное исключение по адресу 0x0FE4172C (msvcp140d.dll) в .exe: 0xC0000005: нарушение прав...

Ошибка при чтении из файла
Файл открывается, но читаться из него информация не хочется. Исходник int c_array ::...

ошибка при чтении из файла
void bin_kn(opisanie *beg_kn, int n, str_f f_kn) { FILE *f = fopen("books.bin", f_kn ==...

1
1885 / 1107 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
17.11.2018, 02:05 2
Цитата Сообщение от Николай Владисл Посмотреть сообщение
Написал скрипт для подсчёта количества строк в лог-файле, совпадающих с шаблоном
Цитата Сообщение от Николай Владисл Посмотреть сообщение
Exception calling "ParseExact" with "3" argument(s): "String was not recognized as a valid DateTime."
Судя по этому у вас попадаются строки не начинающиеся с "yyyy-MM-dd HH:mm:ss". Если это так, то будет разумно, прежде чем преобразовывать первые 20 символов в [DateTime], вовсе не выбирать такие строки.

Добавлено через 39 минут
если я правильно понял что вам нужно, тогда это можно сделать примерно так:

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
$file = "D:\logs\logfile.txt"
$resultfile = "D:\STATISTICS\result.txt"
 
$CurrentDateTime = date
[int]$counter = 0
 
foreach ($block in gc $file -r 500)
{
    $counter += ($block | sls '^(\d{4}-\d+-\d+ [\w:]+) .+ success' | ? {($CurrentDateTime - (date $_.Matches.Groups[1].Value)).TotalMinutes -lt 60} | Measure-Object).Count
}
 
"$counter Start: $(date $CurrentDateTime -f 'yyyy-MM-dd HH:mm:ss') Finish: $(date -f 'HH:mm:ss')" | sc $resultfile

И ещё я обратил внимание, что ваш скрипт считывает всё содержимое файла (блоками по 500 строчек) в переменную, т.е. -ReadCount 500 используется не для экономии памяти, но в этой переменной получается массив из текстовых блоков по 500 строчек каждый, что является странным решением. И далее, в $line попадают эти самые блоки из 500 строк...
0
17.11.2018, 02:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.11.2018, 02:05
Помогаю со студенческими работами здесь

Ошибка при чтении файла
uses crt; var d: char; {a,Val,a1,}s, u: string; a3:array of string; f: Text; I: integer;...

Ошибка при чтении из файла
программа выполняется записывает и читает из файла но вылетает непонятная ошибка Вызвано...

Ошибка при чтении из файла
Ошибка при чтении записей из файла. Кто знает почему?? Все перепробовал:wall:

ошибка при чтении файла
Создать файл F целого типа. Получить два файла: F1, F2. В файл F1 последовательно писать четные...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru