Skip to content

Commit 38485e1

Browse files
committed
feat: add support for json data
1 parent 224948b commit 38485e1

File tree

2 files changed

+31
-16
lines changed

2 files changed

+31
-16
lines changed

src/firebase_functions/logger.py

+24-15
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
class LogSeverity(str, _enum.Enum):
1313
"""
14-
`LogSeverity` indicates the detailed severity of the log entry. See
14+
`LogSeverity` indicates the detailed severity of the log entry. See
1515
[LogSeverity](https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#logseverity).
1616
"""
1717

@@ -35,18 +35,26 @@ class LogEntry(_typing.TypedDict):
3535
message: _typing_extensions.NotRequired[str]
3636

3737

38-
def _entry_from_args(severity: LogSeverity, **kwargs) -> LogEntry:
38+
def _entry_from_args(severity: LogSeverity, *args, **kwargs) -> LogEntry:
3939
"""
4040
Creates a `LogEntry` from the given arguments.
4141
"""
4242

4343
message: str = " ".join([
4444
value
4545
if isinstance(value, str) else _json.dumps(_remove_circular(value))
46-
for value in kwargs.values()
46+
for value in args
4747
])
4848

49-
return {"severity": severity, "message": message}
49+
object: _typing.Dict[str, _typing.Any] = {
50+
key: value if isinstance(value, str) else _remove_circular(value)
51+
for key, value in kwargs.items()}
52+
53+
entry = {"severity": severity, **object}
54+
if message:
55+
entry["message"] = message
56+
57+
return _typing.cast(LogEntry, entry)
5058

5159

5260
def _remove_circular(obj: _typing.Any,
@@ -65,7 +73,8 @@ def _remove_circular(obj: _typing.Any,
6573
refs.add(id(obj))
6674

6775
if isinstance(obj, dict):
68-
return {key: _remove_circular(value, refs) for key, value in obj.items()}
76+
return {
77+
key: _remove_circular(value, refs) for key, value in obj.items()}
6978
elif isinstance(obj, list):
7079
return [_remove_circular(value, refs) for _, value in enumerate(obj)]
7180
elif isinstance(obj, tuple):
@@ -86,36 +95,36 @@ def write(entry: LogEntry) -> None:
8695
print(_json.dumps(_remove_circular(entry)), file=write_file)
8796

8897

89-
def debug(**kwargs) -> None:
98+
def debug(*args, **kwargs) -> None:
9099
"""
91100
Logs a debug message.
92101
"""
93-
write(_entry_from_args(LogSeverity.DEBUG, **kwargs))
102+
write(_entry_from_args(LogSeverity.DEBUG, *args, **kwargs))
94103

95104

96-
def log(**kwargs) -> None:
105+
def log(*args, **kwargs) -> None:
97106
"""
98107
Logs a log message.
99108
"""
100-
write(_entry_from_args(LogSeverity.NOTICE, **kwargs))
109+
write(_entry_from_args(LogSeverity.NOTICE, *args, **kwargs))
101110

102111

103-
def info(**kwargs) -> None:
112+
def info(*args, **kwargs) -> None:
104113
"""
105114
Logs an info message.
106115
"""
107-
write(_entry_from_args(LogSeverity.INFO, **kwargs))
116+
write(_entry_from_args(LogSeverity.INFO, *args, **kwargs))
108117

109118

110-
def warn(**kwargs) -> None:
119+
def warn(*args, **kwargs) -> None:
111120
"""
112121
Logs a warning message.
113122
"""
114-
write(_entry_from_args(LogSeverity.WARNING, **kwargs))
123+
write(_entry_from_args(LogSeverity.WARNING, *args, **kwargs))
115124

116125

117-
def error(**kwargs) -> None:
126+
def error(*args, **kwargs) -> None:
118127
"""
119128
Logs an error message.
120129
"""
121-
write(_entry_from_args(LogSeverity.ERROR, **kwargs))
130+
write(_entry_from_args(LogSeverity.ERROR, *args, **kwargs))

tests/test_logger.py

+7-1
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,15 @@ def test_log_should_have_message(self, capsys: pytest.CaptureFixture[str]):
6565
log_output = json.loads(raw_log_output)
6666
assert "message" in log_output
6767

68+
def test_log_should_have_other_keys(self, capsys: pytest.CaptureFixture[str]):
69+
logger.log(foo="bar")
70+
raw_log_output = capsys.readouterr().out
71+
log_output = json.loads(raw_log_output)
72+
assert "foo" in log_output
73+
6874
def test_message_should_be_space_separated(
6975
self, capsys: pytest.CaptureFixture[str]):
70-
logger.log(foo="bar", baz="qux")
76+
logger.log("bar", "qux")
7177
expected_message = "bar qux"
7278
raw_log_output = capsys.readouterr().out
7379
log_output = json.loads(raw_log_output)

0 commit comments

Comments
 (0)