1+ import inspect
2+ import logging
13import os
4+ import sys
5+ from typing import Optional , Union
26
37from dotenv import find_dotenv , load_dotenv
48from loguru import logger
711basedir = os .path .abspath (os .path .dirname (__file__ ))
812
913
14+ class InterceptHandler (logging .Handler ):
15+ """
16+ Обработчик (из документации `loguru`) ловит все сообщения от стандартного `logging` и передаёт их в `loguru`.
17+ """
18+
19+ def emit (self , record : logging .LogRecord ) -> None :
20+ # Get corresponding Loguru level if it exists.
21+ level : Union [str , int ]
22+ try :
23+ level = logger .level (record .levelname ).name
24+ except ValueError :
25+ level = record .levelno
26+
27+ # Find caller from where originated the logged message.
28+ frame , depth = inspect .currentframe (), 0
29+ while frame and (depth == 0 or frame .f_code .co_filename == logging .__file__ ):
30+ frame = frame .f_back
31+ depth += 1
32+
33+ logger .opt (depth = depth , exception = record .exc_info ).log (level , record .getMessage ())
34+
35+
1036def get_config ():
1137 """Получение настроек проекта."""
1238 env = os .getenv ('FLASK_ENV' , 'production' )
39+ logging .basicConfig (handlers = [InterceptHandler ()], level = 0 , force = True )
1340 if env == 'development' :
14- return DevelopConfig
41+ return DevelopConfig ()
1542 else :
16- return ProductionConfig
43+ return ProductionConfig ()
1744
1845
1946class LoggerConfig :
2047 logger = logger
2148
22- def __init__ (self , file_name ) -> None :
49+ def custom_filter (self , record : dict ):
50+ """
51+ Фильтрация записи в файл.
52+ """
53+ return True if self .file_name == record .get ('extra' ).get ('logger' ) else False
54+
55+ def __init__ (
56+ self ,
57+ file_name ,
58+ extra_format = '{extra[logger]} {message}' ,
59+ ) -> None :
60+ self .file_name = file_name
61+
62+ custom_filter = self .custom_filter
63+
2364 self .logger .add (
2465 f'logs/{ file_name } .log' ,
2566 backtrace = True ,
2667 diagnose = True ,
2768 rotation = '20 MB' ,
69+ retention = 5 ,
70+ format = extra_format ,
71+ filter = custom_filter ,
72+ enqueue = True ,
2873 )
2974
3075
@@ -56,12 +101,14 @@ class DevelopConfig:
56101
57102 BOT_TOKEN = os .getenv ('token' )
58103 URL_ADMIN = os .getenv ('URL_ADMIN' )
59- web_logger = LoggerConfig ('test-web' ).logger
60- bot_logger = LoggerConfig ('test-bot' ).logger
61104
62105 def __name__ (self ):
63106 return 'DevelopConfig'
64107
108+ def __init__ (self ) -> None :
109+ self .web_logger = LoggerConfig ('web' , '{extra[logger]} {message}' ).logger .bind (logger = 'web' )
110+ self .bot_logger = LoggerConfig ('bot' , '{extra[logger]} {message}' ).logger .bind (logger = 'bot' )
111+
65112
66113class ProductionConfig :
67114 DASHBOARD_EXPENSE = os .getenv ('DASHBOARD_EXPENSE' )
@@ -76,11 +123,12 @@ class ProductionConfig:
76123 BOT_TOKEN = os .getenv ('token' )
77124 URL_ADMIN = os .getenv ('URL_ADMIN' )
78125
79- web_logger = LoggerConfig ('web' ).logger
80- bot_logger = LoggerConfig ('bot' ).logger
81-
82126 def __name__ (self ):
83127 return 'ProductionConfig'
84128
129+ def __init__ (self ) -> None :
130+ self .web_logger = LoggerConfig ('web' , '{extra[logger]} {message}' ).logger .bind (logger = 'web' )
131+ self .bot_logger = LoggerConfig ('bot' , '{extra[logger]} {message}' ).logger .bind (logger = 'bot' )
132+
85133
86134settings = get_config ()
0 commit comments