1+ import json
12import logging
23from unittest import mock
34
45from 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():
2830def 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