Треки
/
Ruby
Ruby
/
Вправи
/
Аналізатор рядків логу
Аналізатор рядків логу

Аналізатор рядків логу

Навчальна вправа

Вступ

Як і все в Ruby, String - це обʼєкт. Рядки тексту (англ. string) складаються з довільної послідовності байтів (зазвичай символів), і їх ініціалізують та обробляють так само, як будь-який інший обʼєкт. Насправді одна з найкорисніших речей у Ruby - це численні методи, які можна викликати в рядків тексту (та інших обʼєктів), щоб зекономити багато часу на написанні коду. У цій вправі ми дослідимо та побавимося з деякими з цих допоміжних методів.

Створення рядка тексту

Хоча для створення рядка тексту можна використати String.new(...), набагато частіше використовують літерал. Існує багато різних літералів, які можна використати, і вони поділяються на дві категорії: ті, що дозволяють інтерполяцію, і ті, що ні.

Найпоширеніші літерали - це одинарні та подвійні лапки ('...' і "..."). Одинарні лапки не дозволяють інтерполяцію, тоді як подвійні дозволяють. Інтерполяція - це коли один рядок тексту вставляється в інший за допомогою синтаксису #{}.

# Use single quotes when not interpolated
location = 'World'

# And double quotes when interpolated
puts "Hello, #{location}!"   #=> "Hello, World!"

Також можна використовувати інші літерали, наприклад %{... } для рядків з інтерполяцією та %q{...} для рядків без інтерполяції. Вони стануть у пригоді, якщо рядок містить символи ' або ".

Примітка: немає жодного абсолютного правила, яке вимагає використовувати рядки без інтерполяції, якщо рядок не містить інтерполяції.

Взаємодія з рядками тексту

Корисно уявляти рядки тексту в Ruby так само, як ми уявляємо масиви. Вони мають розмір, а їхні символи проіндексовані (перший індекс - 0):

my_string = "Some string"

my_string.size   #=> 11

my_string[0]    #=> 'S'
my_string[1]    #=> 'o'
my_string[-1]   #=> 'g'

# Find the first index of a character
my_string.index('m')   #=> 2

Частини рядка тексту можна видобути за допомогою індексів або slice:

my_string = "Some string"

# Find three characters starting with the second character (index 1)
my_string[1, 3]         #=> "ome"
my_string.slice(1, 3)   #=> "ome"

Із семантичними значеннями рядків тексту теж можна працювати. Варто дослідити документацію Ruby, щоб дізнатися про всі методи, але ось кілька поширених прикладів:

"hello".capitalize   #=> "Hello"
"HELLO".downcase     #=> "hello"
"hello".center(9)    #=> "  hello  "
"  hello  ".strip    #=> "hello"

"hello world".split(" ")   #=> ["hello", "world"]

Також можна використовувати такі методи, як gsub, щоб замінювати символи:

# Replace one character with another
"noob".gsub("o","0")   #=> "n00b"

# (Advanced) Replace a regular expression
"Ruby really rocks".gsub(/[aieou]/,'')   #=> "Rby rlly rcks"

У всіх наведених прикладах повертається новий String. Однак багато методів мають відповідники, що закінчуються на ! і насправді змінюють сам рядок тексту.

# Use normal methods to return new strings
my_string = "hello"
my_string.capitalize   #=> "Hello"
puts my_string         #=> "hello"

# And bang-methods (...!) to modify the object
my_string = "hello"
my_string.capitalize!  #=> "Hello"
puts my_string         #=> "Hello"

Вказівки

У цій вправі ми працюватимемо з рядками журналу.

Кожен рядок журналу - це рядок тексту (англ. string) такого формату: "[<LEVEL>]: <MESSAGE>".

Існує три різні рівні журналу:

  • INFO
  • WARNING
  • ERROR

На нас чекають три завдання, і кожне з них отримує рядок журналу, з яким потрібно щось зробити. Існує безліч способів розвʼязати ці завдання. Виберімо улюблені методи з наведених вище прикладів і подивімося, що з цього вийде.

1. Отримати повідомлення з рядка журналу

Реалізуйте метод LogLineParser#message, щоб він повертав повідомлення з рядка журналу:

LogLineParser.new('[ERROR]: Invalid operation').message
# => "Invalid operation"

Будь-які пробільні символи на початку й у кінці потрібно прибрати:

LogLineParser.new("[WARNING]:  Disk almost full\r\n").message
# => "Disk almost full"

2. Отримати рівень журналу з рядка журналу

Реалізуйте метод LogLineParser#log_level, щоб він повертав рівень журналу з рядка журналу. Рівень потрібно повертати в нижньому регістрі:

LogLineParser.new('[ERROR]: Invalid operation').log_level
# => "error"

3. Переформатувати рядок журналу

Реалізуйте метод LogLineParser#reformat, який переформатовує рядок журналу: спочатку йде повідомлення, а потім у дужках рівень журналу:

LogLineParser.new('[INFO]: Operation completed').reformat
# => "Operation completed (info)"
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Ruby Exercism

Час розпочати Аналізатор рядків логу?

Зареєструйтеся на Exercism, щоб вивчати й опановувати Ruby, а також 21 концепція121 вправа та справжнє наставництво від людей, і все це безкоштовно.