summaryrefslogtreecommitdiffstats
path: root/scripts/automation/trex_control_plane/server/CCustomLogger.py
blob: 551b02397452f8c22b96674312eb9728a6957819 (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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
import sys
import os
import logging

def prepare_dir(log_path):
    log_dir = os.path.dirname(log_path)
    if not os.path.exists(log_dir):
        os.makedirs(log_dir)

def setup_custom_logger(name, log_path = None):
    # first make sure path availabe
    if log_path:
        prepare_dir(log_path)
    logging.basicConfig(level   = logging.INFO, 
                        format  = '%(asctime)s %(name)-10s %(module)-20s %(levelname)-8s %(message)s',
                        datefmt = '%m-%d %H:%M')
#                       filename= log_path,
#                       filemode= 'w')
#
#   # define a Handler which writes INFO messages or higher to the sys.stderr
#   consoleLogger = logging.StreamHandler()
#   consoleLogger.setLevel(logging.ERROR)
#   # set a format which is simpler for console use
#   formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
#   # tell the handler to use this format
#   consoleLogger.setFormatter(formatter)
#
#   # add the handler to the logger
#   logging.getLogger(name).addHandler(consoleLogger)

def setup_daemon_logger (name, log_path = None):
    # first make sure path availabe
    if log_path:
        prepare_dir(log_path)
        try:
            os.unlink(log_path)
        except:
            pass
    logging.basicConfig(level   = logging.INFO, 
                        format  = '%(asctime)s %(name)-10s %(module)-20s %(levelname)-8s %(message)s',
                        datefmt = '%m-%d %H:%M',
                        filename= log_path,
                    filemode= 'w')

class CustomLogger(object):
  
    def __init__(self, log_filename):
        # Store the original stdout and stderr
        sys.stdout.flush()
        sys.stderr.flush()

        self.stdout_fd = os.dup(sys.stdout.fileno())
        self.devnull = os.open('/dev/null', os.O_WRONLY)
        self.log_file = open(log_filename, 'w')
        self.silenced = False
        self.pending_log_file_prints = 0

    # silence all prints from stdout
    def silence(self):
        os.dup2(self.devnull, sys.stdout.fileno())
        self.silenced = True

    # restore stdout status
    def restore(self):
        sys.stdout.flush()
        sys.stderr.flush()
        # Restore normal stdout
        os.dup2(self.stdout_fd, sys.stdout.fileno())
        self.silenced = False

    #print a message to the log (both stdout / log file)
    def log(self, text, force = False, newline = True):
        self.log_file.write((text + "\n") if newline else text)
        self.pending_log_file_prints += 1

        if (self.pending_log_file_prints >= 10):
             self.log_file.flush()
             self.pending_log_file_prints = 0

        self.console(text, force, newline)

    # print a message to the console alone
    def console(self, text, force = False, newline = True):
        _text = (text + "\n") if newline else text
        # if we are silenced and not forced - go home
        if self.silenced and not force:
            return

        if self.silenced:
            os.write(self.stdout_fd, _text)
        else:
            sys.stdout.write(_text)

        sys.stdout.flush()

    # flush
    def flush(self):
        sys.stdout.flush()
        self.log_file.flush()

    def __exit__(self, type, value, traceback):
        sys.stdout.flush()
        self.log_file.flush()
        os.close(self.devnull)
        os.close(self.log_file)