Skip to content

Commit a814e77

Browse files
authored
Merge pull request #305 from IBM/improve-python-structured-logging
Improve python structured logging sample
2 parents 32b4f42 + 8a5ec35 commit a814e77

1 file changed

Lines changed: 22 additions & 18 deletions

File tree

logging/python-structured/main.py

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
1-
2-
from loguru import logger
31
import sys
42
import json
53
import traceback
64

7-
# This simple Code Engine job demonstrates how to write structured log lines
5+
from loguru import logger
6+
7+
# This simple Code Engine job demonstrates how to write structured log lines
88
# using the logging library loguru (https://github.com/Delgan/loguru)
99

10+
1011
# Define a custom JSON sink
1112
def json_sink(message):
1213
record = message.record
@@ -35,28 +36,22 @@ def json_sink(message):
3536
sys.stdout.flush()
3637

3738

38-
# Remove default handler (which includes timestamp, etc.) and add our custom sink
39-
logger.remove()
40-
logger.add(json_sink, level="DEBUG") # lowest level you want to capture
41-
42-
43-
if __name__ == '__main__':
44-
39+
def main():
4540
# expect to be rendered as INFO level log message
46-
logger.info("This is a structured log message");
41+
logger.info("This is a structured log message")
4742

4843
# expect to be rendered as DEBUG level log message
49-
logger.debug("This is a structured log message");
44+
logger.debug("This is a structured log message")
5045

5146
# expect to be rendered as WARN level log message
52-
logger.warning("This is a structured log message");
47+
logger.warning("This is a structured log message")
5348

5449
# expect to be rendered as ERROR level log message
55-
logger.error("This is a structured log message");
50+
logger.error("This is a structured log message")
5651

5752
# Expect to be rendered as DEBUG level log message. The extra key is available as a searchable, filterable field
5853
logger.bind(extra_key="extra_value").debug("A structured log entry that contains an extra key")
59-
54+
6055
# Expect to be rendered as INFO level log message. The additional JSON struct is available as a searchable, filterable fields
6156
logger.bind(
6257
requestId="some-request-id",
@@ -65,7 +60,6 @@ def json_sink(message):
6560
metadata={"foo": "bar"},
6661
).info("A structured log entry that carries a ton of additional fields")
6762

68-
6963
# Multi-line example. Expect to be rendered in a single log message
7064
logger.info(
7165
"Multi-line log sample:\n"
@@ -75,13 +69,23 @@ def json_sink(message):
7569
"Line 4: entering main loop\n"
7670
"End of sample"
7771
)
78-
72+
7973
# Error logging. The error stack trace is rendered in a single log message (see field stack)
8074
try:
8175
raise RuntimeError("boom!")
8276
except Exception:
8377
# logger.exception() automatically attaches the current exception info
8478
logger.exception("An error occurred")
8579

80+
# this will be caught by loguru's logger.catch context
81+
import nonexistentmodule
82+
83+
84+
if __name__ == '__main__':
85+
# Remove default handler (which includes timestamp, etc.) and add our custom sink
86+
logger.remove()
87+
logger.add(json_sink, level="DEBUG") # lowest level you want to capture
8688

87-
89+
# Catch any uncaught errors and properly log them
90+
with logger.catch():
91+
main()

0 commit comments

Comments
 (0)