diff --git a/example.py b/example.py new file mode 100644 index 0000000..a62f321 --- /dev/null +++ b/example.py @@ -0,0 +1,39 @@ +# Copyright (c) ChernV (@otter18), 2021. + +import logging + +import tg_logger + +# Logging format +logging.basicConfig(format='%(asctime)s:%(name)s:%(levelname)s - %(message)s') +formatter = logging.Formatter('%(name)s:%(levelname)s - %(message)s') + +# Setup TgLoggerHandler +tg_handler = tg_logger.TgLoggerHandler( + token="1234567890:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", # tg bot token + users=[111111111], # list of user_id + timeout=10 # default value is 10 seconds +) +tg_handler.setFormatter(formatter) +logger = logging.getLogger() +logger.setLevel(logging.INFO) +logger.addHandler(tg_handler) + +# Test +logger.info("Hello from tg_logger by @chernykh_vladimir") + +# TgFileLogger example +tg_files_logger = tg_logger.TgFileLogger( + token="1234567890:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", # tg bot token + users=[111111111], # list of user_id + timeout=10 # default is 10 seconds +) + +file_name = "test.txt" +with open(file_name, 'w') as example_file: + example_file.write("Hello from tg_logger by otter18") + +tg_files_logger.send(file_name, "Test file") + +# And one more time... +logger.info("Finishing tg_logger demo") diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..49caed3 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +pytelegrambotapi diff --git a/tg_logger.py b/tg_logger.py new file mode 100644 index 0000000..0fa41ed --- /dev/null +++ b/tg_logger.py @@ -0,0 +1,85 @@ +# Copyright (c) ChernV (@otter18), 2021. + +import logging +from logging import StreamHandler +from time import time, sleep +from typing import List + +import telebot + +# logging setup +logger = logging.getLogger(__name__) +logger.setLevel(logging.INFO) + + +class TgLoggerHandler(StreamHandler): + """Logger handler for tg_logger""" + + def __init__(self, token: str, users: List[int], timeout: int = 10): + """ + Setup TgLoggerHandler tool + + :param token: tg bot token to log form + :param users: list of used_id to log to + :param timeout: seconds for retrying to send log if error occupied + """ + + super().__init__() + self.token = token + self.users = users + self.timeout = timeout + + self.bot = telebot.TeleBot(token=self.token) + + def emit(self, record): + msg = self.format(record) + for user_id in self.users: + t0 = time() + while time() - t0 < self.timeout: + try: + self.bot.send_message(user_id, msg) + break + except Exception as ex: + logger.exception("Exception while sending %s to %s:", msg, user_id) + sleep(1) + + +class TgFileLogger: + """tg_logger tool to send files""" + + def __init__(self, token: str, users: List[int], timeout: int = 10): + """ + Setup TgFileLogger tool + + :param token: tg bot token to log form + :param users: list of used_id to log to + :param timeout: seconds for retrying to send log if error occupied + """ + + self.token = token + self.users = users + self.timeout = timeout + + self.bot = telebot.TeleBot(token=self.token) + + def send(self, file_path: str, caption: str = ''): + """ + Function to send file + + :param file_path: file path to log + :param caption: text to file with file + + :return: None + """ + + with open(file_path, 'rb') as data: + for user_id in self.users: + t0 = time() + while time() - t0 < self.timeout: + try: + self.bot.send_document(user_id, data=data, caption=caption) + logger.info("File %s successfully send to %s", file_path, user_id) + break + except Exception as ex: + logger.exception("Exception while sending %s to %s:", file_path, user_id) + sleep(1)