logger.py 3.1 KB
Newer Older
N
Nicolas Hennion 已提交
1 2 3 4
# -*- coding: utf-8 -*-
#
# This file is part of Glances.
#
5
# Copyright (C) 2015 Nicolargo <nicolas@nicolargo.com>
N
Nicolas Hennion 已提交
6 7 8 9 10 11 12 13 14 15 16 17 18 19
#
# Glances is free software; you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Glances 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 Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.

20
"""Custom logger class."""
N
Nicolas Hennion 已提交
21 22

import logging
23
import os
24
import tempfile
N
Nicolas Hennion 已提交
25

26
from glances.compat import dictConfig
A
Alessio Sergi 已提交
27

N
Nicolas Hennion 已提交
28 29 30 31 32 33 34 35 36 37 38
# Define the logging configuration
LOGGING_CFG = {
    'version': 1,
    'disable_existing_loggers': False,
    'root': {
        'level': 'INFO',
        'handlers': ['file', 'console']
    },
    'formatters': {
        'standard': {
            'format': '%(asctime)s -- %(levelname)s -- %(message)s'
N
Nicolas Hennion 已提交
39 40 41
        },
        'short': {
            'format': '%(levelname)s: %(message)s'
N
Nicolargo 已提交
42 43 44
        },
        'free': {
            'format': '%(message)s'
N
Nicolas Hennion 已提交
45 46 47 48
        }
    },
    'handlers': {
        'file': {
A
Alessio Sergi 已提交
49 50
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',
N
Nicolas Hennion 已提交
51
            'formatter': 'standard',
52 53
            # http://stackoverflow.com/questions/847850/cross-platform-way-of-getting-temp-directory-in-python
            'filename': os.path.join(tempfile.gettempdir(), 'glances.log')
N
Nicolas Hennion 已提交
54
        },
A
Alessio Sergi 已提交
55 56 57
        'console': {
            'level': 'CRITICAL',
            'class': 'logging.StreamHandler',
N
Nicolargo 已提交
58
            'formatter': 'free'
N
Nicolas Hennion 已提交
59 60 61 62
        }
    },
    'loggers': {
        'debug': {
A
Alessio Sergi 已提交
63 64
            'handlers': ['file', 'console'],
            'level': 'DEBUG',
N
Nicolas Hennion 已提交
65 66 67 68 69 70 71 72
        },
        'verbose': {
            'handlers': ['file', 'console'],
            'level': 'INFO'
        },
        'standard': {
            'handlers': ['file'],
            'level': 'INFO'
73 74 75 76 77 78 79 80 81
        },
        'elasticsearch': {
            'handlers': ['file', 'console'],
            'level': 'ERROR',
        },
        'elasticsearch.trace': {
            'handlers': ['file', 'console'],
            'level': 'ERROR',
        },
N
Nicolas Hennion 已提交
82 83 84
    }
}

85

86
def tempfile_name():
87
    """Return the tempfile name (full path)."""
88 89
    ret = os.path.join(tempfile.gettempdir(), 'glances.log')
    if os.access(ret, os.F_OK) and not os.access(ret, os.W_OK):
90
        print("WARNING: Couldn't write to log file {0} (Permission denied)".format(ret))
91
        ret = tempfile.mkstemp(prefix='glances', suffix='.tmp', text=True)
92
        print("Create a new log file: {0}".format(ret[1]))
N
Nicolargo 已提交
93
        return ret[1]
94

N
Nicolargo 已提交
95
    return ret
96 97


A
Alessio Sergi 已提交
98
def glances_logger():
99
    """Build and return the logger."""
100
    temp_path = tempfile_name()
N
Nicolas Hennion 已提交
101
    _logger = logging.getLogger()
102 103 104
    LOGGING_CFG['handlers']['file']['filename'] = temp_path
    dictConfig(LOGGING_CFG)

N
Nicolas Hennion 已提交
105
    return _logger
A
Alessio Sergi 已提交
106 107

logger = glances_logger()