1-
2- from loguru import logger
31import sys
42import json
53import 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
1112def 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