Repository navigation
Expand file tree
/
Copy pathclog.py
More file actions
53 lines (46 loc) · 2.36 KB
/
Copy pathclog.py
File metadata and controls
53 lines (46 loc) · 2.36 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import logging, reprlib, sys, time
def add_handler(level, handler, show_pid=False, show_thread=False):
handler.setFormatter(logging.Formatter('%(asctime)s '+('%(process)d ' if show_pid else '')+('%(threadName)s ' if show_thread else '')+'%(message)s', '%Y-%m-%d %H:%M:%S'))
handler.setLevel(level)
logging.root.addHandler(handler)
return handler
def add_rotating_log(codename, filename, maxBytes=100_000, backupCount=2):
logging.getLogger(codename).addHandler(logging.handlers.RotatingFileHandler(filename, maxBytes=maxBytes, backupCount=backupCount))
logging.getLogger(codename).handlers[0].setFormatter(logging.Formatter('%(asctime)s %(message)s', '%Y-%m-%d %H:%M:%S'))
def disconnect(handler):
handler.close()
logging.root.removeHandler(handler)
stdout = add_handler(logging.INFO, logging.StreamHandler(sys.stdout))
if not(sys.stdout.isatty() and sys.stderr.isatty()):
stderr = add_handler(logging.ERROR, logging.StreamHandler(sys.stderr))
logging.root.setLevel(0) # the "logger" logs everything, but the handlers are more choosy
logging.raiseExceptions = False # Without this, the logging module goes crazy if we use `tail` or `head` etc.
def log(lev,msg): logging.root.log (lev,msg)
def trace (msg): logging.root.log (logging.DEBUG-1,msg)
def debug (msg): logging.root.debug (msg)
def info (msg): logging.root.info (msg)
def warning(msg): logging.root.warning('WARNING: '+msg)
g_last_error_time = 0
def error (msg):
global g_last_error_time
logging.root.error (('\007' if (time.time()-g_last_error_time)>.3 else '')+'ERROR: '+msg)
g_last_error_time = time.time()
def exception(msg,*args,**kwargs): logging.root.exception('\007ERROR: '+msg, *args,**kwargs)
def watch(msg):
if stdout.level == logging.INFO:
if len(msg) > 1 and '\n' not in msg:
import datetime
msg = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S ')+msg
print(msg,end='')
_builtin_repr = repr
def repr(input_obj):
class ReprGood(reprlib.Repr):
def __init__(self):
reprlib.Repr.__init__(self)
self.maxlist=99
self.maxdict=99
self.indent=1
def repr_list(self,obj,level):
return _builtin_repr(obj) if not any(isinstance(i,(list,dict,tuple)) for i in obj) else reprlib.Repr.repr_list(self,obj,level)
tmp = ReprGood()
return tmp.repr(input_obj)