Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
quarto-dev
GitHub Repository: quarto-dev/quarto-cli
Path: blob/main/src/resources/jupyter/log.py
12925 views
1
import sys
2
import logging
3
import os
4
import inspect
5
6
TRACE = 25
7
8
9
def log_init(log_file, trace=False):
10
# set level
11
logger = logging.getLogger()
12
if trace:
13
logger.setLevel(TRACE)
14
else:
15
logger.setLevel(logging.WARNING)
16
17
global file_handler
18
# create handlers
19
stderr_handler = logging.StreamHandler(sys.stderr)
20
file_handler = logging.FileHandler(log_file)
21
22
# create formatter and attach to handlers
23
formatter = logging.Formatter(
24
"%(asctime)s - %(name)s - %(levelname)s - %(message)s"
25
)
26
stderr_handler.setFormatter(formatter)
27
file_handler.setFormatter(formatter)
28
29
# add handlers
30
logger.addHandler(stderr_handler)
31
logger.addHandler(file_handler)
32
33
34
# force flushing so programs which hang still produce output
35
if os.getenv("QUARTO_JUPYTER_FLUSH_LOGS"):
36
37
def log(level, msg):
38
logging.getLogger().log(level, msg)
39
file_handler.flush()
40
else:
41
42
def log(level, msg):
43
logging.getLogger().log(level, msg)
44
45
46
def log_error(msg, exc_info=False, stack_info=None):
47
if stack_info is None:
48
stack_info = not exc_info
49
logging.getLogger().log(
50
logging.ERROR, msg, exc_info=exc_info, stack_info=stack_info
51
)
52
53
54
def trace(msg):
55
prev_frame = inspect.stack()[1]
56
log(TRACE, "%s:%s - %s" % (prev_frame.filename, prev_frame.lineno, msg))
57
58