annotate logging_module.py @ 0:9127b49793a1 draft default tip

Uploaded
author jaredgk
date Fri, 12 Oct 2018 14:14:52 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
1 import sys
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
2 import logging
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
3
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
4
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
5
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
6 def initLogger(filename='pipeline.log', filelevel='INFO',
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
7 streamlevel='WARNING', resetlog=True):
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
8 """General logger initialization for PPP functions.
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
9
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
10 Messages from WARNING level and higher will be logged to file and to
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
11 stderr. By default, INFO level will also be written to logfile. Both
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
12 levels are flexible.
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
13
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
14 Level groupings:
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
15 ERROR: Error messages should be generated by an exception call
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
16 WARNING: Non-terminal behavior that may be unusual (i.e. lists
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
17 with no values, blank strings)
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
18 INFO: Every major (user-facing) function should have the following:
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
19 -Message for function start
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
20 -List of input arguments and options
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
21 -Basic sanity checks (dimensions of input data)
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
22 -Statements before or after major function calls
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
23 -Message for function end
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
24 DEBUG: Mainly for developer use/debugging. Generate logs for
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
25 sub-functions that match INFO level for major functions.
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
26 Possible care should be used if there are lots of loops called.
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
27
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
28 Use: Call with either the individual function (in __name__=="__main__"
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
29 statement) or in pipeline file.
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
30
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
31 Parameters
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
32 ----------
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
33 filename : str ("pipeline.log")
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
34 Name of file that log will be written to
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
35
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
36 filelevel : {'INFO','DEBUG','WARNING','ERROR'}
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
37 Set minimum level of log messages that are written to log file.
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
38 Note that this acts as a de facto minumum for 'streamlevel' as well.
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
39
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
40 streamlevel : {'WARNING','DEBUG','INFO','ERROR'}
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
41 Set minimum level of log messages that are output to stream.
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
42
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
43 resetlog : bool (True)
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
44 If true, will overwrite logfile when opening. Set to false if log is
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
45 being initialized multiple times
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
46
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
47 Returns
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
48 -------
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
49 None
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
50
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
51 Exceptions
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
52 ----------
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
53 If filelevel or streamlevel are not a valid logging level
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
54
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
55 """
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
56 log_levels = ['DEBUG','INFO','WARNING','ERROR']
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
57 if filelevel is not None and filelevel.upper() not in log_levels:
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
58 raise Exception('filelevel value %s is not a valid level' %
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
59 filelevel)
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
60 if streamlevel is not None and streamlevel.upper() not in log_levels:
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
61 raise Exception('streamlevel value %s is not a valid level' %
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
62 streamlevel)
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
63 fmt_def = "%(asctime)s - %(funcName)s - %(levelname)s: %(message)s"
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
64 fmt_notime = "%(funcName)s - %(levelname)s: %(message)s"
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
65 fmtr = logging.Formatter(fmt=fmt_def)
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
66 fmtr_notime = logging.Formatter(fmt=fmt_notime)
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
67 filelogger = logging.getLogger()
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
68 filelogger.setLevel('INFO')
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
69 if streamlevel is not None:
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
70 s_handler = logging.StreamHandler()
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
71 s_handler.setFormatter(fmtr_notime)
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
72 s_handler.setLevel(streamlevel)
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
73 filelogger.addHandler(s_handler)
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
74 logmode = 'a'
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
75 if resetlog:
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
76 logmode = 'w'
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
77 if filelevel is not None:
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
78 f_handler = logging.FileHandler(filename,mode=logmode)
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
79 f_handler.setFormatter(fmtr)
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
80 f_handler.setLevel(filelevel)
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
81 #filelogger.setLevel(filelevel)
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
82 filelogger.addHandler(f_handler)
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
83 #Formats exception messages to be sent to appropriate loggers
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
84 def exp_handler(etype,val,tb):
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
85 logging.error("%s" % (val), exc_info=(etype,val,tb))
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
86
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
87 sys.excepthook = exp_handler
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
88
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
89
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
90 def logArgs(args, func_name=None, print_nones=False):
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
91 header = "Arguments"
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
92 if func_name is not None:
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
93 header+=" for"+func_name
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
94 for arg in vars(args):
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
95 val = vars(args)[arg]
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
96 if val is not None or print_nones:
9127b49793a1 Uploaded
jaredgk
parents:
diff changeset
97 logging.info('Argument %s: %s' % (arg,val))