Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

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

""" The pySUMO informational log handler. Acts as an initializer for the python 

logging framework and defines several convenience functions for working with 

it. 

 

This module contains: 

 

- InfoLog: The informational log handler. 

 

""" 

 

import logging 

import logging.handlers 

 

from pysumo import CONFIG_PATH 

from os import makedirs 

from os.path import dirname 

 

class InfoLog: 

    """ The informational log handler for pySUMO. Initializes the python logging framework 

    and contains several convenience functions. Instantiated only from the entry point. 

 

    Variables: 

 

    - default_log_path: The default path where the infolog will be stored. 

    - default_socket_path: The default socket to which >=INFO logs will be sent. 

    - filename: The location at which the infolog will be stored. 

    - root_logger: The root logging object of which all other loggers are children. 

    - f_handler: Sends messages to a file and rotates it when it becomes too large. 

    - s_handler: Sends messages to a Unix socket. 

 

    Methods: 

 

    - set_loglevel: Sets the loglevel above which to log messages. 

 

    """ 

 

    default_log_path = '/'.join([CONFIG_PATH, 'log']) 

    default_socket_path = '/'.join([CONFIG_PATH, 'status']) 

 

    def __init__(self, loglevel='WARNING', filename=default_log_path, socket_path=default_socket_path): 

        """ Initializes the python logging framework. 

 

        Kwargs: 

 

        - loglevel: the loglevel above which entries are logged 

        - filename: log location 

 

        """ 

        self.filename = filename 

        self.socket = socket_path 

        try: 

            makedirs(dirname(self.filename), exist_ok=True) 

            makedirs(dirname(self.socket), exist_ok=True) 

            self.f_handler = logging.handlers.RotatingFileHandler(self.filename, maxBytes=102400, backupCount=2) 

            s_handler = logging.handlers.SocketHandler(self.socket, None) 

        except PermissionError: 

            makedirs(CONFIG_PATH, exist_ok=True) 

            self.filename = self.default_log_path 

            self.socket = self.default_socket_path 

            self.f_handler = logging.handlers.RotatingFileHandler(self.filename, maxBytes=102400, backupCount=2) 

            s_handler = logging.handlers.SocketHandler(self.socket, None) 

        self.root_logger = logging.getLogger('') 

        self.root_logger.setLevel(logging.NOTSET) 

        self.f_handler.setLevel(loglevel.upper()) 

        s_handler.setLevel(logging.INFO) 

        formatter = logging.Formatter('%(asctime)s: %(levelname)s:%(name)s:%(message)s') 

        self.f_handler.setFormatter(formatter) 

        s_handler.setFormatter(formatter) 

        self.root_logger.addHandler(self.f_handler) 

        self.root_logger.addHandler(s_handler) 

 

    def set_loglevel(self, loglevel): 

        """ Sets the loglevel above which to log messages. """ 

        self.f_handler.setLevel(loglevel)