Skip to content

Commit 08ef13a

Browse files
committed
switch to systems instead of level
1 parent 59edb87 commit 08ef13a

File tree

1 file changed

+70
-46
lines changed

1 file changed

+70
-46
lines changed

google/api_core/client_logging.py

Lines changed: 70 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,84 @@
11
import logging
22
import json
3+
import re
34

5+
# NOTE: We can essentially just use `json.dumps` and make structured logging our default format.
6+
class DefaultFormatter(logging.Formatter):
7+
def format(self, record):
8+
# Base format with time, severity, and main message
9+
# base_message = f"{self.formatTime(record)} - {record.levelname} - {record.name} - {record.getMessage()}"
10+
base_message = super().format(record)
11+
12+
# Add any extra fields below:
13+
extra_info = []
14+
if hasattr(record, 'client_id'):
15+
extra_info.append(f"client_id={record.client_id}")
16+
if hasattr(record, 'response_id'):
17+
extra_info.append(f"client_id={record.client_id}")
18+
if hasattr(record, 'httpRequest'):
19+
extra_info.append(f"httpRequest={record.httpRequest}")
20+
if hasattr(record, 'json_fields'):
21+
for key, val in record.json_fields.items():
22+
extra_info.append(f"{key}={val}")
23+
24+
# Combine base message with extra fields
25+
if extra_info:
26+
base_message += " | " + " - ".join(extra_info)
27+
28+
return base_message
29+
30+
31+
# NOTE: Option 1: Allow users to configure log levels.
32+
# def setup_logging(log_level, namespace="google"):
33+
34+
# # NOTE: A logger with namespace="google" is only configured if all of the below conditions hold true:
35+
# # - A root logger is not configured.
36+
# # - N/A: A logger with namespace="google" is not already configured (This statement is removed.)
37+
# # - GOOGLE_SDK_PYTHON_LOGGING_LEVEL is set.
38+
# if not logging.getLogger().hasHandlers() and log_level:
439

5-
# class BaseLogger:
40+
# # define a module for our repositories
41+
# logger = logging.getLogger(namespace)
42+
# try:
43+
# logger.setLevel(log_level)
44+
# except ValueError:
45+
# logger.setLevel("WARNING")
46+
# logger.warning(f"Configured log level `{log_level}` is incorrect. Defaulting to WARNING.")
647

7-
# def __init__(self, log_level=logging.DEBUG):
8-
# self._logger = logging.getLogger("google")
9-
# self._logger.setLevel(log_level)
48+
# # Default settings
1049
# console_handler = logging.StreamHandler()
11-
# console_handler.setLevel(log_level)
1250
# formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
13-
# # formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(user_id)s - %(request_id)s - %(message)s') # Include extra fields
14-
# # formatter = DefaultFormatter()
1551
# console_handler.setFormatter(formatter)
16-
# self._logger.addHandler(console_handler)
17-
18-
# def get_logger(self):
19-
# return self._logger
20-
21-
22-
# class DefaultFormatter(logging.Formatter):
23-
# def format(self, record):
24-
# log_obj = {
25-
# 'timestamp': self.formatTime(record),
26-
# 'severity': record.levelname,
27-
# 'name': record.name,
28-
# 'message': record.getMessage(),
29-
# }
30-
# if hasattr(record, 'request'):
31-
# log_obj['request'] = record.request
32-
# if hasattr(record, 'response'):
33-
# log_obj['response'] = record.response
34-
# if hasattr(record, 'client_id'):
35-
# log_obj['client_id'] = record.client_id
36-
37-
# return json.dumps(log_obj)
52+
# logger.addHandler(console_handler)
53+
3854

55+
# NOTE: Option 2: Allow users to configure log systems.
56+
def setup_logging(namespace):
57+
58+
# Instantiate a base logger unconditionally to avoid propogating logs to the root logger.
59+
base_logger = logging.getLogger("google")
60+
base_logger.propagate = False
61+
62+
# If a namespace is not provided, we don't need to do anything.
63+
if not namespace:
64+
return
3965

40-
def setup_logging(log_level, namespace="google"):
66+
# If the provided namespace does not start with "google", we don't need to do anything.
67+
# We can update the regex to be more strict about the format of the namespace.
68+
match = re.search(f"google", namespace)
69+
if not match:
70+
# TODO: raise an error? silently ignore?
71+
return
4172

42-
# NOTE: A logger with namespace="google" is only configured if all of the below conditions hold true:
43-
# - A root logger is not configured.
44-
# - N/A: A logger with namespace="google" is not already configured (This statement is removed.)
45-
# - GOOGLE_SDK_PYTHON_LOGGING_LEVEL is set.
46-
if not logging.getLogger().hasHandlers() and log_level:
47-
48-
# define a module for our repositories
49-
logger = logging.getLogger(namespace)
50-
try:
51-
logger.setLevel(log_level)
52-
except ValueError:
53-
logger.setLevel("WARNING")
54-
logger.warning(f"Configured log level `{log_level}` is incorrect. Defaulting to WARNING.")
55-
56-
# Default settings
73+
74+
# This will either create a module level logger or get the reference of the base logger instantiated above.
75+
logger = logging.getLogger(namespace)
76+
77+
# Set default settings.
78+
if not logger.hasHandlers() and logger.level == logging.NOTSET:
5779
console_handler = logging.StreamHandler()
58-
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
80+
logger.setLevel("DEBUG")
81+
formatter = DefaultFormatter('%(asctime)s %(levelname)s %(name)s %(message)s')
82+
# formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
5983
console_handler.setFormatter(formatter)
6084
logger.addHandler(console_handler)

0 commit comments

Comments
 (0)