Source code for spike.util.simple_logger2
#!/usr/bin/env python
# encoding: utf-8
'''
Created by Lionel Chiron 18/10/2013
Copyright (c) 2013 __NMRTEC__. All rights reserved.
Utility for copying Standard Error (stderr) and Standard Output (stdout) to a file
'''
from __future__ import print_function
import sys, os
from datetime import datetime
import os.path as op
import unittest
import threading
[docs]def strdate():
n = datetime.now()
#return n.strftime('%Y-%h-%d-%Hh%M') #CR error at runtime on Windows
return n.strftime('%a-%d-%b-%Y-%H-%M-%S')
class _Writer(object):
'''
Writes two fluxes. One to the standard console(flux) and the other one in a file(log)
input:
flux: stderr or stdout
log: file descriptor of the log file
'''
def __init__(self, flux, log, prefix=""):
self.log = log
self.flux = flux
self.prefix = prefix
self.newline = True
def write(self, message):
'''
Writes the flux in console and in file
'''
self.flux.write(message)
if self.newline:
self.log.write(self.prefix+message)
else:
self.log.write(message)
self.newline = message.endswith("\n")
def close(self):
'''
do nothing
'''
# self.flux.close()
# self.log.close()
pass
def flush(self):
'''
flush both flux
'''
self.flux.flush()
self.log.flush()
[docs]class TeeLogger(object):
'''
Simple logger.
TeeLogger(log_name = "log_file.log", erase = False, date_in = True, err_prefix = "___")
or
TeeLogger()
copies standard Error (stderr) and Standard Output (stdout) to a file
log_name : name of the log file, if no name given, it is called "log_file.log"
erase : if True erase the existing log file with the same name.
date_in: in True (defualt) date is indicated in log file
err_prefix stderr is prefixed with this string
'''
def __init__(self, log_name = "log_file.log", erase = False, date_in = True, err_prefix = "___"):
self.log_name = log_name
if erase :
choice_write = 'w'
else:
choice_write = 'a'
self.log = open(self.log_name, choice_write) # open log file with name self.log_name
if date_in:
self.log.write("""
========================================
TeeLogging information from stdout and stderr
%s
"""%(strdate()))
self.stdout = _Writer(sys.stdout, self.log) # implements the double flux redirection for stdout
self.stderr = _Writer(sys.stderr, self.log, prefix=err_prefix) # implements the double flux redirection for stderr
sys.stderr = self.stderr # reassigning sys.stderr
sys.stdout = self.stdout # reassigning sys.stdout
if __name__ == '__main__':
unittest.main()