Skip to content

Commit 601b653

Browse files
committed
address PR feedback
1 parent f782b63 commit 601b653

File tree

2 files changed

+64
-37
lines changed

2 files changed

+64
-37
lines changed

google/api_core/client_logging.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
_LOGGING_INITIALIZED = False
88
_BASE_LOGGER_NAME = "google"
99

10-
# TODO(https://github.com/googleapis/python-api-core/issues/761): Update this list to support additional logging fields
10+
# TODO(https://github.com/googleapis/python-api-core/issues/761): Update this list to support additional logging fields.
1111
_recognized_logging_fields = [
1212
"httpRequest",
1313
"rpcName",
@@ -50,7 +50,7 @@ def configure_defaults(logger):
5050
logger.addHandler(console_handler)
5151

5252

53-
def setup_logging(scopes=[]):
53+
def setup_logging(scopes=""):
5454

5555
# only returns valid logger scopes (namespaces)
5656
# this list has at most one element.
@@ -70,6 +70,8 @@ def setup_logging(scopes=[]):
7070

7171

7272
class StructuredLogFormatter(logging.Formatter):
73+
# TODO(https://github.com/googleapis/python-api-core/issues/761): ensure that additional fields such as
74+
# function name, file name, and line no. appear in a log output.
7375
def format(self, record):
7476
log_obj = {
7577
"timestamp": self.formatTime(record),

tests/unit/test_client_logging.py

Lines changed: 60 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1+
import json
12
import logging
23
from unittest import mock
34

45
from google.api_core.client_logging import (
56
setup_logging,
67
initialize_logging,
8+
StructuredLogFormatter,
79
)
810

911

@@ -28,10 +30,10 @@ def test_setup_logging_w_no_scopes():
2830
def test_setup_logging_w_base_scope():
2931
with mock.patch("google.api_core.client_logging._BASE_LOGGER_NAME", "foo"):
3032
setup_logging("foo")
31-
base_logger = logging.getLogger("foo")
32-
assert isinstance(base_logger.handlers[0], logging.StreamHandler)
33-
assert not base_logger.propagate
34-
assert base_logger.level == logging.DEBUG
33+
base_logger = logging.getLogger("foo")
34+
assert isinstance(base_logger.handlers[0], logging.StreamHandler)
35+
assert not base_logger.propagate
36+
assert base_logger.level == logging.DEBUG
3537

3638
reset_logger("foo")
3739

@@ -40,15 +42,15 @@ def test_setup_logging_w_module_scope():
4042
with mock.patch("google.api_core.client_logging._BASE_LOGGER_NAME", "foo"):
4143
setup_logging("foo.bar")
4244

43-
base_logger = logging.getLogger("foo")
44-
assert base_logger.handlers == []
45-
assert not base_logger.propagate
46-
assert base_logger.level == logging.NOTSET
45+
base_logger = logging.getLogger("foo")
46+
assert base_logger.handlers == []
47+
assert not base_logger.propagate
48+
assert base_logger.level == logging.NOTSET
4749

48-
module_logger = logging.getLogger("foo.bar")
49-
assert isinstance(module_logger.handlers[0], logging.StreamHandler)
50-
assert not module_logger.propagate
51-
assert module_logger.level == logging.DEBUG
50+
module_logger = logging.getLogger("foo.bar")
51+
assert isinstance(module_logger.handlers[0], logging.StreamHandler)
52+
assert not module_logger.propagate
53+
assert module_logger.level == logging.DEBUG
5254

5355
reset_logger("foo")
5456
reset_logger("foo.bar")
@@ -58,16 +60,16 @@ def test_setup_logging_w_incorrect_scope():
5860
with mock.patch("google.api_core.client_logging._BASE_LOGGER_NAME", "foo"):
5961
setup_logging("abc")
6062

61-
base_logger = logging.getLogger("foo")
62-
assert base_logger.handlers == []
63-
assert not base_logger.propagate
64-
assert base_logger.level == logging.NOTSET
63+
base_logger = logging.getLogger("foo")
64+
assert base_logger.handlers == []
65+
assert not base_logger.propagate
66+
assert base_logger.level == logging.NOTSET
6567

66-
# TODO(https://github.com/googleapis/python-api-core/issues/759): update test once we add logic to ignore an incorrect scope.
67-
logger = logging.getLogger("abc")
68-
assert isinstance(logger.handlers[0], logging.StreamHandler)
69-
assert not logger.propagate
70-
assert logger.level == logging.DEBUG
68+
# TODO(https://github.com/googleapis/python-api-core/issues/759): update test once we add logic to ignore an incorrect scope.
69+
logger = logging.getLogger("abc")
70+
assert isinstance(logger.handlers[0], logging.StreamHandler)
71+
assert not logger.propagate
72+
assert logger.level == logging.DEBUG
7173

7274
reset_logger("foo")
7375
reset_logger("abc")
@@ -79,25 +81,48 @@ def test_initialize_logging():
7981
with mock.patch("google.api_core.client_logging._BASE_LOGGER_NAME", "foo"):
8082
initialize_logging()
8183

82-
base_logger = logging.getLogger("foo")
83-
assert base_logger.handlers == []
84-
assert not base_logger.propagate
85-
assert base_logger.level == logging.NOTSET
84+
base_logger = logging.getLogger("foo")
85+
assert base_logger.handlers == []
86+
assert not base_logger.propagate
87+
assert base_logger.level == logging.NOTSET
8688

87-
module_logger = logging.getLogger("foo.bar")
88-
assert isinstance(module_logger.handlers[0], logging.StreamHandler)
89-
assert not module_logger.propagate
90-
assert module_logger.level == logging.DEBUG
89+
module_logger = logging.getLogger("foo.bar")
90+
assert isinstance(module_logger.handlers[0], logging.StreamHandler)
91+
assert not module_logger.propagate
92+
assert module_logger.level == logging.DEBUG
9193

92-
base_logger.propagate = True
93-
module_logger.propagate = True
94+
# Check that `initialize_logging()` is a no-op after the first time by verifying that user-set configs are not modified:
95+
base_logger.propagate = True
96+
module_logger.propagate = True
9497

95-
with mock.patch("os.getenv", return_value="foo.bar"):
96-
with mock.patch("google.api_core.client_logging._BASE_LOGGER_NAME", "foo"):
9798
initialize_logging()
9899

99-
assert base_logger.propagate
100-
assert module_logger.propagate
100+
assert base_logger.propagate
101+
assert module_logger.propagate
101102

102103
reset_logger("foo")
103104
reset_logger("foo.bar")
105+
106+
107+
def test_structured_log_formatter():
108+
# TODO(https://github.com/googleapis/python-api-core/issues/761): Test additional fields when implemented.
109+
record = logging.LogRecord(
110+
name="foo",
111+
level=logging.DEBUG,
112+
msg="This is a test message.",
113+
pathname="foo/bar",
114+
lineno=25,
115+
args=None,
116+
exc_info=None,
117+
)
118+
119+
# Extra fields:
120+
record.rpcName = "bar"
121+
122+
formatted_msg = StructuredLogFormatter().format(record)
123+
parsed_msg = json.loads(formatted_msg)
124+
125+
assert parsed_msg["name"] == "foo"
126+
assert parsed_msg["severity"] == "DEBUG"
127+
assert parsed_msg["message"] == "This is a test message."
128+
assert parsed_msg["rpcName"] == "bar"

0 commit comments

Comments
 (0)