четверг, 22 июля 2021 г.

Статистика печати принтеров на основе ELK

Есть множество решений по подсчету копий на принтерах и платные и бесплатные. Но, я ни разу не натыкался на бесплатный сервис по подсчету печати по различным вендорам принтеров, который бы работал корректно. Постоянно есть проблемы, то какие-то принтеры не видит, то не каждую копию считает. К примеру, есть замечательный скрипт GeneratePrintJobAccountingReports на повершеле. Но скорость его отработки и занимаемые ресурсы на его работу не выдерживают никакой критики. что бы составить отчет за пол месяца, пришлось ждать отработки скрипта почти неделю.
 Наконец получилось реализовать подсчет копий на основе ELK, с графиками и корректными данными.


Дано: Принтсервер на windows server, зоопарк принтеров (zebra, xerox, hp, tlc, kyocera)
Задача: Считать копии по всем принтерам, с функцией фильтрации по параметрам (принтеры, время, пользователи, с какого ПК)

Реализация: Реализовать решили используя следующие технологии:
Elasticsearch -  механизм индексирования и хранения логов, а также полнотекстового поиска по ней.
Kibana - визуальная часть системы Elasticsearch
Logstash - фильтрация и модификация поступаемых логов в Elasticsearch
winlogbeat - сбор логов по определенным правилам с windows систем.

Т.е. простыми словами, по порядку:
Ставим winlogbeat который собирает логи и передает их в Logstash который их фильтрует и модифицирует, а затем отправляет в Elasticsearch, а через интерфейс Kibana мы можем увидеть результат работы всей этой связки.

Решение: Поделим его на этапы

I) Включение ведения логов на принтсервере
II) Настройка winlogbeat на принтсервере для передачи данных в logstash
III) Настройка на другом сервере logstash+elasticserch+Kibana
IV) Настройка Kibana и elasticserch для формирования нужных данных.
V) Создаем нужные графики.


I. Включение ведения логов на принтсервере


Включите и настройте логирование событий заданий печати на сервере печати:

  - start Devices and Printers > (highlight any printer) > Print server properties > Advanced 
    - check "Show informational notifications for local printers" 
    - check "Show informational notifications for network printers" 
      - OK 
  - start Event Viewer > Applications and Services Logs > Microsoft > Windows > PrintService  
    - right-click Operational > Enable Log 
    - right-click Operational > Properties > Maximum log size (KB): 65536 (was 1028 KB by default) 
      - OK 



Maximum log size можно оставить и по умолчанию, однако, рекомендую поднять значение, что бы на принтсервере всегда были актуальные логи, на всякий случай - много места не сожрет по современным стандартам.




II. Настройка winlogbeat на принтсервере для передачи данных в logstash


Поставим на сервер, где собираются все эти логи, утилиту winlogbeat
Устанавливаем его сразу как службу. Открываем конфиг  C:\ProgramFiles\Winlogbeat\winlogbeat.yml и прописываем следующее
 winlogbeat.event_logs:
  - name: Microsoft-Windows-PrintService/Operational
    event_id: 307 #перечисляем ID event которые буем собирать

tags: ["log-print-01"] #указываем тэг с которым логи будут отправляться в logstash
output.logstash:
  hosts: ["10.1.1.1:5044"] #адрес сервера logstash

logging.level: info
logging.to_files: true
logging.files:
  path: C:/Program Files/Winlogbeat/logs #указываем, так же хранить логи в файлах локально.
  name: printlogbeat
  keepfiles: 7

xpack.monitoring:
  enabled: true
  elasticsearch:
    hosts: ["http://10.1.1.1:9200"]
Блок xpack.monitoring: необязателен.

Перезапускаем службу.
Советую так же запустить winlogbeat в командной строке, что бы увидеть вывод, корректно ли отрабатывает сбор и пересылка логов.


III. Настройка на другом сервере logstash+elasticserch+Kibana


Теперь, поднимаем виртуалку на линуксе, я предпочитаю дебиан и ставим этот набор. Ставится он из репозиториев, стандартно и без каких-то проблем. Приводить подробности их установки не буду. Официальная документация подробно и хорошо описывает этот этап. Или можете воспользоваться хорошей инструкцией отсюда
Скажу лишь, то что после установки, у вас должна работать kibana из браузера по адресу http://serverIP:5601/

После того как установили
Открываем /etc/logstash/conf.d/input.conf
input {
  beats {
    port => 5044
  }
}
Открываем /etc/logstash/conf.d/output.conf
output {
    if "log-print-01" in [tags] { # тэг который прописывали в winlogbeat
        elasticsearch {
            hosts     => "localhost:9200" #адрес сервера Elasticsearch 
            index    => "log-print-01" # индекс под которым будут писаться логи
        }
    }
    else { #если тэга нет, все остальные логи кидать в индекс unknown_messages
        elasticsearch {
            hosts     => "localhost:9200"
            index    => "unknown_messages"
        }
    }

}


Открываем /etc/logstash/conf.d/filter.conf
filter {
 mutate {
  copy => {"[winlog][user_data][Param5]" => "Printername"} # переносим Param5 в новый параметр
  copy => {"[winlog][user_data][Param3]" => "username"}
  copy => {"[winlog][user_data][Param4]" => "Hostname"}
  copy => {"[winlog][user_data][Param8]" => "pages"}
  convert => ["[winlog][user_data][Param8]", "integer"] #меняем тип значения на числовой.
  }


  }
Обращаю внимание, что очень важно, что бы convert отрабатывал. По умолчанию, все виндузовые логи падают в эластик в виде текстовой строки. Проводить математические операции с тестовой строкой, конечно невозможно. Позже мы с вами проверим отработку этого параметра в кибане.
Так же, обращаю внимание на то, что мы взяли параметр [winlog][user_data][Param8] где написано кол-во напечатанных копий и скопировали его значение в новый параметр, назвав его pages. Но нам еще нужно сконвертировать его в числовой формат. Так вот, конвертировать нужно  [winlog][user_data][Param8], а не pages.

В конце перезагружаем logstash # systemctl restart logstash
что бы применить внесенные изменения в конфигах. Давайте проверим что logstash работает.
     root@elk-msk-01:/home/user# systemctl status logstash
● logstash.service - logstash
   Loaded: loaded (/etc/systemd/system/logstash.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2021-07-21 14:20:14 MSK; 21h ago
 Main PID: 161382 (java)
    Tasks: 42 (limit: 19070)
   Memory: 715.8M
   CGroup: /system.slice/logstash.service
           └─161382 /bin/java -Xms1g -Xmx1g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djruby.compile.invokedynamic=true -Djruby.jit.th


Все ок. Давайте так же проверим лог в реальном времени. logstash работает таким образом, что при некорректной конфигурации он постоянно перезагружается и по команде systemctl status logstash не всегда можно понять что что-то не так

 Запускаем в ком.строке tail -f /var/log/logstash/logstash-plain.log и наблюдаем, сервис не должен перезапускаться.

IV. Настройка Kibana и elasticserch для формирования нужных данных.


Итак. Мы настроили logstash, kibana у нас уже поднята, elastic тоже. Пришло время смотреть в веб морду кибаны

открываем http://serverIP:5601/

Идём по пути Management - Index Patterns. Нажимаем кнопку Create index pattern  выбираем наш log-print-01 и добавляем.
Проваливаемся внутрь log-print-01 и ищем pages - то что мы в конфиге logstash указывали как хранение в численном формате. В столбце type должно быть написано number. 

Если там написано string, значит logstash не перевел значение в нужный нам вид. Возвращаемся к редактированию  /etc/logstash/conf.d/filter.conf и устраняем ошибки. 
Если у вас так все и произошло и значение не в том формате, после устранения проблемы в кибане нужно удалить весь индекс, что бы избежать конфликтов. 

Делаем это тут:

И тут, выбрав нужный индекс:

Если у вас с типом значения все впорядке и он number, эти действия проводить не нужно.



V. Создаем нужные графики


Идем - Visyalizations - Create Visyalization -Metric

И прописываем в Aggregation - sum, а в Field - pages (если не дает выбрать pages, значит тип значения pages не number)

Сохраняем эту визуализацию

Создаем еще одну - Controls. Это фильтры с выпадающими списками В ней я выбрал фильтровать по имени принтеру, имени пк и пользователю Не забывайте выбрать правильный индекс

Так же, сохраняем её.

Создаем еще одну визуализацию lens

По X-axis выставляем @timestamp по Y-axis - Sum of pages


Финал - идем на вкладку Dashboard, создаем новый и запихиваем все визуализации созданные ранее. В итоге должно получиться что-то типа такого.






Сбор статистики настроен, графики построены - вы великолепны.

Комментариев нет:

Отправить комментарий