Разбор слов по составу
Разбор слова по составу
Тип лингвистического анализа, в результате которого определяется структура слова, а также его состав, называется морфемным анализом.
Виды морфем
В русском языке используются следующие морфемы:
— Корень. В нем заключается значение самого слова. Слова, у которых есть общий корень, считаются однокоренными. Иногда слово может иметь два и даже три корня.
— Суффикс. Обычно идет после корня и служит инструментом для образования других слов. К примеру, «гриб» и «грибник». В слове может быть несколько суффиксов, а может не быть совсем.
— Приставка. Находится перед корнем. Может отсутствовать.
— Окончание. Та часть слова, которая изменяется при склонении или спряжении.
— Основа. Часть слова, к которой относятся все морфемы, кроме окончания.
Важность морфемного разбора
В русском языке разбор слова по составу очень важен, ведь нередко для правильного написания слова необходимо точно знать, частью какой морфемы является проверяемая буква.
Пример
В качестве примера можно взять два слова: «чёрный» и «червячок». Почему в первом случае на месте ударной гласной мы пишем «ё», а не «о», как в слове «червячок»? Нужно вспомнить правило написания букв «ё», «е», «о» после шипящих, стоящих в корне слова. Если возможно поменять форму слова либо подобрать родственное ему так, чтобы «ё» чередовалась с «е», тогда следует ставить букву «ё» (чёрный — чернеть). Если чередование отсутствует, тогда ставится буква «о» (например, чокаться, шорты).
В случае же со словом «червячок» «-ок-» — это суффикс. Правило заключается в том, что в суффиксах, если стоящая после шипящих букв гласная находится под ударением, всегда пишется «о» (зрачок, снежок), в безударном случае — «е» (платочек, кармашек).
Как разобрать слово по составу
Для помощи начинающим существуют морфемно-орфографические словари. Можно выделить книги таких авторов, как Тихонов А.Н.
, Ожегов С.И., Рацибурская Л.В.В любом слове непременно должны присутствовать корень и основа. Остальных морфем может и не быть. Иногда слово целиком может состоять из корня (или основы): «гриб», «чай» и т.д.
Этапы морфемного анализа
Чтобы морфемный разбор слов было легче осуществить, следует придерживаться определенного алгоритма:
— Сначала нужно определить часть речи, задав вопрос к слову. Для прилагательного это будет вопрос «какой?», для существительного — «что?» или «кто?».
— Затем нужно выделить окончание. Чтобы его найти, слово нужно просклонять по падежам, если часть речи это позволяет. Например, наречие изменить никак нельзя, поэтому у него не будет окончания.
— Далее нужно выделить основу у слова. Все, кроме окончания, — основа.
— Потом следует определить корень, подобрав родственные однокоренные слова.
Особенности разбора
Иногда подход к морфемному разбору в программах университета и школы может отличаться. Во всех случаях различия аргументированы и имеют право на существование. Поэтому стоит ориентироваться на морфемный словарь, рекомендованный в конкретном учебном заведении.
Только что искали: кедрна сейчас мордашка сейчас с м е х а сейчас норндей сейчас ц н а г е л 1 секунда назад т о в а р 1 секунда назад источник 1 секунда назад натюрморт 2 секунды назад ыротоскт 2 секунды назад сенатб 2 секунды назад скочтор 2 секунды назад рокаобк 2 секунды назад чарабык 2 секунды назад б о р о н о к м 2 секунды назад к п а и с л р а ь 2 секунды назад
Слова «полях» морфологический и фонетический разбор
Объяснение правил деление (разбивки) слова «полях» на слоги для переноса.
Онлайн словарь Soosle.ru поможет: фонетический и морфологический разобрать слово «полях» по составу, правильно делить на слоги по провилам русского языка, выделить части слова, поставить ударение, укажет значение, синонимы, антонимы и сочетаемость к слову «полях».
Содержимое:
- 1 Слоги в слове «полях» деление на слоги
- 2 Как перенести слово «полях»
- 3 Морфологический разбор слова «полях»
- 4 Разбор слова «полях» по составу
- 5 Сходные по морфемному строению слова «полях»
- 6 Синонимы слова «полях»
- 7 Ударение в слове «полях»
- 8 Фонетическая транскрипция слова «полях»
- 9 Фонетический разбор слова «полях» на буквы и звуки (Звуко-буквенный)
- 10 Предложения со словом «полях»
- 11 Сочетаемость слова «полях»
- 12 Значение слова «полях»
- 13 Как правильно пишется слово «полях»
- 14 Ассоциации к слову «полях»
Слоги в слове «полях» деление на слоги
Количество слогов: 2
По слогам: по-лях
Как перенести слово «полях»
по—лях
Морфологический разбор слова «полях»
Часть речи:
Имя существительное
Грамматика:
часть речи: имя существительное;
одушевлённость: одушевлённое;
род: женский;
число: множественное;
падеж: предложный;
остальные признаки: имя;
отвечает на вопрос: (говорю/думаю) О ком?
Начальная форма:
поля
Разбор слова «полях» по составу
пол | корень |
е | окончание |
поле
Сходные по морфемному строению слова «полях»
Сходные по морфемному строению слова
Синонимы слова «полях»
1.
Ударение в слове «полях»
поля́х — ударение падает на 2-й слог
Фонетическая транскрипция слова «полях»
[пал’`ах]
Фонетический разбор слова «полях» на буквы и звуки (Звуко-буквенный)
Буква | Звук | Характеристики звука | Цвет |
---|---|---|---|
п | [п] | согласный, глухой парный, твёрдый, шумный | п |
о | [а] | гласный, безударный | о |
л | [л’] | согласный, звонкий непарный (сонорный), мягкий | л |
я | [`а] | гласный, ударный | я |
х | [х] | согласный, глухой непарный, твёрдый, шумный | х |
Число букв и звуков:
На основе сделанного разбора делаем вывод, что в слове 5 букв и 5 звуков.
Буквы: 2 гласных буквы, 3 согласных букв.
Звуки: 2 гласных звука, 3 согласных звука.
Предложения со словом «полях»
Формируется концепция многофункционального шлема с широким полем зрения в дневных и ночных условиях.
Владимир Пономаренко, Смысл авиации 5-го поколения, 2016.
Так могло бы выглядеть огромное поле боя, покрытое воронками и свежими ранами войны.
Макс Брэнд, Ночной всадник.
Если на плод женского пола действует мужской половой гормон тестостерон, рождённая девочка может обладать сильными, волевыми и, что значительно хуже, мужеподобными свойствами характера.
Елена Ризо, Выбираем имя малышу, 2012.
Сочетаемость слова «полях»
1. мужской пол
2. женский пол
3. противоположный пол
4. поле боя
5. поле битвы
6. от пола до потолка
7. представители сильного пола
8. представительницы прекрасного пола
9. плиты пола
10. поле исчезло
11. коснулась пола
12. полы развевались
13. спать на полу
14. лежать на полу
15. сидеть на полу
16. (полная таблица сочетаемости)
17. мужской пол
18. женский пол
19. противоположный пол
20. поле боя
21. поле битвы
22. от пола до потолка
23. представители сильного пола
24. представительницы прекрасного пола
25. плиты пола
26. поле исчезло
27. коснулась пола
28. полы развевались
29. спать на полу
30. лежать на полу
31. сидеть на полу
32. (полная таблица сочетаемости)
33. мужской пол
34. женский пол
35. противоположный пол
36. из поля зрения
37. поле боя
38. поле битвы
39. на краю поля
40. представители сильного пола
41. представительницы прекрасного пола
42. поле исчезло
43. коснулась пола
44. полы развевались
45. спать на полу
46. лежать на полу
47. сидеть на полу
48. (полная таблица сочетаемости)
Значение слова «полях»
ПОЛ1 , -а (-у), предл. о по́ле, на полу́, мн. полы́, м. Нижний настил в помещении, по которому ходят. Деревянный пол. Паркетный пол. От пола до потолка. Вымыть пол. Упасть на́ пол.
ПОЛ2 , -а, мн. по́лы, -о́в, м. Совокупность признаков организма, обеспечивающих размножение, по которым различаются мужские и женские особи, а также один из двух разрядов живых существ (мужчин и женщин, самцов и самок), различающихся по этим признакам. Лица обоего пола. Указать пол и возраст в анкете. (Малый академический словарь, МАС)
Как правильно пишется слово «полях»
Правильно слово пишется:
Нумерация букв в слове
Номера букв в слове «полях» в прямом и обратном порядке:
Ассоциации к слову «полях»
Пшеница
Луга
Зрение
Пометка
Виноградник
Генератор
Колос
Посев
Шляпа
Урожай
Ягода
Пастбище
Кукуруза
Гольф
Сорняк
Пашня
Тяготение
Заграждение
Плуг
Электрон
Земледелец
Изгородь
Сражение
Леса
Луг
Удобрение
Магнитная
Деревенька
Огород
Роща
Шляпка
Рощица
Плазма
Заметка
Вектор
Кромка
Овёс
Саранча
Уравнение
Стог
Тростник
Гравитация
Засуха
Конфигурация
Трактор
Борозда
Магнитный
Минный
Рисовый
Электромагнитный
Гравитационный
Силовой
Кукурузный
Пшеничный
Загнутый
Квантовый
Защитный
Плодородный
Бескрайний
Колхозный
Картофельный
Заснеженный
Окрестный
Фермерский
Удалённый
Соломенный
Энергетический
Хлебный
Проволочный
Холмистый
Футбольный
Ледовый
Создаваемый
Тучный
Посадочный
Турнирный
Игровой
Электрический
Ухоженный
Зеленеть
Расстилаться
Пастись
Обвиснуть
Обрабатывать
Простираться
Раскинуться
Перемежаться
Бранить
Маскировать
Пахать
Опустошать
Обработать
Пестреть
Огородить
Нахлобучить
Выжечь
Выращивать
Надвинуть
Вне
Посреди
Open Sourcing Parsing
Мы рады объявить о выпуске 0. 1.0 Parsing, библиотеки для преобразования туманных данных в хорошо структурированные данные. Он был создан на основе содержания 21 эпизода (10 часов), в которых мы показываем, как создать библиотеку синтаксического анализа с нуля, уделяя особое внимание композиции, производительности и универсальности:
Состав : Способность разбивать большие и сложные задачи разбора на более мелкие и простые. И возможность брать небольшие простые парсеры и легко объединять их в более крупные и сложные.
Производительность : Парсеры, состоящие из множества мелких частей, должны работать так же хорошо, как хорошо настроенные, написанные от руки парсеры.
Универсальность : Возможность анализа любых входных данных в любых выходных данных. Это позволяет вам выбирать, с какими уровнями абстракции вы хотите работать, в зависимости от того, какая производительность вам нужна или какую точность вы хотите гарантировать. Например, вы можете написать хорошо настроенный синтаксический анализатор для коллекций единиц кода UTF-8, и он будет автоматически подключаться к синтаксическим анализаторам строк, массивов, небезопасных указателей буфера и многого другого.
Мотивация
Синтаксический анализ — удивительно распространенная проблема в программировании. Мы можем определить синтаксический анализ как попытку взять более туманный блок данных и преобразовать его во что-то более хорошо структурированное. Стандартная библиотека Swift поставляется с несколькими парсерами, которые мы используем каждый день. Например, есть инициализаторы Int
, Double
и даже Bool
, которые пытаются анализировать числа и логические значения из строк:
Int("42") // 42 Int("Привет") // ноль Двойной ("123,45") // 123,45 Double("До свидания") // ноль Bool("истина") // истина Bool("0") // ноль
И есть такие типы, как JSONDecoder
и PropertyListDecoder
, которые пытаются анализировать Decodable
-согласованные типы из данных:
try JSONDecoder(). decode(User.self, from: data) попробуйте PropertyListDecoder().decode(Settings.self, from: data)
В то время как синтаксические анализаторы есть повсюду в Swift, у Swift нет целостной истории для синтаксического анализа. Вместо этого мы обычно анализируем данные в произвольном порядке, используя ряд несвязанных инициализаторов, методов и других средств. И это, как правило, приводит к менее удобному для сопровождения и менее пригодному для повторного использования коду.
Эта библиотека предназначена для написания такой истории для разбора в Swift. В нем представлена единая единица синтаксического анализа, которую можно комбинировать интересными способами для формирования больших и сложных синтаксических анализаторов, которые могут решать проблемы программирования, которые вам необходимо решить, удобным для сопровождения способом.
Начало работы
Предположим, у вас есть строка, содержащая некоторые пользовательские данные, которые вы хотите разобрать на массив User
s:
var input = """ 1, капля, правда 2, Блоб младший, ложь 3, Блоб-старший, правда """ структура пользователя { идентификатор переменной: Int имя переменной: строка var isAdmin: Логический }
Наивным подходом к этому было бы вложенное использование . split(separator:)
, а затем небольшая дополнительная работа по преобразованию строк в целые числа и логические значения:
let users = input .split(разделитель: "\n") .compactMap {строка -> Пользователь? в пусть поля = row.split (разделитель: ",") сторожить поля.количество == 3, пусть идентификатор = Int (поля [0]), пусть isAdmin = Bool (строка (поля [2])) иначе { вернуть ноль } вернуть пользователя (идентификатор: идентификатор, имя: строка (поля [1]), isAdmin: isAdmin) }
Этот код не только немного запутан, но и неэффективен, поскольку мы выделяем массивы для .split
, а затем сразу же отбрасываем эти значения.
Вместо этого было бы более просто и эффективно описать, как потреблять биты с начала ввода и преобразовывать их в пользователей. Это то, в чем эта библиотека парсера превосходна 😄.
Мы можем начать с описания того, что значит анализировать одну строку, сначала анализируя целое число в начале строки, а затем анализируя запятую, которую мы отбрасываем, используя . skip
оператор:
пусть пользователь = Int.parser() .скип (Начинается с ("","))
Уже это может потреблять начало ввода:
user.parse(&input) // => 1 input // => "Blob,true\n2,Blob Jr.,false\n3,Blob Sr.,true"
Далее мы хотим взять все до следующей запятой для имени пользователя, а затем пропустить запятую:
let user = Int.parser() .скип (Начинается с ("",")) .take(PrefixWhile {$0!= ","}) .скип (Начинается с ("","))
Здесь оператор .take
объединил проанализированные значения в кортеж (Int, Substring)
.
Затем мы хотим взять логическое значение в конце строки для статуса администратора пользователя:
let user = Int.parser() .скип (Начинается с ("",")) .take(PrefixWhile {$0!= ","}) .скип (Начинается с ("",")) .take(Bool.parser())
В настоящее время это будет анализировать кортеж (Int, Substring, Bool)
из ввода, и мы можем .map
, чтобы превратить его в пользователя
:
let user = Int. parser() .скип (Начинается с ("",")) .take(PrefixWhile {$0!= ","}) .скип (Начинается с ("",")) .take(Bool.parser()) .map {Пользователь (id: $0, имя: String ($1), isAdmin: $2) }
Этого достаточно, чтобы проанализировать одного пользователя из входной строки:
user.parse(&input) // => User(id: 1, name: "Blob", isAdmin: true) input // => "\n2,Клякса младший,false\n3,Кляпка старший,true"
Чтобы проанализировать несколько пользователей из ввода, мы можем использовать Многие
парсер:
пусть пользователи = Многие(пользователь, разделитель: StartsWith("\n")) user.parse(&input) // => [Пользователь(id: 1, name: "Blob", isAdmin: true), …] ввод // => ""
Теперь этот синтаксический анализатор может обрабатывать весь документ пользователей, а его код проще и понятнее, чем версия, использующая .split
и .compactMap
.
Более того, он более производительный. Мы написали тесты для этих двух стилей синтаксического анализа, и . split
-стиль парсинга более чем в два раза медленнее:
name time std итерации -------------------------------------------------- ---------------- README Example.Parser: Подстрока 3426 000 нс ± 63,40 % 385395 README Example.Adhoc 7631,000 нс ± 47,01 % 169332 Программа завершилась с кодом выхода: 0
Кроме того, если вы хотите написать свои парсеры для UTF8View
вместо Substring
, вы можете получить еще большую производительность, более чем удвоив скорость:
имя время стандартные итерации -------------------------------------------------- ---------------- README Example.Parser: Подстрока 3693 000 нс ± 81,76 % 349763 README Пример. Парсер: UTF8 1272 000 нс ± 128,16 % 999150 README Example.Adhoc 8504.000 нс ± 59,59 % 151417
Мы также можем сравнить это время с инструментом, который нам дает Фонд Apple: Сканер
. Это тип, который позволяет использовать с начала строки для получения значений и предоставляет более удобный API, чем использование 9. 0031 .split :
переменные пользователи: [Пользователь] = [] в то время как scan.currentIndex != input.endIndex { сторожить пусть идентификатор = сканер.scanInt(), пусть _ = сканер.scanString ("","), пусть имя = сканер.scanUpToString ("","), пусть _ = сканер.scanString ("","), пусть isAdmin = сканер.scanBool() иначе { перерыв } users.append(Пользователь(id: id, имя: имя, isAdmin: isAdmin)) _ = сканер.scanString("\n") }
Однако стиль синтаксического анализа сканера
более чем в 5 раз медленнее, чем анализатор подстрок, написанный выше, и более чем в 15 раз медленнее, чем анализатор UTF-8:
имя время стандартные итерации -------------------------------------------------- ------------------ README Example.Parser: Подстрока 3481 000 нс ± 65,04 % 376525 README Пример. Парсер: UTF8 1207 000 нс ± 110,96 % 1000000 README Example.Adhoc 8029 000 нс ± 44,44 % 163719 README Example.Scanner 19786.000 нс ± 35,26 % 62125
Это основы синтаксического анализа простого строкового формата, но есть еще множество операторов и приемов, которые необходимо изучить, чтобы эффективно анализировать большие входные данные. Просмотрите эталонные тесты для примеров реальных сценариев синтаксического анализа.
Дизайн
Протокол
Дизайн библиотеки во многом основан на стандартной библиотеке Swift и платформе Combine от Apple. Синтаксический анализатор представлен как протокол, которому соответствуют многие типы, а затем преобразования синтаксического анализатора (также известные как «комбинаторы») — это методы, которые возвращают конкретные типы, соответствующие протоколу синтаксического анализатора.
Например, чтобы проанализировать все символы от начала подстроки до запятой, вы можете использовать префикс
синтаксический анализатор:
let синтаксический анализатор = Prefix{ $0 != "," } var input = "Привет, Мир"[...] parser.parse(&input) // => "Привет" ввод // => ",Привет"
Тип этого синтаксического анализатора:
Prefix
Мы можем .map
в этом синтаксическом анализаторе, чтобы преобразовать его вывод, который в данном случае является строкой «Hello»:
let parser = Prefix{ $0 != "," } . map {$0 + "!!!" } var input = "Привет, Мир"[...] parser.parse(&input) // => "Привет!!!" ввод // => ",Привет"
Тип этого синтаксического анализатора теперь:
Parsers.Map, Substring>
Обратите внимание, как тип парсера кодирует выполняемые нами операции. Это немного усложняет использование этих типов, но дает некоторые преимущества в производительности, поскольку Swift обычно может оптимизировать создание этих вложенных типов.
Низкоуровневый и высокоуровневый
Библиотека упрощает выбор уровня абстракции, над которым вы хотите работать. Как низкоуровневые, так и высокоуровневые имеют свои плюсы и минусы.
Разбор низкоуровневых входных данных, таких как единицы кода UTF-8, имеет лучшую производительность, но ценой потенциальной потери правильности. Каноническим примером этого является попытка разобрать символ «é», который может быть представлен в кодовых единицах как [233]
или [101, 769]
. Если вы не помните всегда анализировать оба представления, у вас может возникнуть ошибка, из-за которой вы случайно выйдете из строя синтаксического анализатора, когда он встретит последовательность единиц кода, которую вы не поддерживаете.
С другой стороны, анализ входных данных высокого уровня, таких как String
, может гарантировать правильность, но за счет производительности. Например, String
справляется со сложностями расширенных кластеров графем и нормализацией UTF-8, но обход строк происходит медленнее, поскольку его элементы имеют переменную ширину.
Библиотека предоставляет инструменты, позволяющие выбирать уровень абстракции, над которым вы хотите работать, а также возможность плавного перехода между уровнями абстракции там, где это целесообразно.
Например, мы хотим разобрать названия конкретных городов с начала строки:
перечисление Город { кейс лондон случай Нью-Йорк дело Сан-Хосе }
Поскольку «Сан-Хосе» имеет акцентированный символ, самый безопасный способ его анализа — анализ на уровне абстракции Substring
:
let city = StartsWith("London"). map { City.london } .orElse(StartsWith("Нью-Йорк").map { .newYork}) .orElse(StartsWith("Сан-Хосе").map { .sanJose}) var input = "Сан-Хосе, 123" city.parse(&input) // => City.sanJose ввод // => ",123"
Однако мы берем на себя затраты на синтаксический анализ Подстроки
для всего этого синтаксического анализатора, несмотря на то, что эта мощность требуется только для случая «Сан-Хосе». Мы можем реорганизовать этот синтаксический анализатор так, чтобы «Лондон» и «Нью-Йорк» анализировались на уровне UTF8View
, поскольку они состоят только из символов ASCII, а затем анализировались «Сан-Хосе» как Substring
:
let city = StartsWith ("Лондон".utf8).map { City.london } .orElse(StartsWith("Нью-Йорк".utf8).map { .newYork}) .orElse(StartsWith("Сан-Хосе").utf8.map { .sanJose})
Это тонко, но StartsWith("London".utf8)
— это синтаксический анализатор, который анализирует единицы кода для «London» с начала UTF8View
, тогда как StartsWith("San José"). utf8
анализирует «Сан-Хосе» как Substring
, а затем преобразует его в парсер UTF8View
.
Это позволяет вам анализировать как можно больше на более производительном низкоуровневом UTF8View
, в то же время позволяя вам анализировать более правильный высокоуровневый Подстрока
при необходимости.
Эталонные тесты
Эта библиотека поставляется с исполняемым файлом эталонного теста, который не только демонстрирует производительность библиотеки, но также предоставляет множество примеров анализа:
- URL-маршрутизатор
- Журналы испытаний Xcode
- Упрощенный CSV
- Шестнадцатеричный цвет
- ISO8601 дата
- HTTP-запрос
- Упрощенный JSON
- Арифметическая грамматика
- и более
Это время, которое мы сейчас получаем при выполнении тестов:
MacBook Pro (16 дюймов, 2019 г.) 8-ядерный процессор Intel Core i9 с тактовой частотой 2,4 ГГц 64 ГБ 2667 МГц DDR4 итерации стандартного времени имени -------------------------------------------------- -------------------------------------------------- Arithmetic. Parser 12622.000 нс ± 40,63 % 102408 BinaryData.Parser 512 000 нс ± 172,80 % 1000000 Bool.Bool.init 28 000 нс ± 880,63 % 1000000 Bool.BoolParser 43 000 нс ± 423,22 % 1000000 Bool.Scanner.scanBool 920 000 нс ± 119,49 % 1000000 Color.Parser 127 000 нс ± 341,57 % 1000000 CSV.Parser 1370906,000 нс ± 12,24 % 1027 Методы мутации CSV.Ad hoc 1338824,500 нс ± 13,91 % 1014 Date.Parser 12 429 000 нс ± 38,26 % 107 342 Date.DateFormatter 41168.000 нс ± 29,40 % 31353 Date.ISO8601DateFormatter 56236,000 нс ± 27,39% 23383 HTTP.HTTP 3850 000 нс ± 1898,35 % 341642 JSON.Parser 6 115 000 нс ± 45,95 % 217 152 JSON.JSONSerialization 3050 000 нс ± 71,43 % 431524 Numerics.Int.init 38 000 нс ± 655,10 % 1000000 Numerics.Int.parser 41 000 нс ± 464,80 % 1000000 Numerics.Scanner.scanInt 145 000 нс ± 22359.78 % 1000000 Числовые значения. Разделенные запятыми: Int.parser 5511505,000 нс ± 8,87 % 245 Числовые значения. Разделенные запятыми: Scanner.scanInt 82824843,000 нс ± 2,37 % 17 Числовые значения. Разделенные запятыми: String. split 117376272,000 нс ± 2,68 % 11 Numerics.Double.init 58 000 нс ± 518,12 % 1000000 Numerics.Double.parser 59 000 нс ± 445,11 % 1000000 Numerics.Scanner.scanDouble 195 000 нс ± 234,94 % 1000000 Числовые значения. Разделенные запятыми: Double.parser 6222693,000 нс ± 9,33 % 220 Числовые значения. Разделенные запятыми: Scanner.scanDouble 89431780,500 нс ± 3,75 % 16 Numerics.Comma, разделенные: String.split 33387660,000 нс ± 4,02 % 41 PrefixUpTo.Parser 22898,000 нс ± 34,40 % 58197 PrefixUpTo.Scanner.scanUpToString 162816,000 нс ± 18,55 % 8000 Race.Parser 29962.000 нс ± 32,24 % 43186 README Example.Parser: Подстрока 3451.000 нс ± 590,72 % 378685 README Пример. Парсер: UTF8 1247 000 нс ± 110,74 % 1000000 README Example.Adhoc 8134.000 нс ± 34,87 % 161121 Routing.Parser 5242 000 нс ± 52,70 % 249596 String Abstractions.Substring 1044908,500 нс ± 12,95 % 1296 Строковые абстракции.UTF8 138412,000 нс ± 22,64 % 8938 Журналы Xcode. Парсер 6980962 000 нс ± 7,61 % 197
Зайдите в репозиторий Parsing, чтобы опробовать библиотеку сегодня. Для некоторого вдохновения вы могли бы написать парсеры для проверки тестов в проекте.
Парсер журналов рулит! Более 50 примеров!
Log Parser — это инструмент, который существует уже довольно давно (фактически, почти шесть лет). Я действительно не могу придумать ничего лучше, чем описание на официальной странице загрузки, так что вот оно: «Синтаксический анализатор журналов — это мощный, универсальный инструмент, который обеспечивает универсальный доступ к запросам к текстовым данным, таким как файлы журналов, файлы XML и CSV. файлы, а также ключевые источники данных в операционной системе Windows, такие как журнал событий, реестр, файловая система и Active Directory».
Log Parser — это инструмент командной строки (да, именно командной строки!), который использует диалект SQL для извлечения информации из источников данных. В частности, я обнаружил, что это бесценно для извлечения информации из журналов веб-серверов сайтов, которыми я управляю и разрабатываю.
Во-первых, о синтаксисе SQL, который Log Parser использует для запросов к источникам данных… похоже, многие разработчики испытывают естественное отвращение к SQL. Кроме того, многие новые платформы доступа к данным пытаются абстрагировать SQL от разработчика. Тем не менее, я всегда считал, что с SQL легко работать, и считаю, что это важный инструмент, с которым каждый разработчик должен иметь хотя бы практические знания. Все, что необходимо для работы с Log Parser, — это базовое понимание базовой инструкции SQL SELECT, реализованной в Microsoft SQL Server (то есть T-SQL). Это означает, что вы должны быть знакомы со следующими элементами оператора SELECT: TOP, FROM, INTO, WHERE, ORDER BY, GROUP BY. Это все, что вам нужно для выполнения большинства операций Log Parser.
Любопытно, что Log Parser никогда не получал того внимания, которого, по моему мнению, он заслуживает. Помимо шквала внимания, когда он был впервые выпущен, он редко упоминается в официальных сообщениях или блогах Microsoft. Несмотря на это, он остается жизнеспособным и ценным инструментом для анализа не только файлов журнала веб-сервера, но и всех типов структурированных текстовых данных.
В этом посте вместо того, чтобы объяснять, как использовать Log Parser. Приведу несколько примеров его использования. Кроме того, я задокументирую несколько полезных мест в Интернете, где можно найти информацию о Log Parser.
Примеры
Имейте в виду, что большинство примеров, которые я привожу здесь, представляют собой запросы командной строки «все-в-одном» (даже несмотря на то, что многие из них переносятся на несколько строк при отображении здесь). Однако запросы также могут выполняться как
.файл синтаксического анализатора: XXXXX.sql
, где XXXXX — это имя файла, содержащего SQL-запрос, удобный для разбора журнала. В следующем списке есть несколько примеров этого.
Приведенные здесь примеры были получены из различных источников, включая документацию, поставляемую с инструментом, блоги и онлайн-документацию, а также мой собственный опыт. К сожалению, у меня нет записей о происхождении каждого отдельного примера, так как я собирал их по частям в течение последних двух или трех лет.
Надеюсь, вы найдете здесь что-то полезное и оцените надежность этого инструмента.
1) Все страницы с заданным IP-адресом
logparser «выбрать cs-uri-stem, count(cs-uri-stem) как requestcount из [LogFileName], где c-ip = ‘000.00.00.000’ группировать по cs-uri-stem в порядке количества (cs-uri-stem ) десц»
2) Заходы на определенную страницу по IP-адресу
logparser «выберите c-ip, count(c-ip) as requestcount из [LogFileName], где cs-uri-stem, например ‘/search.aspx%’, группирует по c-ip порядку по количеству (c-ip) desc»
3) Пример ReverseDNS. Это попытка найти домен, связанный с данным IP-адресом.
logparser «выбрать c-ip, REVERSEDNS(c-ip) из [LogFileName], где c-ip = ‘000.00.00.000’ группировать по c-ip»
4) пример CSV. Все обращения к странице записываются в файл CVS.
logparser «выберите * в OUTPUT.CSV из [LogFileName], где cs-uri-stem, например ‘/pagename. aspx’»
5) Пример диаграммы. Все посещения страницы по IP-адресу, отображаемые на графике.
logparser «выберите c-ip, count(c-ip) как requestcount в logparserchart.gif из [LogFileName], где cs-uri-stem, например ‘/pagename.aspx’, группирует по c-ip в порядке количества (c-ip) описание» -o:диаграмма
6) Число обращений в час с определенного IP-адреса
logparser «выберите TO_LOCALTIME(QUANTIZE(TO_TIMESTAMP(дата, время), 3600)), count(*) как numberrequests из [LogFileName], где c-ip=’000.000.00.000′ группа по TO_LOCALTIME(QUANTIZE(TO_TIMESTAMP(дата,время) ), 3600))»
7) Основной список IP-адресов, генерирующих трафик
logparser «выберите c-ip, count(c-ip) as requestcount из группы [LogFileName] по порядку c-ip по количеству (c-ip) desc»
8) Основной список посещаемых страниц
logparser «выберите cs-uri-stem, count(cs-uri-stem) from [LogFileName], где cs-uri-stem, например «%aspx%», или cs-uri-stem, например, «%ashx%», сгруппируйте по cs- uri-stem порядок по количеству (cs-uri-stem) desc»
9) Основной список посещаемых страниц, включая IP-адреса, с которых происходит обращение
logparser «выберите cs-uri-stem, c-ip, count(cs-uri-stem) из [LogFileName], где cs-uri-stem, например «%aspx%», или cs-uri-stem, например «%ashx%» группировать по cs-uri-stem, c-ip упорядочивать по количеству (cs-uri-stem) desc»
10) Страницы, открываемые после определенной даты и времени
logparser «выберите cs-uri-stem, c-ip, count(cs-uri-stem) из [LogFileName], где cs-uri-stem, например «%aspx%», или cs-uri-stem, например «%ashx%» и date=’2009-06-04′ и время > ’15:00:00′ группируются по cs-uri-stem, порядок c-ip по количеству (cs-uri-stem) desc»
11) Количество посещений страниц ASPX/ASHX по часам с определенного IP-адреса
logparser «выберите TO_LOCALTIME(QUANTIZE(TO_TIMESTAMP(date, time), 3600)), count(*) as numberrequests from [LogFileName], где c-ip=’000. 000.00.00′ и (cs-uri-stem как ‘%aspx %’ или cs-uri-stem как ‘%ashx%’) группа по TO_LOCALTIME(QUANTIZE(TO_TIMESTAMP(date,time), 3600))»
12) Количество посещений определенных страниц в час с определенного IP-адреса
logparser «выбрать TO_LOCALTIME(QUANTIZE(TO_TIMESTAMP(дата, время), 3600)), cs-uri-stem, count(*) as numberrequests из [LogFileName], где c-ip=’000.000.00.00′ и (cs-uri -stem как ‘%aspx%’ или cs-uri-stem как ‘%ashx%’) группируется по TO_LOCALTIME(QUANTIZE(TO_TIMESTAMP(дата,время), 3600)), порядок cs-uri-stem по номеру запросов desc»
13) Популярные браузеры
logparser «Выбрать 50 лучших to_int(mul(100.0,PropCount(*))) как Percent, count(*) как TotalHits, cs(User-Agent) как Browser из группы [LogFileName] по порядку браузера по Totalhits desc»
14) Почасовая пропускная способность (диаграмма)
logparser «Выберите TO_LOCALTIME(QUANTIZE(TO_TIMESTAMP(дата, время), 3600)) Как час, Div(Sum(cs-bytes),1024) как Incoming(K), Div(Sum(sc-bytes),1024) как Исходящие (K) в BandwidthByHour. gif из группы [LogFileName] по часам»
15) Запросы по URI
logparser «ВЫБЕРИТЕ первые 80 QUANTIZE (TO_TIMESTAMP (дата, время), 3600) как час, TO_LOWERCASE (STRCAT (‘/’, EXTRACT_TOKEN (cs-uri-stem, 1,’/’))) как URI, COUNT (* ) AS RequestsPerHour, SUM(sc-bytes) AS TotBytesSent, AVG(sc-bytes) AS AvgBytesSent, Max(sc-bytes) AS MaxBytesSent, ADD(1,DIV(Avg(затраченное время),1000)) AS AvgTime, ADD(1,DIV(MAX(time-taken),1000)) AS MaxTime FROM [LogFileName] GROUP BY Hour, URI Имея RequestsPerHour > 10 ORDER BY RequestsPerHour ASC»
16) 10 лучших изображений по размеру
logparser «Выбрать первые 10 StrCat(Extract_Path(TO_Lowercase(cs-uri-stem)),’/’) AS RequestedPath, Extract_filename(To_Lowercase(cs-uri-stem)) As RequestedFile, Count(*) AS Hits, Max( затраченное время) Как MaxTime, Среднее (затраченное время) Как AvgTime, Max(sc-bytes) Как BytesSent From [LogFileName] Где (Extract_Extension(To_Lowercase(cs-uri-stem)) IN (‘gif’;’jpg’ ;’png’)) И (sc-status = 200) Группировать по To_Lowercase(cs-uri-stem) Порядок BytesSent, Hits, MaxTime DESC»
17) 10 самых популярных URL-адресов веб-сайта с указанием общего количества посещений, максимального времени обслуживания и среднего времени обслуживания
logparser «Выберите TOP 10 STRCAT (EXTRACT_PATH (cs-uri-stem), ‘/’) AS RequestPath, EXTRACT_FILENAME (cs-uri-stem) AS RequestedFile, COUNT (*) AS TotalHits, Max (затраченное время) AS MaxTime , AVG(time-taken) AS AvgTime, AVG(sc-bytes) AS AvgBytesSent FROM [LogFileName] GROUP BY cs-uri-stem ORDER BY TotalHits DESC»
18) 20 лучших клиентов
logparser «Выберите 20 лучших клиентов c-ip AS, подсчитайте (*) AS Hits INTO Chart. gif FROM [LogFileName] GROUP BY c-ip ORDER BY Hits Desc»
19) Неработающие ссылки реферера (т. е. внешние ссылки на неработающие ссылки на вашем сайте)
logparser «ВЫБЕРИТЕ РАЗЛИЧНЫЕ cs(Referer) в качестве Referer, cs-uri-stem as Url INTO ReferBrokenLinks.html FROM [LogFileName] WHERE cs(Referer) НЕ NULL AND sc-status = 404 AND (sc-substatus IS NULL OR sc -substatus=0)» -tpl:ReferBrokenLinks.tpl
20) Коды состояния
logparser «ВЫБЕРИТЕ sc-status как статус, COUNT (*) как число INTO StatusCodes.gif FROM <2> GROUP BY Status ORDER BY Status»
21) Найдите в журнале событий записи журнала W3SVC (IIS) и обозначьте цветом ошибки, предупреждения, информацию. В этом примере выходные данные запроса записываются в файл HTML, созданный с использованием файла шаблона.
logparser «ВЫБЕРИТЕ TimeGenerated,EventTypeName,Strings,Message,CASE EventTypeName КОГДА ‘Событие ошибки’ ТО ‘КРАСНЫЙ’ КОГДА ‘Событие предупреждения’ ТО ‘ЖЕЛТЫЙ’ КОГДА ‘Информационное событие’ ТО ‘БЕЛЫЙ’ ИНАЧЕ ‘СИНИЙ’ КОНЕЦ Цвет В файл . html FROM System WHERE SourceName = ‘W3SVC'» -tpl:IISEventLogEntries.tpl
Где IISEventLogEntries.tpl — это файл, содержащий следующее:
Новые сообщения W3SVC в журнале системных событий
Время генерации
Тип события
Строки
< TH ALIGN=LEFT BGCOLOR="#C0C0C0">Сообщение
%TimeGenerated%
%EventTypeName%
%Strings%
%Message%
22) Отправка результатов запроса Log Parser непосредственно в таблицу в SQL Server 9. 0003
logparser «выберите * в LogTable из [LogFileName], где cs-uri-stem, например ‘/folder/filename%'» -o:SQL -createTable:ON -server:[DatabaseServer] -database:[Database] -username:[ SqlUser]-пароль: [SqlPassword]
23) Отправлено 10 лучших изображений по размеру. Обратите внимание, что в этом примере также показано, как одновременно запрашивать несколько файлов журналов.
logparser «Выбрать первые 10 StrCat(Extract_Path(TO_Lowercase(cs-uri-stem)),’/’) AS RequestedPath, Extract_filename(To_Lowercase(cs-uri-stem)) As RequestedFile, Count(*) AS Hits, Max( затраченное время) Как MaxTime, Среднее (затраченное время) Как AvgTime, Макс. IN (‘gif’;’jpg’;’png’)) И (sc-status = 200) ГРУППИРОВАТЬ ПО To_Lowercase(cs-uri-stem) ORDER BY BytesSent, Hits, MaxTime DESC»
24) Типы браузеров (два разных подхода)
logparser «ВЫБЕРИТЕ отдельные cs (агент пользователя), подсчитайте (*) как совпадения INTO useragentsalltypes. txt FROM logs\iis\ex*.log СГРУППИРОВАТЬ ПО cs (агент пользователя) ORDER BY hits DESC»
logparser «ВЫБРАТЬ TO_INT(MUL(100.0,PROPCOUNT(*)) AS Percent, COUNT(*) AS Hits, cs(User-Agent) as Browser INTO UseragentsHits.txt FROM logs\iis\ex*.log ГРУППИРОВАТЬ ПО браузеру ЗАКАЗ ПО ПОИСКАМ DESC»
25) Уникальных посетителей в день. Для этого нужно два запроса. Первый запрос выбирает из журналов IIS файл CSV, а второй выбирает из этого файла CSV.
logparser «ВЫБЕРИТЕ РАЗЛИЧНЫЕ cs-username, date INTO tempUniqueVisitorsPerDay.csv FROM logs\iis\ex*.log WHERE cs-username <> NULL Group By Date, cs-username»
logparser «ВЫБЕРИТЕ дату, количество (cs-username) как UniqueVisitors в test.txt ИЗ tempUniqueVisitorsPerDay.csv СГРУППИРОВАТЬ ПО дате»
26) 10 самых больших ASPX-страниц.
logparser «Выбрать первые 10 StrCat(Extract_Path(TO_Lowercase(cs-uri-stem)),’/’) AS RequestedPath, Extract_filename(To_Lowercase(cs-uri-stem)) As RequestedFile, Count(*) AS Hits, Max( затраченное время) Как MaxTime, Среднее (затраченное время) Как AvgTime, Max(sc-bytes) Как BytesSent INTO top10pagesbysize. txt FROM logs\iis\ex*.log WHERE (Extract_Extension(To_Lowercase(cs-uri-stem)) IN (‘aspx’)) И (sc-status = 200) ГРУППИРОВАТЬ ПО To_Lowercase(cs-uri-stem) ORDER BY BytesSent, Hits, MaxTime DESC»
27) 10 самых медленных страниц ASPX
logparser «ВЫБЕРИТЕ ТОП 10 cs-uri-stem, максимальное (затраченное время) как MaxTime, среднее (затраченное время) как AvgTime INTO toptimetaken.txt FROM logs\iis\ex*.log ГДЕ Extract_extension(to_lowercase(cs-uri) -stem)) = ‘aspx’ GROUP BY cs-uri-stem ORDER BY MaxTime DESC»
28) 10 самых медленных страниц ASPX в определенный день
logparser «ВЫБЕРИТЕ ТОП 10 cs-uri-stem, максимальное (затраченное время) как MaxTime, среднее (затраченное время) как AvgTime INTO toptimetaken.txt FROM logs\iis\ex*.log ГДЕ Extract_extension(to_lowercase(cs-uri) -stem)) = ‘aspx’ И TO_STRING(To_timestamp(дата, время), ‘MMdd’)=’1003′ ГРУППИРОВАТЬ ПО cs-uri-stem ORDER BY MaxTime DESC»
29) Дневная пропускная способность
logparser «Выберите To_String (To_timestamp (дата, время), ‘MM-dd’) как Day, Div (Sum (cs-bytes), 1024) как Incoming (K), Div (Sum (sc-bytes), 1024) As Outgoing(K) Into BandwidthByDay. gif From logs\iis\ex*.log Group By Day»
30) Пропускная способность по часам
logparser «ВЫБЕРИТЕ QUANTIZE (TO_TIMESTAMP (дата, время), 3600) AS Hour, SUM (sc-bytes) AS TotalBytesSent INTO BytesSentPerHour.gif FROM logs\iis\ex*.log СГРУППИРОВАТЬ ПО ЧАСАМ ПОРЯДОК ПО ЧАСАМ»
31) Среднее время загрузки страницы на пользователя
logparser «Выберите 20 лучших cs-username AS UserName, AVG (time-taken) AS AvgTime, Count (*) AS Hits INTO AvgTimePerUser.txt FROM logs\iis\ex*.log, ГДЕ cs-username НЕ NULL GROUP BY cs -username ORDER BY AvgTime DESC»
32) Среднее время загрузки страницы для конкретного пользователя
logparser «Выберите cs-username AS UserName, AVG (time-taken) AS AvgTime, Count (*) AS Hits INTO AvgTimeOnSpecificUser.txt FROM logs\iis\ex*.log ГДЕ cs-username = ‘CONTOSO\User1234’ GROUP BY cs-имя пользователя»
33) Тенденции ошибок. Этот запрос довольно длинный, и его легче выразить в текстовом файле, чем в командной строке. Итак, Log Parser читает и выполняет запрос, содержащийся в указанном текстовом файле.
файл logparser: errortrend.sql
Где errortrend.sql содержит следующее:
SELECT
TO_STRING(To_timestamp(дата, время), ‘ММдд’) КАК День,
СУММ(c200) КАК 200с,
СУММ(c206) КАК 206с,
СУММ(c301) AS 301s,
СУММ(c302) AS 302s,
СУММ(c304) AS 304s,
СУММ(c400) AS 400s,
СУММ(c401) AS 401s,
3 SUM(c0 4 4 3 SUM(c0 4 4 0) (c404) AS 404s,
SUM(c500) AS 500s,
SUM(c501) AS 501s,
SUM(c502) AS 502s,
SUM(c503) AS 503s,
(5 SUM(c508c), AS 9UM42s ) AS 505s
USING
CASE sc-status WHEN 200 THEN 1 ELSE 0 END AS c200,
CASE sc-status WHEN 206 THEN 1 ELSE 0 END AS c206,
CASE sc-статус WHEN 301 THEN 1 Else 0 END AS c301,
CASE sc-статус WHEN 302 THEN 1 ELSE 0 END AS c302,
CASE sc-статус WHEN 304 THEN 1 ELS 0 END AS c304,
CASE sc-статус WHEN 400 THEN 1 ELS 0 END AS c400,
CASE sc-статус WHEN 401 THEN 1 ELS 0 END AS c401,
CASE sc-status WHEN 403 THEN 1 ELSE 0 END AS c403,
CASE sc-status WHEN 404 THEN 1 ELSE 0 END AS c404,
CASE sc-status WHEN 500 THEN 1 ELSE 0 END AS c500,
CASE sc-статус WHEN 501 THEN 1 ELS 0 END AS c501,
CASE sc-статус WHEN 502 THEN 1 ELSE 0 END AS c502,
CASE sc-статус WHEN 503 THEN 1 ELSE 0 END AS c503,
CASE sc-status WHEN 504 THEN 1 ELSE 0 END AS c504,
CASE sc-status WHEN 505 THEN 1 ELSE 0 END AS c505
INTO ErrorChart. gif
\iis
\ex*.log
ГРУППА ПО
День
ЗАКАЗ
День
34) Ошибки Win32
logparser «ВЫБРАТЬ sc-win32-status как ErrorNumber, WIN32_ERROR_DESCRIPTION(sc-win32-status) как ErrorDesc, Count(*) AS Total INTO Win32ErrorNumbers.txt FROM logs\iis\ex*.log ГДЕ sc-win32-status>0 GROUP BY ErrorNumber ORDER BY Total DESC»
35) Коды подстатуса
logparser «ВЫБЕРИТЕ sc-status, sc-substatus, Count(*) AS Total INTO 401subcodes.txt FROM logs\iis\ex*.log WHERE sc-status=401 GROUP BY sc-status, sc-substatus ORDER BY sc- статус, sc-подстатус DESC»
36) Коды подстатуса в день. Это еще один пример выполнения запроса, содержащегося в текстовом файле.
файл logparser: substatusperday.sql
Где substatusperday.sql содержит следующее:
SELECT
TO_STRING(To_timestamp(date, time), ‘MMdd’) AS Day,
SUM(c1) AS 4011,
SUM(c2) AS 4012,
SUM(c3) AS 4013,
SUM(c4) AS 4014 ,
СУММ(с5) КАК 4015,
SUM(c7) AS 4017
USING
CASE sc-подстатус WHEN 1 THEN 1 ELSE 0 END AS c1,
CASE sc-подстатус WHEN 2 THEN 1 ELSE 0 END AS c2,
CASE sc-подстатус WHEN 3 THEN 1 ELSE 0 END AS c3,
CASE sc-подстатус WHEN 4 THEN 1 ELSE 0 END AS c4,
CASE sc-подстатус WHEN 5 THEN 1 ELSE 0 END AS c5,
CASE sc-подстатус WHEN 7 THEN 1 ELSE 0 END AS c7
INTO
401subcodesperday. txt
ИЗ
logs\iis\ex*.log
ГДЕ
sc-status=401
ГРУППА ПО
День
ПОРЯДОК ПО
День
37) Коды подстатуса на странице
logparser «ВЫБЕРИТЕ ТОП 20 cs-uri-stem, sc-status, sc-substatus, Count(*) AS Total INTO 401Pagedetails.txt FROM logs\iis\ex*.log ГДЕ sc-status=401 СГРУППИРОВАТЬ ПО cs-uri -стебель, sc-статус, sc-подстатус ORDER BY Total»
38) МБ отправлено на код состояния HTTP
logparser «ВЫБЕРИТЕ EXTRACT_EXTENSION (cs-uri-stem) AS PageType, SUM (sc-bytes) как TotalBytesSent, TO_INT (MUL (PROPSUM (sc-bytes), 100,0)) AS PercentBytes INTO PagesWithLargestBytesSent.htm FROM logs\iis\ex *.log СГРУППИРОВАТЬ ПО типу страницы ORDER BY PercentBytes DESC»
39) 500 ошибок на пользователя ASPX и домена
logparser «ВЫБЕРИТЕ cs-username, cs-uri-stem, count(*) as Times INTO 500PagesByUserAndPage.txt FROM logs\iis\ex*. log WHERE sc-status=500 GROUP BY cs-username, cs-uri-stem ЗАКАЗАТЬ ПО ВРЕМЕНИ DESC»
40) Процент из 500 ошибок, вызванных каждым пользователем
logparser «ВЫБЕРИТЕ cs-username, count(*) as Times, propcount(*) as Percent INTO 500ErrorsByUser.csv FROM logs\iis\ex*.log WHERE sc-status=500 GROUP BY cs-username ORDER BY Times DESC»
41) Определите, какой процент от общего числа отправленных байт приходится на каждый тип страницы
logparser «ВЫБЕРИТЕ EXTRACT_EXTENSION (cs-uri-stem) AS PageType, SUM (sc-bytes) as TotalBytesSent, TO_INT (MUL (PROPSUM (sc-bytes), 100,0)) AS PercentBytes INTO PagesWithLargestBytesSent.txt FROM logs\iis\ex *.log СГРУППИРОВАТЬ ПО типу страницы ORDER BY PercentBytes DESC»
42) 20 первых страниц с определенным кодом возврата HTTP
logparser «ВЫБЕРИТЕ ТОП 20 cs-uri-stem, sc-status, Count(*) AS Total INTO TOP20PagesWith501.txt FROM logs\iis\ex*. log, ГДЕ TO_LOWERCASE(cs-uri-stem) LIKE ‘%.aspx’ и sc-status=401 GROUP BY cs-uri-stem, sc-status ORDER BY Total, cs-uri-stem, sc-status DESC»
43) Проверить трафик с IP-адресов
logparser «Выберите c-ip AS Client, Div (Sum (cs-bytes), 1024) как IncomingBytes (K), Div (Sum (sc-bytes), 1024) как OutgoingBytes (K), MAX (затраченное время) как MaxTime, AVG(time-taken) как AvgTime, count(*) как совпадения INTO errorsperip.txt FROM logs\iis\ex*.log GROUP BY client ORDER BY Hits DESC»
44) Проверить ошибки по IP-адресу
файл logparser: errorbyip.sql
Где errorbyip.sql содержит следующее:
Выберите
c-ip AS Client,
SUM(c400) AS 400s,
sum(c401) AS 401s,
SUM(c403) AS 403s,
SUM(c404) AS 404s,
SUM(c50028) SUM(c501) AS 501s,
SUM(c502) AS 502s,
SUM(c503) AS 503s,
SUM(c504) AS 504s,
SUM(c505) AS 505s
USING
CASE sc-status WHEN 400 THEN 1 ELS 0 END AS c400,
CASE sc-status WHEN 401 THEN sc 1 Else 9 CASE 8, END AS c4012 -status WHEN 403 THEN 1 ELSE 0 END AS c403,
CASE sc-status WHEN 404 THEN 1 ELSE 0 END AS c404,
CASE sc-status WHEN 500 THEN 1 ELSE 0 END AS c500,
CASE sc-status WHEN 501 THEN 1 ELSE 0 END AS c501,
CASE sc-status WHEN 502 THEN 1 ELSE 0 END AS c502,
CASE sc-status WHEN 503 THEN 1 ELSE 0 END AS c503,
CASE sc-status WHEN 504 THEN 1 ELSE 0 END AS c504,
CASE sc-status WHEN 505 THEN 1 ELSE 0 END AS c505
INTO
IPNName
FROM
logs\iis\ex*. log
WHERE
c-ip=’‘
GROUP BY
client
45) Поиск неработающих ссылок
logparser «ВЫБЕРИТЕ РАЗЛИЧНЫЕ cs(Referer) как Referer, cs-uri-stem как Url INTO ReferBrokenLinks.txt FROM logs\iis\ex*.log, ГДЕ cs(Referer) НЕ НУЛЕН И sc-status=404 И (sc- подстатус IS NULL ИЛИ sc-substatus=0)»
46) 10 страниц с наибольшим количеством посещений
logparser «Выберите TOP 10 STRCAT (EXTRACT_PATH (cs-uri-stem), ‘/’) AS RequestPath, EXTRACT_FILENAME (cs-uri-stem) AS RequestedFile, COUNT (*) AS TotalHits, Max (затраченное время) AS MaxTime , AVG(время) AS AvgTime, AVG(sc-bytes) AS AvgBytesSent INTO Top10Urls.txt FROM logs\iis\ex*.log ГРУППА ПО cs-uri-stem ORDER BY TotalHits DESC»
47) Уникальные пользователи для каждого типа браузера (требуется два запроса)
logparser «ВЫБЕРИТЕ РАЗЛИЧНЫЕ cs-username, cs(user-agent) INTO UserAgentsUniqueUsers1. csv FROM logs\iis\ex*.log WHERE cs-username <> NULL GROUP BY cs-username, cs(user-agent)»
logparser «ВЫБЕРИТЕ cs (агент пользователя), count (имя пользователя cs) as UniqueUsersPerAgent, TO_INT (MUL (PROPCOUNT (*), 100)) AS Percentage INTO UniqueUsersPerAgent.txt FROM UserAgentsUniqueUsers1.csv СГРУППИРОВАТЬ ПО cs (агент пользователя) ЗАКАЗАТЬ ПО UniqueUsersPerAgent DESC»
48) Количество отправленных байтов на расширение файла
logparser «ВЫБЕРИТЕ EXTRACT_EXTENSION(cs-uri-stem) AS Extension, MUL(PROPSUM(sc-bytes),100.0) AS PercentageOfBytes, Div(Sum(sc-bytes),1024) as AmountOfMbBytes INTO BytesPerExtension.txt FROM logs\iis \ex*.log GROUP BY Extension ORDER BY PercentageOfBytes DESC»
49) Домены, направляющие трафик на ваш сайт
logparser «ВЫБЕРИТЕ EXTRACT_TOKEN (cs (Referer), 2, ‘/’) AS Domain, COUNT (*) AS [Requests] INTO ReferringDomains.txt FROM logs\iis\ex*. log СГРУППИРОВАТЬ ПО ДОМЕНУ ORDER BY Requests DESC»
50) Типы ОС (требуется два запроса)
logparser «ВЫБЕРИТЕ РАЗЛИЧНЫЕ c-ip, cs(user-agent) INTO UserAgentsUniqueUsers.csv FROM logs\iis\ex*.log, ГДЕ c-ip <> NULL GROUP BY c-ip, cs(user-agent)»
файл синтаксического анализатора: getos.sql
Где getos.sql содержит следующее:
ВЫБЕРИТЕ
СУММ (c70) КАК Win7,
СУММ (c60) КАК Vista,
СУММ (c52) КАК Win2003,
СУММ (c51) КАК WinXP,
СУММ (C50) КАК Win2000,
СУММ (W98) КАК Win9
SUM (W95) AS Win95,
SUM (W9x) AS Win9x,
SUM (NT4) AS WinNT4,
SUM (OSX) AS OS-X,
SUM (Mac) AS Mac-,
SUM (PPC) AS Mac-PPC,
SUM (Lnx) AS Linux
USING
CASE strcnt(cs(User-Agent),’Windows+NT+6.1′) WHEN 1 THEN 1 ELSE 0 END AS C70,
CASE strcnt(cs(User-Agent),’Windows+NT+6.0′) WHEN 1 THEN 1 ELSE 0 END AS C60,
CASE strcnt(cs(User-Agent),’Windows+ NT+5. 2′) WHEN 1 THEN 1 ELSE 0 END AS C52,
CASE strcnt(cs(User-Agent),’Windows+NT+5.1′) WHEN 1 THEN 1 ELSE 0 END AS C51,
CASE strcnt(cs(User-Agent),’Windows+NT+5.0′) WHEN 1 THEN 1 ELSE 0 END AS C50,
CASE strcnt(cs(User-Agent),’Win98′) WHEN 1 THEN 1 ELSE 0 END AS W98,
CASE strcnt(cs(User-Agent),’Win95′) WHEN 1 THEN 1 ELSE 0 END AS W95,
CASE strcnt(cs(User-Agent),’Win+9x+4.90′) WHEN 1 THEN 1 ELSE 0 END AS W9x,
CASE strcnt(cs(User-Agent),’Winnt4.0′) WHEN 1 THEN 1 ELSE 0 END AS NT4,
CASE strcnt(cs(User-Agent),’OS+X ‘) WHEN 1 THEN 1 ELSE 0 END ASX,
CASE strcnt(cs(User-Agent),’Mac’) WHEN 1 THEN 1 ELSE 0 END AS Mac,
CASE strcnt(cs(User-Agent),’PPC’) WHEN 1 THEN 1 ELSE 0 END AS PPC,
CASE strcnt(cs(User-Agent),’Linux’) WHEN 1 THEN 1 ELSE 0 END AS Lnx
INTO
GetOSUsed.txt
FROM
UserAgentsUniqueUsers.csv
51) Получить ошибки тайм-аута из журнала событий сервера. Отображение результатов в таблице данных.
logparser «выберите * из \\имя_сервера\приложение, где сообщение типа «%timeout expired%» -i:EVT -o:datagrid
52) Получить исключения из журнала событий (приложений) сервера
logparser «выберите timegenerated, eventtypename, eventcategoryname, сообщение в webserverlog.csv из \\servername\application, где сообщение типа «%myapplication%exception%» -i:EVT
Ссылки
Перейдите по ссылкам ниже, чтобы найти более подробное обсуждение Log Parser, а также еще больше примеров его использования.
- Посетите форумы Log Parser на официальном сайте Microsoft IIS (несмотря на возраст инструмента, эти форумы по-прежнему посещаются)
- Приобретите Microsoft Log Parser Toolkit на Amazon.com (также доступна версия для Kindle)
- Использовать Microsoft Logparser для анализа журналов IIS — статья Log Parser в блоге под названием «Linux Lore»? Странно, но тем не менее это отличная справочная статья.