аукцион / FPR / donate / услуги / RSS / распечатать / вход 
Мой мир
Вконтакте
Одноклассники

[15 января 2020 | 21 января 2020 | 22 января 2020]

Syslog на Python для Windows

Искал простенький Syslog-сервер под Windows и как оказалось их очень мало. Точнее то, что необходимо было мне — вообще нет. Мои основные требования к Syslog-серверу заключались в том, что он должен писать в текстовый файл данные приходящие по Syslog и складировать их в файл с именем того дня когда произошло событие. Большинство имеющихся серверов пишут в один файл. Для меня это крайне не удобно, так как бывает необходимо быстро переслать логи по почте и потом анализировать их. Так же это упрощает архивацию логов, можно сделать простейший командный файл который будет кидать старые файлы в архив. Отчасти нужный функционал есть у VisualSyslog. Но он присваивает дату файлу не в момент записи, а в момент переименования общего syslog.log файла. По этому надо помнить, что за вчерашнее число данные хранятся в файле с сегодняшним числом. Так же в эти файлы попадают данные за соседние даты, если велась активная запись в момент переименования.

Есть ещё несколько разных серверов, но одни ведут бинарный файл который необходимо в дальнейшем обрабатывать, а другие непрерывный текстовый, что мне совсем не нравится.

Вродебы у меня мизерные потребности, но их нельзя решить каким-нибудь простым методом. И возникла глупая мысль, что если написать скрипт на Python, который будет просто хватать пакеты Syslog-протокола на нужном порту и складировать эти данные так как я того хочу. Потеря на неоптимизированность скриптового языка по сравнению с компилируемым тут будет не значительна. Точнее нагрузка будет незаметна серверному оборудованию на котором она будет запущена. Задача оказалась крайне простой. В интернете есть уже готовое решение, но мне пришлось его поправить под свои нужды. Первую часть результата я приведу прямо в этой статье.

import datetime
import os
import sys
import socketserver

HOST, PORT = "0.0.0.0", 514

class SyslogUDPHandler(socketserver.BaseRequestHandler):
   def handle(self):
      data = bytes.decode(self.request[0].strip())
      socket = self.request[1]
      today = datetime.datetime.today()
      syslog_file = today.strftime("%Y-%m-%d") + ".log"
      syslog_log = open(syslog_file, 'a')
      syslog_log.write(self.client_address[0] + "	" +  today.strftime("%Y-%m-%d %H:%M:%S") + "	" + str(data) + "
")
      syslog_log.close()


if __name__ == "__main__":
   try:
      server = socketserver.UDPServer((HOST,PORT), SyslogUDPHandler)
      server.serve_forever(poll_interval=0.5)
   except (IOError, SystemExit):
      raise
   except KeyboardInterrupt:
      print ("Crtl+C Pressed. Shutting down.")

Да, здесь видно, что я «неправильно» работаю со строками, но данная работа нисколько не противоречит лексике языка и не приводит к каким-либо проблемам. Каждый в праве переделать под себя.

Опубликованный тут скрипт не является моим окончательным вариантом. Он дает костяк для экспериментов и творчества. Вы можете его оптимизировать под свои нужды. Например, перехватывать определённые события и реагировать на них тем или иным способом. Мне нет необходимости разбирать события онлайн. Всё, что надо, реализовано на коммутаторах и роутерах, Syslog необходим лишь как единое место для хранения логов.

На текущий момент скрипт уже умеет извлекать из PRI заголовки Facility и Severity, хотя я действительно не вижу в этом смысла, так как нужное мне оборудование Cisco формирует человекочитаемые логи и я в них легко ориентируюсь. Но ради интереса в моём скрипте сия функциональность реализована.

В дальнейшем планируется написать парсер который будет разгребать логи и анализировать качество подключения к провайдерским каналам, отключение коммутаторов и переключение портов UP/DOWN. Ещё хочу собрать IP-адреса компьютеров которые планомерно подбирают пароль к моему оборудованию. Некоторые считают, что с моей стороны стоит Raspberry Pi с паролем по умолчанию, там вообще каша полная.

Если у вас не установлена библиотека socketserver, то установите Werkzeug. Без него у вас этот скрипт не заработает.

pip3 install Werkzeug

Да, у меня на серверном оборудовании стоит Python, даже на Windows. Если вы не можете найти нужных вам инструментов — делайте их сами!

Тэги: ИТ, программирование, Питон

Отредактировано:2020-11-12 05:55:31




6 комментариев
Имя: Алексей 🖉
а WireShark?
Комментарий оставлен: 2020-01-21 00:00:00


Имя: Orcinus Orca 🖉
Алексей, это большой комплекс анализа, а не ведения логов. Тем более начинаются проблемы которых я бы хотел избежать:
1) его придётся распространять на все офисы в автоматическом режиме (обычным копированием не прокатит)
2) придётся сделать скрипт который будет его запускать в виде сервиса и передавать ему параметры заставляющие вести посуточные логи только определённого трафика (скорей всего он так не умеет)
3) накладные расходы на проц вырастут значительно сильнее чем от скриптика
4) оперативной памяти будет израсходовано так же значительно больше

В текущем виде мне потребуется только один командный файлик (из трёх строк) который скопирует скрипт, создаст новый каталог и поместит скрипт в автозапуск (у меня есть скрипт автозапуска где перечислены скрипты работающие в зацикленном виде без вывода в консоль).
Комментарий оставлен: 2020-01-22 00:00:00


Имя: Алексей 🖉
Посмотри ещё на PuTTY. Маленький, умеет и в ssh, и в serial. Логи можно обзывать так, как тебе требуется.
Комментарий оставлен: 2020-01-23 00:00:00


Имя: Алексей 🖉
teraterm ещё.
Комментарий оставлен: 2020-01-23 00:00:00


Имя: Orcinus Orca 🖉
Алексей, PuTTY — это не syslog-сервер, а терминальная программа он такого даже в своих страшных снах не умеет. Тем более ты должен был заметить, что я часто выкладываю скриншоты подключений к Cisco и там должно быть понятно, что я им и пользуюсь.

Тератерм — это тоже терминальная прога и никакого отношения к syslog не имеет.
Комментарий оставлен: 2020-01-24 00:00:00


Имя: Lexmaister 🖉
Спасибо! Воспользовался вашим скриптом как основой для своего приложения ))
Комментарий оставлен: 2021-05-25 18:44:46
Ответ:
Я рад, что он пригодился. Питон оказался довольно гибким языком.
Ответ оставлен: 2021-05-29 11:39:15



Этот сайт использует файлы cookies, чтобы упростить вашу навигацию по сайту, предлагать только интересную информацию и упростить заполнение форм. Я предполагаю, что, если вы продолжаете использовать мой сайт, то вы согласны с использованием мной файлов cookies. Вы в любое время можете удалить и/или запретить их использование изменив настройки своего интернет-браузера.

Сообщайте мне о замеченных ошибках на: web@orcinus.ru. Все пожелания и советы будут учтены при дальнейшем проектировании сайта. Я готов сотрудничать со всеми желающими. В некоторых случаях, мнение автора может не совпадать с мнением автора! Phone: +7-902-924-70-49.

Top.Mail.Ru
Top.Mail.Ru LiveInternet Rambler's Top100 Яндекс.Метрика