Включить логирование в Телеграмме

Обнаружена блокировка рекламы: Наш сайт существует благодаря показу онлайн-рекламы нашим посетителям. Пожалуйста, подумайте о поддержке нас, отключив блокировщик рекламы на нашем веб-сайте.

Скрипт оповещения в телеграмм

Здесь выкладываем скрипты

Правила форума
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.

Нашел на просторах, решил поделиться. Позволяет отправлять в телеграмм уведомление с нужной строчкой из лога. Скрипт работает при условии, что вы уже настроили телеграмм-бота (botfather). Создаете планировщик с именем LogMikrotik, выставляете нужный промежуток запуска и вставляете код из спойлера, предварительно вписав данные своего бота.

Где скрытое меню в Telegram

В этой конструкции пишутся слова, которые вы хотите отслеживать из лога и отправлять в уведомления:

:local startBuf [:toarray [/log find message~”logged in” || message~”login failure”]]
Сюда же пишутся слова для игнорирования отправки.
:local removeThese
# BEGIN SETUP :local scheduleName «LogMikrotik» local bot «BOT TELEGRAM ANDA» local ChatID «CHAT ID ANDA» :local startBuf [:toarray [/log find message~»logged in» || message~»login failure»]] :local removeThese # END SETUP # warn if schedule does not exist :if ([:len [/system scheduler find name=»$scheduleName»]] = 0) do= < /log warning «[LOGMON] ERROR: Schedule does not exist.

Create schedule and edit script to match name» ># get last time :local lastTime [/system scheduler get [find name=»$scheduleName»] comment] # for checking time of each log entry :local currentTime # log message :local message # final output :local output :local keepOutput false # if lastTime is empty, set keepOutput to true :if ([:len $lastTime] = 0) do= < :set keepOutput true >:local counter 0 # loop through all log entries that have been found :foreach i in=$startBuf do= < # loop through all removeThese array items :local keepLog true :foreach j in=$removeThese do=< # if this log entry contains any of them, it will be ignored :if ([/log get $i message] ~ «$j») do=< :set keepLog false >> :if ($keepLog = true) do= < :set message [/log get $i message] # LOG DATE # depending on log date/time, the format may be different. 3 known formats # format of jan/01/2002 00:00:00 which shows up at unknown date/time. Using as default :set currentTime [ /log get $i time ] # format of 00:00:00 which shows up on current day’s logs :if ([:len $currentTime] = 8 ) do=< :set currentTime ([:pick [/system clock get date] 0 11].» «.$currentTime) >else= < # format of jan/01 00:00:00 which shows up on previous day’s logs :if ([:len $currentTime] = 15 ) do=< :set currentTime ([:pick $currentTime 0 6].»/».[:pick [/system clock get date] 7 11].» «.[:pick $currentTime 7 15]) >> # if keepOutput is true, add this log entry to output :if ($keepOutput = true) do= < :set output ($output.$currentTime.» «.$message.»rn») >:if ($currentTime = $lastTime) do= < :set keepOutput true :set output «» >> :if ($counter = ([:len $startBuf]-1)) do= < :if ($keepOutput = false) do=< :if ([:len $message] >0) do= < :set output ($output.$currentTime.» «.$message.»rn») >> > :set counter ($counter + 1) > if ([:len $output] > 0) do=< /system scheduler set [find name=»$scheduleName»] comment=$currentTime /tool fetch url=»https://api.telegram.org/bot$bot/sendmessage?chat_id=$ChatID keep-result=no; >
У меня приходят уведомления так

Зачем разработчики засекретили эти функции в Телеграм. Как попасть в секретное меню Телеграм?

Изображение

Доброе!
Подскажите, а есть какой-нибудь способ заставить ходить fetch через прокси ? как сurl, например.
спасибо

спасибо большое. получилось
Жалко в России уже не работает.
Остановите Землю, я сойду.
14 мар 2020, 18:23
Жалко в России уже не работает.

Телеграмм? Да ладно! От болталок школьников до каналов государственных предприятий всё работает. Видимо у вас какая-то другая Россия. Может вы из будущего?

Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? . Тогда Netinstal’ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам.

Если не подскажем, хоть посочувствуем.

Добавлю ссылку на оригинал статьи где подробно в видео показывается как добавить CHAT_ID и TOKEN

1) у меня (и как выяснилось, не только у меня) почему-то приходят повторные сообщения ровно в полночь и еще в 3 ночи (возможно это как-то связано с часовым поясом, но это точно связано с отображением времени логов в терминале (в эти часы меняется формат (время-дата_время))), по этому решил добавить пару строк, чтобы запретить отправку именно в это время..
2) скрипт шлёт только по одному сообщению (даже если их сразу несколько новых, то приходит только одно из них), методом «тыка» и потанцевав с бубном было выяснено: телеграм не переваривает «rn» в тексте сообщения, в итоге нарыл что перенос делается так «%0A»
3) (это уже чисто по желанию) добавил оповещение о подключающихсяотключающихся по вайфаю устройствах (мне например так удобно узнавать когда начальник пришел в офис ) + описание мака устройства, которое берется из комментария статической дхцп лесс записи
4) отредактировал counter счетчик, чтоб присылал не одно, а 5 последних сообщений (учитывая все вышеперечисленные поправки)

Еще по теме:  Как отменить удаление переписки в Телеграмм

# BEGIN SETUP :local scheduleName «LogMikrotik» :local bot «BOT TELEGRAM ANDA» :local ChatID «CHAT ID ANDA» :local startBuf [:toarray [/log find message~»logged in» || topics~»wireless» || topics~»error» || topics~»warning» || topics~»critical»]] :local removeThese :local name [/system identity get name] :local TimeNow [:pick [/system clock get time] 0 5] :local TimeOFF [:toarray («00:00″,»03:00″)] # END SETUP # warn if schedule does not exist :if ([:len [/system scheduler find name=»$scheduleName»]] = 0) do= < /log warning «[LOGMON] ERROR: Schedule does not exist. Create schedule and edit script to match name» ># get last time :local lastTime [/system scheduler get [find name=»$scheduleName»] comment] # for checking time of each log entry :local currentTime # log message :local message # final output :local output :local keepOutput false # if lastTime is empty, set keepOutput to true :if ([:len $lastTime] = 0) do= < :set keepOutput true >:local counter 0 # loop through all log entries that have been found :foreach i in=$startBuf do= < # loop through all removeThese array items :local keepLog true :foreach j in=$removeThese do=< # if this log entry contains any of them, it will be ignored :if ([/log get $i message] ~ «$j») do=< :set keepLog false >> :if ($keepLog = true) do= < :set message [/log get $i message] # LOG DATE # depending on log date/time, the format may be different. 3 known formats # format of jan/01/2002 00:00:00 which shows up at unknown date/time. Using as default :set currentTime [ /log get $i time ] # format of 00:00:00 which shows up on current day’s logs :if ([:len $currentTime] = 8 ) do=< :set currentTime ([:pick [/system clock get date] 0 11].» «.$currentTime) >else= < # format of jan/01 00:00:00 which shows up on previous day’s logs :if ([:len $currentTime] = 15 ) do=< :set currentTime ([:pick $currentTime 0 6].»/».[:pick [/system clock get date] 7 11].» «.[:pick $currentTime 7 15]) >> # if keepOutput is true, add this log entry to output :if ($keepOutput = true) do= < :if ([/log get $i message] ~ «[0-F][0-F]:[0-F][0-F]:[0-F][0-F]:[0-F][0-F]:[0-F][0-F]:[0-F][0-F]») do=< :foreach k in=[/ip dhcp-server lease find] do=< :local mac [/ip dhcp-server lease get $k value-name=mac-address] if ([/log get $i message] ~ «$mac») do=< :set message ($message . » / » . [/ip dhcp-server lease get $k value-name=comment]) >> > :set output ($output.$currentTime.» «.$message.»%0A%0A») > :if ($currentTime = $lastTime) do= < :set keepOutput true :set output «» >> # pri nali4ii kommenta shedulera i nesootvetstviya ego ni odnomu vremeni zapisi loga, otpravlyat’ 5 poslednih sobytiy (udovletvoryayus4ih vsem usloviyam) :if ($counter >= ([:len $startBuf]-5)) do= < :if ($keepOutput = false) do=< :if ([:len $message] >0) do= < :if ([/log get $i message] ~ «[0-F][0-F]:[0-F][0-F]:[0-F][0-F]:[0-F][0-F]:[0-F][0-F]:[0-F][0-F]») do=< :foreach k in=[/ip dhcp-server lease find] do=< :local mac [/ip dhcp-server lease get $k value-name=mac-address] if ([/log get $i message] ~ «$mac») do=< :set message ($message . » / » . [/ip dhcp-server lease get $k value-name=comment]) >> > :if ($counter = ([:len $startBuf]-5)) do= :set output ($output.$currentTime.» «.$message.»%0A%0A») > > > :set counter ($counter + 1) > if (([:len $output] > 0) and ($TimeOFF ~ $TimeNow)) do= < /system scheduler set [find name=»$scheduleName»] comment=$currentTime >else= < if ([:len $output] >0) do= < /system scheduler set [find name=»$scheduleName»] comment=$currentTime /tool fetch url=»https://api.telegram.org/bot$bot/sendmessage?chat_id=$ChatID keep-result=no; >>

Источник: forummikrotik.ru

Логирование в телеграм, или история о том, как я сделал питон библиотеку

Модуль logging в питоне — это мощный инструмент в разработки. Он помогает отследить ошибки, наблюдать за работой приложения и даже собирать статистику об использовании вашего сервиса. В этой статье я расскажу, как можно расширить возможности этого модуля и причем тут телеграмм.

Intro

Давным-давно, а точнее несколько месяцев назад, накануне Нового года, я сидел дома и решал задачу по машинному обучению. Связана она была с нейронными сетями и классификацией текстов, поэтому я естественно пользовался бесплатным GPU от гугла (colab). За окном шел снег, а модели обучались ну уж очень долго. Обучать модель оставалось всего несколько минут, как вдруг появляется уведомление, что подключение к runtime потеряно, а это значит, что обученную модель и сабмиты из этого runtime скачать я не смогу, и все придется начинать заново.

Еще по теме:  Почему тормозит Телеграмм на компе

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

Копировал я этот код из ноутбука (jupyter notebook) в ноутбук, а потом осознал, что это можно встроить в модуль logging и завернуть в библиотеку, чтобы не таскать каждый раз большие куски кода, а использовать всего пару строк.

Logging.handlers

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

Tg-logger

И вот, держа в голове все вышеописанные идеи, я отправился писать свою библиотеку. Вот, что получилось.

Чтобы воспользоваться библиотекой нужно:

Установим библиотеку через pip.

pip install tg-logger

Рассмотрим код примера

import logging import tg_logger # Telegram data token = «1234567890:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA» users = [1111111111] # Base logger logger = logging.getLogger(‘foo’) logger.setLevel(logging.INFO) # Logging bridge setup tg_logger.setup(logger, token=token, users=users) # Test logger.info(«Hello from tg_logger by otter18»)

Особо интересна для нас строка, в которой подключается логирование в телеграмм.

# Logging bridge setup tg_logger.setup(logger, token=token, users=users)

В функцию setup() нужно просто передать тот logger, к которому вы хотите подключить мост. Если заглянуть в документацию, то можно посмотреть на другие параметры функции setup(). С помощью них можно, в частности, настроить формат, в котором логи будут отправлены.

Outro

  • Весь исходный код есть на гитхабе: github.com/otter18/tg_logger.
  • Документация на английском есть на Read the Docs.
  • Библиотека доступна для скачивания через pip: pypi.org/project/tg-logger/.

Ну и напоследок напоминаю вам о нашем новом проекте vkserfing bot.

Источник: mailsgun.ru

Логирование в Python

В переводе с английского log — это «журнал». Логирование — это ведение «бортового журнала», автоматическая запись событий в специальный файл или вывод таких записей в терминал. Логи — это дополнительная система мониторинга, и разработчик может настроить логирование в тех местах, за которыми нужно присматривать.

Зачастую для отладки кода и вывода служебных сообщений применяют print() , но логи позволяют делать то же самое гибче и удобнее.

Более того, с помощью логов можно не просто выводить сообщения об ошибке, но и сортировать сообщения по степени важности, записывать время события или другую служебную информацию о нём. В логах могут быть многие тысячи записей, но если известно, в какой период времени случилась ошибка — можно найти записи за этот период и выяснить, что случилось.

Всегда лучше работать через логи, а не выводить на печать через print() .

Библиотека logging в Python

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

«Внимание, красный уровень!»

По умолчанию в библиотеке logging задано пять «уровней» сообщений, по степени важности. Обычно их бывает достаточно, но при необходимости можно создать свой уровень.

Запустите файл с таким кодом:

Логи будут выведены так:

WARNING:root:Большая нагрузка, хелп ERROR:root:Бот не смог отправить сообщение CRITICAL:root:Всё упало! Зовите админа!1!111

Первые два уровня по умолчанию не будут выводиться в консоль: они предназначены для текущего информирования и нужны разработчику при отладке кода. В сообщения этого уровня не принято выводить информацию непосредственно о работе программы.

Разные уровни логирования нужны для сортировки сообщений по важности. Это облегчает поиск и работу с сообщениями.

DEBUG — уровень отладки: на этом уровне выводится всякая служебная информация: «Произошёл запуск функции», «переменная содержит такое-то значение». Это сообщения о том, что происходит в коде, информация для разработчика.

INFO — информация о текущих событиях: этот уровень применяют, если нужно убедиться, что всё идёт по плану: «Письмо отправлено», «Запись в базе создана».

Еще по теме:  Как в недавних действиях в Телеграмме удалить сообщение

WARNING — «тревожный звоночек»: проблемы нет, но есть что-то, что может привести к проблеме; что-то, на что следует обратить внимание.

ERROR — это ошибка: что-то работает не так, как нужно. Требуется вмешательство и исправление ошибки.

CRITICAL — случилось что-то совсем критичное: надо всё бросать и бежать к компьютеру; всё сломалось. Не очень часто используется на практике, обычно бывает достаточно ERROR.

Настройка логов

По умолчанию в терминал выводятся только наиболее важные логи, от уровня WARNING и выше: WARNING → ERROR → CRITICAL.

Сообщения с уровнями ниже WARNING, то есть DEBUG и INFO, по умолчанию отключены и никуда не выводятся.

Эти настройки можно изменить, вызвав метод для конфигурации логов basicConfig() и передав в параметр level уровень, с которого нужно фиксировать сообщения:

logging.basicConfig(level=logging.DEBUG)

Форматирование логов

Без предварительной настройки логи записываются в таком формате:

УРОВЕНЬ ВАЖНОСТИ:текущий пользователь:сообщение

Этот формат можно изменить: в метод basicConfig() передаётся параметр format , а в нём описывается содержимое лога:

logging.basicConfig(format=’%(asctime)s, %(levelname)s, %(name)s, %(message)s’)

asctime — это время события,
levelname — уровень важности,
name — имя логера,
message — текст сообщения.

Для описания атрибутов используется «%-форматирование»: атрибут берётся в скобки, перед скобками ставится символ % , а после скобок указывают тип данных, например:

s — строка (string),
d — число (digit).

Помимо времени и уровня есть и другие полезные атрибуты для форматирования логов:

filename — имя файла, из которого отправлено сообщение в лог;
funcName — имя функции, из которой отправлено сообщение в лог;
lineno — номер строки в том файле, из которого отправлено сообщение в лог.

Сохранение логов в файл

Чтобы сохранять лог-сообщения в файл, нужно передать соответствующие параметры в метод basicConfig() , указав имя файла с расширением .log и режим записи:

logging.basicConfig(filename=’main.log’, filemode=’w’)

Значения параметра filemode :

w — содержимое файла перезаписывается при каждом запуске программы;
x — создать файл и записывать логи в него; если файл с таким именем уже существует — будет ошибка;
a — дописывать новые логи в конец указанного файла.

Ротация логов

Логи со временем растут, занимают всё больше места и, в результате, могут занять всё дисковое пространство. Чтобы контролировать объём логов, можно выставить ограничение на размер этих файлов и на их количество.

Когда размер первого файла достигнет установленного предела — будет создан следующий файл, а когда количество файлов дойдёт до заданного количества — начнёт перезаписываться самый первый файл. И так по кругу: это называется ротацией логов.

Логер — это такая коробка или корзина, в которую Python скидывает лог-сообщения. Логер обрабатывает эти сообщения тем способом, который для него установлен.

import logging from logging.handlers import RotatingFileHandler # здесь мы задаем глобальную конфигурацию для всех логеров logging.basicConfig( level=logging.DEBUG, filename=’program.log’, format=’%(asctime)s, %(levelname)s, %(message)s, %(name)s’ ) # а тут настраиваем логгер для текущего файла .py logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) handler = RotatingFileHandler(‘my_logger.log’, maxBytes=50000000, backupCount=5) logger.addHandler(handler)

Логеров может быть несколько: обычно пишут отдельный логер для каждого пакета. Имя логерам традиционно дают по имени __name__ пакета, для которого он создан. Когда в проекте больше одного пакета — такая структура логирования упрощает работу.

Далее в коде создан handler и добавлен в логер. Handler — это диспетчер логов, он берёт готовые логи, переданные в логер и обрабатывает их нужным образом.

В листинге применён RotatingFileHandler, он управляет ротацией логов: добавляет новые записи в файл, следит за объёмом и количеством лог-файлов. В параметрах RotatingFileHandler указывается максимальный размер одного лог-файла и предельное количество таких файлов. Также в нём указывается путь и имя файлов, так что при использовании RotatingFileHandler не нужно создавать файл через basicConfig .

Увидеть логи можно не только в файле, куда они сохранены: можно читать их в реальном времени при выполнении программы:

tail -f main.log

Логи из файла main.log будут выводиться в терминал, отображая самые последние события.

Логирование исключений

Исключения тоже можно логировать, но делать это нужно не всегда. Тут нет какого-то готового правила, разработчик обычно сам решает, какие исключения следует логировать, а какие нет.

Самый простой способ логирования исключений:

try: 42 / 0 except Exception as error: logging.error(error, exc_info=True)

Без параметра exc_info в лог запишется только текст исключения. Существует более компактная запись, с помощью метода logging.exception() :

try: 42 / 0 except Exception: logging.exception()

Перехватывать все исключения сразу — плохая практика. При таком подходе можно и не узнать о проблемах, потому что программа продолжит выполняться. Однако такой вариант возможен в некоторых случаях, например, когда вы пишите чат-бота и важно, чтобы он не падал, когда какой-то из запросов не выполнится.

Похожие записи:

  1. Библиотека python-telegram-bot
  2. Логирование в Python. Задание
  3. Бот в Telegram
  4. Дополнительные возможности ORM

Источник: mob25.com

Рейтинг
( Пока оценок нет )
Загрузка ...