Commit d733d8e7 authored by Sam Rushing's avatar Sam Rushing

add tools for module-level logging.

Facility: prepend each line with a facility id.
NoFacility: for one-module scripts.
StderrRedirector: capture stderr output to log as facility 'stderr'.
redirect_stderr: install it.
set_logger: new fun.
log: main interface.
parent c78472cf
......@@ -38,6 +38,9 @@ import sys
import traceback
import os
from coro.log import Facility
LOG = Facility ('backdoor')
# Originally, this object implemented the file-output api, and set
# sys.stdout and sys.stderr to 'self'. However, if any other
# coroutine ran, it would see the captured definition of sys.stdout,
......@@ -236,7 +239,7 @@ def serve (port=None, ip='', unix_path=None, welcome_message=None, global_dict=N
s.listen (1024)
while 1:
conn, addr = s.accept()
coro.print_stderr ('incoming backdoor connection from %r\n' % (conn.getpeername(),))
LOG ('incoming backdoor connection from %r' % (conn.getpeername(),))
thread = coro.spawn (client_class, conn, addr, welcome_message, global_dict)
thread.set_name('backdoor session')
......
......@@ -6,31 +6,17 @@ import asn1
import coro
import time
def is_binary (ob):
if type(ob) is not bytes:
return False
else:
return '\x00' in ob
def frob(ob):
if type(ob) is bytes:
if is_binary (ob):
if len(ob) < 500 or args.big:
return ob.encode ('hex')
else:
return '<large>'
return ob
else:
return ob
class StderrLogger:
def __init__ (self):
import sys
self.saved_stderr = sys.stderr
# ISO 8601
time_format = '%Y-%m-%dT%H:%M:%S'
def log (self, *data):
data = [frob(x) for x in data]
coro.write_stderr ("%s %r\n" % (time.strftime (self.time_format), data))
self.saved_stderr.write ("%s %r\n" % (time.strftime (self.time_format), data))
class ComboLogger:
......@@ -41,3 +27,47 @@ class ComboLogger:
for logger in self.loggers:
logger.log (*data)
class Facility:
def __init__ (self, name):
self.name = name
def __call__ (self, *data):
log (self.name, *data)
def exc (self):
log (self.name, 'exception', coro.traceback_data())
class NoFacility:
def __call__ (self, *data):
log (*data)
def exc (self):
log ('exception', coro.traceback_data())
class StderrRedirector:
def __init__ (self):
self.log = Facility ('stderr')
def write (self, data):
self.log (data)
def redirect_stderr():
global stderr
stderr = StderrRedirector()
import sys
sys.stderr = stderr
coro.write_stderr = stderr.write
coro.print_stderr = stderr.write
the_logger = StderrLogger()
def set_logger (logger):
global the_logger
the_logger = logger
def log (*data):
the_logger.log (*data)
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment