source: trunk/python/logging.py @ 2315

Last change on this file since 2315 was 2315, checked in by Malte Marquarding, 13 years ago

Ticket #247: Make new summary work in standard asap by handling logger i/o

File size: 3.3 KB
RevLine 
[1858]1"""This module presents a logging abstraction layer on top of casa.
2"""
[1862]3__all__ = ["asaplog", "asaplog_post_dec", "AsapLogger"]
[1797]4
[1861]5import inspect
[1797]6from asap.env import is_casapy
[1833]7from asap.parameters import rcParams
[1797]8from asap._asap import LogSink, set_global_sink
[1808]9try:
10    from functools import wraps as wraps_dec
11except ImportError:
12    from asap.compatibility import wraps as wraps_dec
[1797]13
[1808]14
[1858]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
[2315]21    .. note:: Do not instantiate a new one - use the :obj:`asaplog` instead.
[1859]22
[1858]23    """
[1797]24    def __init__(self):
[1859]25        self._enabled = True
[1797]26        self._log = ""
27        if is_casapy():
28            from taskinit import casalog
29            self.logger = casalog
30        else:
31            self.logger = LogSink()
32            set_global_sink(self.logger)
33
[1861]34    def post(self, level='INFO', origin=""):
[1797]35        """Post the messages to the logger. This will clear the buffered
36        logs.
[1858]37
38        Parameters:
39
40            level:  The log level (severity). One of INFO, WARN, ERROR.
41
[1797]42        """
[1829]43        if not self._enabled:
44            return
45
[1861]46        if not origin:
47            origin = inspect.getframeinfo(inspect.currentframe().f_back)[2]
[1824]48        logs = self._log.strip()
49        if len(logs) > 0:
[1939]50            if isinstance(self.logger, LogSink):
51                #can't handle unicode in boost signature
52                logs = str(logs)
[1859]53            self.logger.post(logs, priority=level, origin=origin)
[1797]54        if isinstance(self.logger, LogSink):
[1824]55            logs = self.logger.pop().strip()
56            if len(logs) > 0:
[1797]57                print logs
58        self._log = ""
59
[2315]60    def clear(self):
61        if isinstance(self.logger, LogSink):
62            logs = self.logger.pop()
63           
[1797]64    def push(self, msg, newline=True):
[1858]65        """Push logs into the buffer. post needs to be called to send them.
66
67        Parameters:
68
69            msg:        the log message (string)
70
71            newline:    should we terminate with a newline (default yes)
72
73        """
[1797]74        if self._enabled:
[1859]75            sep = ""
76            self._log = sep.join([self._log, msg])
77            if newline:
78                self._log += "\n"
[1797]79
80    def enable(self, flag=True):
81        """Enable (or disable) logging."""
82        self._enabled = flag
83
84    def disable(self, flag=False):
85        """Disable (or enable) logging"""
86        self._enabled = flag
87
[1859]88    def is_enabled(self):
89        return self._enabled
90
[1858]91asaplog = AsapLogger()
92"""Default asap logger"""
[1797]93
[1862]94def asaplog_post_dec(f):
[1858]95    """Decorator which posts log at completion of the wrapped method.
[1859]96
[1858]97    Example::
98
[1862]99        @asaplog_post_dec
[1858]100        def test(self):
101            do_stuff()
102            asaplog.push('testing...', False)
103            do_more_stuff()
104            asaplog.push('finished')
105    """
[1797]106    @wraps_dec(f)
107    def wrap_it(*args, **kw):
[1859]108        level = "INFO"
109        try:
110            val = f(*args, **kw)
111            return val
112        except Exception, ex:
113            level = "ERROR"
114            asaplog.push(str(ex))
115            if rcParams['verbose']:
116                pass
117            else:
118                raise
119        finally:
[1861]120            asaplog.post(level, f.func_name)
121            #asaplog.post(level, ".".join([f.__module__,f.func_name]))
[1797]122    return wrap_it
123
Note: See TracBrowser for help on using the repository browser.