11import logging
22import os
3+ from google .cloud .logging .handlers import CloudLoggingHandler
4+ import google .cloud .logging
35
46
57def get_env_logging_level ():
@@ -9,27 +11,54 @@ def get_env_logging_level():
911 return os .getenv ("LOGGING_LEVEL" , "INFO" )
1012
1113
14+ def is_local_env ():
15+ return os .getenv ("K_SERVICE" ) is None
16+
17+
1218class Logger :
1319 """
14- Util class for logging information, errors or warnings
20+ GCP-friendly logger: structured JSON output, works locally or in production.
1521 """
1622
17- def __init__ (self , name ):
18- """
19- Initialize the logger
20- """
21- formatter = logging .Formatter ("%(asctime)s %(levelname)s %(name)s %(message)s" )
22-
23- console_handler = logging .StreamHandler ()
24- console_handler .setFormatter (formatter )
25-
23+ def __init__ (self , name : str ):
2624 self .logger = logging .getLogger (name )
27- self .logger .addHandler (console_handler )
2825 self .logger .setLevel (get_env_logging_level ())
26+ self .logger .handlers .clear ()
27+
28+ # formatter = jsonlogger.JsonFormatter(
29+ # '%(asctime)s %(levelname)s %(name)s %(message)s'
30+ # )
31+
32+ if is_local_env ():
33+ handler = logging .StreamHandler ()
34+ else :
35+ try :
36+ client = google .cloud .logging .Client ()
37+ handler = CloudLoggingHandler (client )
38+ except Exception as e :
39+ # fallback to stdout if cloud client fails
40+ self .logger .error (f"GCP logging failed, using fallback: { e } " )
41+ handler = logging .StreamHandler ()
42+
43+ # handler.setFormatter(formatter)
44+ self .logger .addHandler (handler )
45+
46+ # Also configure SQLAlchemy to use this logger
47+ self .setup_sqlalchemy_logger (handler )
48+
49+ def setup_sqlalchemy_logger (self , handler ):
50+ sqlalchemy_loggers = [
51+ "sqlalchemy.engine" ,
52+ # "sqlalchemy.pool",
53+ # "sqlalchemy.dialects.postgresql",
54+ "sqlalchemy.engine.Engine"
55+ ]
56+ for logger_name in sqlalchemy_loggers :
57+ logger = logging .getLogger (logger_name )
58+ logger .setLevel (get_env_logging_level ())
59+ logger .handlers .clear ()
60+ logger .addHandler (handler )
61+ logger .propagate = False
2962
3063 def get_logger (self ):
31- """
32- Get the logger instance
33- :return: the logger instance
34- """
3564 return self .logger
0 commit comments