summaryrefslogtreecommitdiff
path: root/src/leap/bitmask/util/streamtologger.py
blob: 25a06718ea47273cff70a0e14404cd03980dba21 (plain)
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
54
55
56
57
58
59
# -*- coding: utf-8 -*-
# streamtologger.py
# Copyright (C) 2013 LEAP
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
"""
Stream object that redirects writes to a logger instance.
"""
import logging


class StreamToLogger(object):
    """
    Fake file-like stream object that redirects writes to a logger instance.

    Credits to:
    http://www.electricmonk.nl/log/2011/08/14/\
        redirect-stdout-and-stderr-to-a-logger-in-python/
    """
    def __init__(self, logger, log_level=logging.INFO):
        """
        Constructor, defines the logger and level to use to log messages.

        :param logger: logger object to log messages.
        :type logger: logging.Handler
        :param log_level: the level to use to log messages through the logger.
        :type log_level: int
                        look at logging-levels in 'logging' docs.
        """
        self._logger = logger
        self._log_level = log_level

    def write(self, data):
        """
        Simulates the 'write' method in a file object.
        It writes the data receibed in buf to the logger 'self._logger'.

        :param data: data to write to the 'file'
        :type data: str
        """
        for line in data.rstrip().splitlines():
            self._logger.log(self._log_level, line.rstrip())

    def flush(self):
        """
        Dummy method. Needed to replace the twisted.log output.
        """
        pass