summaryrefslogtreecommitdiff
path: root/raphodo/iplogging.py
diff options
context:
space:
mode:
Diffstat (limited to 'raphodo/iplogging.py')
-rw-r--r--raphodo/iplogging.py112
1 files changed, 112 insertions, 0 deletions
diff --git a/raphodo/iplogging.py b/raphodo/iplogging.py
new file mode 100644
index 0000000..e58dd3d
--- /dev/null
+++ b/raphodo/iplogging.py
@@ -0,0 +1,112 @@
+# Copyright (C) 2016 Damon Lynch <damonlynch@gmail.com>
+
+# This file is part of Rapid Photo Downloader.
+#
+# Rapid Photo Downloader 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.
+#
+# Rapid Photo Downloader 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 Rapid Photo Downloader. If not,
+# see <http://www.gnu.org/licenses/>.
+
+"""
+Specify logging setup.
+
+Log all messages to file log
+Log messages at user specified level to console
+"""
+
+__author__ = 'Damon Lynch'
+__copyright__ = "Copyright 2016, Damon Lynch"
+
+import logging
+from logging.handlers import QueueHandler, RotatingFileHandler
+import pickle
+import gzip
+import os
+from typing import Optional
+
+try:
+ import colorlog
+ use_colorlog = True
+except ImportError:
+ use_colorlog = False
+
+from raphodo.constants import logfile_name
+from raphodo.storage import get_program_logging_directory
+
+logging_format = '%(levelname)s: %(message)s'
+colored_logging_format = '%(log_color)s%(levelname)-8s%(reset)s %(message)s'
+log_colors ={
+ 'DEBUG': 'cyan',
+ 'INFO': 'green',
+ 'WARNING': 'yellow',
+ 'ERROR': 'red',
+ 'CRITICAL': 'red,bg_white',
+ }
+
+logging_date_format = '%Y-%m-%d %H:%M:%S'
+file_logging_format = '%(asctime)s %(levelname)s %(filename)s %(lineno)d: %(message)s'
+
+class ZeroMQSocketHandler(QueueHandler):
+ def enqueue(self, record):
+ data = pickle.dumps(record.__dict__)
+ self.queue.send(data)
+
+class RotatingGzipFileHandler(RotatingFileHandler):
+ def rotation_filename(self, name):
+ return name + ".gz"
+
+ def rotate(self, source, dest):
+ with open(source, "rb") as sf:
+ with gzip.open(dest, "wb") as df:
+ df.writelines(sf)
+ os.remove(source)
+
+
+def full_log_file_path():
+ log_file_path = get_program_logging_directory(create_if_not_exist=True)
+ if log_file_path is not None:
+ log_file = os.path.join(log_file_path, logfile_name)
+ else:
+ # Problem: for some reason cannot create log file in standard location,
+ # so create it in the home directory
+ log_file = os.path.join(os.path.expanduser('~'), logfile_name)
+ return log_file
+
+def setup_main_process_logging(logging_level: int) -> logging.Logger:
+ """
+ Setup logging at the module level
+ :param log_file_path: path where log file should be stored
+ :param logging_level: logging module's logging level for console output
+ :return: default logging object
+ """
+
+ log_file = full_log_file_path()
+ logger = logging.getLogger()
+ max_bytes = 1024 * 1024 # 1 MB
+ filehandler = RotatingGzipFileHandler(log_file, maxBytes=max_bytes, backupCount=5)
+ filehandler.setLevel(logging.DEBUG)
+ filehandler.setFormatter(logging.Formatter(file_logging_format, logging_date_format))
+ logger.addHandler(filehandler)
+ logger.setLevel(logging.DEBUG)
+
+ consolehandler = logging.StreamHandler()
+ if not use_colorlog:
+ consolehandler.setFormatter(logging.Formatter(logging_format))
+ else:
+ consolehandler.setFormatter(colorlog.ColoredFormatter(fmt=colored_logging_format,
+ log_colors=log_colors))
+ consolehandler.setLevel(logging_level)
+ logger.addHandler(consolehandler)
+ return logger
+
+
+