Telezab/utilities/log_manager.py
UdoChudo 52e31864b3 feat: Develop web interface
- Implemented the initial version of the web interface.
refactor: Begin Telegram bot refactoring
- Started restructuring the bot’s code for better maintainability.
chore: Migrate to Flask project structure
- Reorganized the application to follow Flask's project structure.
cleanup: Extensive code cleanup
- Removed redundant code and improved readability.

Signed-off-by: UdoChudo <stream@udochudo.ru>
2025-06-10 14:39:11 +05:00

134 lines
4.3 KiB
Python

import logging
import sys
from logging.config import dictConfig
class UTF8StreamHandler(logging.StreamHandler):
def __init__(self, stream=None):
super().__init__(stream or sys.stdout)
self.setStream(stream or sys.stdout)
def setStream(self, stream):
super().setStream(stream)
if hasattr(stream, 'reconfigure'):
stream.reconfigure(encoding='utf-8')
class FilterByMessage(logging.Filter):
def filter(self, record):
# Фильтруем сообщения, содержащие 'Received 1 new updates'
return 'Received ' not in record.getMessage()
class LogManager:
def __init__(self):
self.setup_logging()
def setup_logging(self):
dictConfig({
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'default': {
'format': '[%(asctime)s] %(levelname)s %(module)s: %(message)s',
},
'debug': {
'format': '[%(asctime)s] %(levelname)s %(module)s [%(funcName)s:%(lineno)d]: %(message)s'
}
},
'filters': {
'filter_by_message': {
'()': FilterByMessage,
}
},
'handlers': {
'console': {
'()': UTF8StreamHandler,
'stream': 'ext://sys.stdout',
'formatter': 'default',
'filters': ['filter_by_message'],
},
},
'root': {
'level': 'WARNING',
'handlers': ['console']
},
'loggers': {
'flask': {
'level': 'DEBUG',
'handlers': ['console'],
'propagate': False,
},
'telebot': {
'level': 'INFO',
'handlers': ['console'],
'propagate': False,
},
'werkzeug': {
'level': 'DEBUG',
'handlers': ['console'],
'propagate': False,
},
'flask_ldap3_login': {
'level': 'DEBUG',
'handlers': ['console'],
'propagate': False,
},
'flask_login': {
'level': 'DEBUG',
'handlers': ['console'],
'propagate': False,
},
'pyzabbix': {
'level': 'DEBUG',
'handlers': ['console'],
'propagate': False,
},
'app': {
'level': 'DEBUG',
'handlers': ['console'],
'propagate': False,
},
'pika': {
'level': 'INFO',
'handlers': ['console'],
'propagate': False,
},
'users_service': {
'level': 'DEBUG',
'handlers': ['console'],
'propagate': False,
},
'regions_service': {
'level': 'DEBUG',
'handlers': ['console'],
'propagate': False,
},
'debug': {
'level': 'DEBUG',
'handlers': ['console'],
'propagate': False,
},
}
})
def change_log_level(self, component, level):
"""Changes the log level of a specified component."""
if level not in ['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL']:
return False, 'Invalid log level'
log_level = getattr(logging, level, logging.DEBUG)
if component in self.get_all_loggers():
logger = logging.getLogger(component)
logger.setLevel(log_level)
for handler in logger.handlers:
handler.setLevel(log_level)
return True, f'Log level for {component} changed to {level}'
else:
return False, 'Invalid component'
def get_all_loggers(self):
"""Returns a list of all configured loggers."""
return list(logging.Logger.manager.loggerDict.keys())