input-remapper/keymapper/logger.py

131 lines
3.9 KiB
Python
Raw Normal View History

2020-10-26 22:45:22 +00:00
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# key-mapper - GUI for device specific keyboard mappings
2020-10-26 22:45:22 +00:00
# Copyright (C) 2020 sezanzeb <proxima@hip70890b.de>
#
2020-10-31 13:02:59 +00:00
# This file is part of key-mapper.
2020-10-26 22:45:22 +00:00
#
2020-10-31 13:02:59 +00:00
# key-mapper is free software: you can redistribute it and/or modify
2020-10-26 22:45:22 +00:00
# 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.
#
2020-10-31 13:02:59 +00:00
# key-mapper is distributed in the hope that it will be useful,
2020-10-26 22:45:22 +00:00
# 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
2020-10-31 13:02:59 +00:00
# along with key-mapper. If not, see <https://www.gnu.org/licenses/>.
2020-10-26 22:45:22 +00:00
2020-10-31 13:02:59 +00:00
"""Logging setup for key-mapper."""
2020-10-26 22:45:22 +00:00
import os
import logging
import pkg_resources
2020-11-26 23:34:45 +00:00
SPAM = 5
2020-11-29 15:22:53 +00:00
def spam(self, message, *args, **kwargs):
2020-11-26 23:34:45 +00:00
"""Log a more-verbose message than debug."""
# pylint: disable=protected-access
2020-11-18 21:06:54 +00:00
if self.isEnabledFor(SPAM):
2020-11-18 19:03:37 +00:00
# https://stackoverflow.com/a/13638084
2020-11-29 15:22:53 +00:00
self._log(SPAM, message, args, **kwargs)
2020-11-18 19:03:37 +00:00
2020-11-18 21:06:54 +00:00
logging.addLevelName(SPAM, "SPAM")
logging.Logger.spam = spam
2020-11-18 19:03:37 +00:00
2020-10-26 22:45:22 +00:00
class Formatter(logging.Formatter):
"""Overwritten Formatter to print nicer logs."""
def format(self, record):
2020-11-22 20:41:29 +00:00
"""Overwritten format function."""
2020-11-26 23:34:45 +00:00
# pylint: disable=protected-access
2020-11-29 15:22:53 +00:00
debug = is_debug()
2020-10-26 22:45:22 +00:00
if record.levelno == logging.INFO and not debug:
# if not launched with --debug, then don't print "INFO:"
2020-11-26 23:34:45 +00:00
self._style._fmt = '%(message)s'
2020-10-26 22:45:22 +00:00
else:
# see https://en.wikipedia.org/wiki/ANSI_escape_code#3/4_bit
# for those numbers
color = {
logging.WARNING: 33,
logging.ERROR: 31,
logging.FATAL: 31,
logging.DEBUG: 36,
2020-11-18 21:06:54 +00:00
SPAM: 34,
2020-10-26 22:45:22 +00:00
logging.INFO: 32,
}.get(record.levelno, 0)
if debug:
self._style._fmt = ( # noqa
2020-11-18 19:03:37 +00:00
'\033[1m' # bold
f'\033[{color}m' # color
f'%(levelname)s'
'\033[0m' # end style
f'\033[{color}m' # color
': %(filename)s, line %(lineno)d, %(message)s'
'\033[0m' # end style
2020-10-26 22:45:22 +00:00
)
else:
self._style._fmt = ( # noqa
f'\033[{color}m%(levelname)s\033[0m: %(message)s'
)
return super().format(record)
logger = logging.getLogger()
handler = logging.StreamHandler()
handler.setFormatter(Formatter())
logger.addHandler(handler)
logger.setLevel(logging.INFO)
2020-11-18 19:03:37 +00:00
logging.getLogger('asyncio').setLevel(logging.WARNING)
2020-10-26 22:45:22 +00:00
2020-11-17 16:56:59 +00:00
def is_debug():
2020-11-22 20:41:29 +00:00
"""True, if the logger is currently in DEBUG or SPAM mode."""
2020-11-18 19:03:37 +00:00
return logger.level <= logging.DEBUG
2020-11-17 16:56:59 +00:00
2020-10-26 22:45:22 +00:00
def log_info():
"""Log version and name to the console"""
# read values from setup.py
version = pkg_resources.require('key-mapper')[0].version
name = pkg_resources.require('key-mapper')[0].project_name
2020-10-26 22:45:22 +00:00
logger.info('%s %s', version, name)
def update_verbosity(debug):
"""Set the logging verbosity according to the settings object."""
if debug:
2020-11-18 21:06:54 +00:00
logger.setLevel(SPAM)
2020-10-26 22:45:22 +00:00
else:
logger.setLevel(logging.INFO)
2020-11-29 15:22:53 +00:00
def add_filehandler(path='~/.log/key-mapper'):
2020-10-26 22:45:22 +00:00
"""Clear the existing logfile and start logging to it."""
2020-11-29 15:22:53 +00:00
log_path = os.path.expanduser(path)
2020-10-26 22:45:22 +00:00
log_file = os.path.join(log_path, 'log')
if not os.path.exists(log_path):
os.makedirs(log_path)
if os.path.exists(log_file):
# keep the log path small, start from scratch each time
os.remove(log_file)
file_handler = logging.FileHandler(log_file)
file_handler.setFormatter(Formatter())
2020-11-25 20:55:04 +00:00
logger.info('Logging to "%s"', log_file)
2020-10-26 22:45:22 +00:00
logger.addHandler(file_handler)
2020-11-29 15:22:53 +00:00
return os.path.join(log_path, log_file)