Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/python/logging.py

    r1833 r1939  
    1 __all__ = ["asaplog", "print_log", "print_log_dec"]
     1"""This module presents a logging abstraction layer on top of casa.
     2"""
     3__all__ = ["asaplog", "asaplog_post_dec", "AsapLogger"]
    24
     5import inspect
    36from asap.env import is_casapy
    47from asap.parameters import rcParams
     
    1013
    1114
    12 class _asaplog(object):
    13     """Wrapper object to allow for both casapy and asap logging"""
     15class AsapLogger(object):
     16    """Wrapper object to allow for both casapy and asap logging.
     17
     18    Inside casapy this will connect to `taskinit.casalog`. Otherwise it will
     19    create its own casa log sink.
     20
     21    .. note:: Do instantiate a new one - use the :obj:`asaplog` instead.
     22
     23    """
    1424    def __init__(self):
    15         self._enabled = False
     25        self._enabled = True
    1626        self._log = ""
    1727        if is_casapy():
     
    2232            set_global_sink(self.logger)
    2333
    24     def post(self, level):
     34    def post(self, level='INFO', origin=""):
    2535        """Post the messages to the logger. This will clear the buffered
    2636        logs.
     37
     38        Parameters:
     39
     40            level:  The log level (severity). One of INFO, WARN, ERROR.
     41
    2742        """
    2843        if not self._enabled:
    2944            return
    30         if not rcParams['verbose']:
    31             return
    3245
     46        if not origin:
     47            origin = inspect.getframeinfo(inspect.currentframe().f_back)[2]
    3348        logs = self._log.strip()
    3449        if len(logs) > 0:
    35            self.logger.post(logs, priority=level)
     50            if isinstance(self.logger, LogSink):
     51                #can't handle unicode in boost signature
     52                logs = str(logs)
     53            self.logger.post(logs, priority=level, origin=origin)
    3654        if isinstance(self.logger, LogSink):
    3755            logs = self.logger.pop().strip()
     
    4159
    4260    def push(self, msg, newline=True):
    43         """Push logs into the buffer. post needs to be called to send them."""
    44         from asap import rcParams
     61        """Push logs into the buffer. post needs to be called to send them.
     62
     63        Parameters:
     64
     65            msg:        the log message (string)
     66
     67            newline:    should we terminate with a newline (default yes)
     68
     69        """
    4570        if self._enabled:
    46             if rcParams["verbose"]:
    47                 sep = ""
    48                 self._log = sep.join([self._log, msg])
    49                 if newline:
    50                     self._log += "\n"
     71            sep = ""
     72            self._log = sep.join([self._log, msg])
     73            if newline:
     74                self._log += "\n"
    5175
    5276    def enable(self, flag=True):
     
    5882        self._enabled = flag
    5983
    60 asaplog = _asaplog()
     84    def is_enabled(self):
     85        return self._enabled
    6186
    62 def print_log_dec(f, level='INFO'):
     87asaplog = AsapLogger()
     88"""Default asap logger"""
     89
     90def asaplog_post_dec(f):
     91    """Decorator which posts log at completion of the wrapped method.
     92
     93    Example::
     94
     95        @asaplog_post_dec
     96        def test(self):
     97            do_stuff()
     98            asaplog.push('testing...', False)
     99            do_more_stuff()
     100            asaplog.push('finished')
     101    """
    63102    @wraps_dec(f)
    64103    def wrap_it(*args, **kw):
    65         val = f(*args, **kw)
    66         print_log(level)
    67         return val
     104        level = "INFO"
     105        try:
     106            val = f(*args, **kw)
     107            return val
     108        except Exception, ex:
     109            level = "ERROR"
     110            asaplog.push(str(ex))
     111            if rcParams['verbose']:
     112                pass
     113            else:
     114                raise
     115        finally:
     116            asaplog.post(level, f.func_name)
     117            #asaplog.post(level, ".".join([f.__module__,f.func_name]))
    68118    return wrap_it
    69119
    70 def print_log(level='INFO'):
    71     """Alias for asaplog.post."""
    72     asaplog.post(level)
Note: See TracChangeset for help on using the changeset viewer.