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

[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] + "\t" +  today.strftime("%Y-%m-%d %H:%M:%S") + "\t" + str(data) + "\n")
      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. Если вы не можете найти нужных вам инструментов — делайте их сами!

• Перейти в архив


Комментарии

Включите JavaScript для комментирования.


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

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

Рейтинг@Mail.ru LiveInternet Rambler's Top100 Яндекс.Метрика