Przeglądaj źródła

refactored logger creation

Dimitri Korsch 5 lat temu
rodzic
commit
6a86e85faa
3 zmienionych plików z 61 dodań i 28 usunięć
  1. 1 1
      cvargparse/__init__.py
  2. 37 27
      cvargparse/parser.py
  3. 23 0
      cvargparse/utils/logger_config.py

+ 1 - 1
cvargparse/__init__.py

@@ -1,4 +1,4 @@
-__version__ = "0.2.0"
+__version__ = "0.3.0"
 
 from cvargparse.argument import Argument
 from cvargparse.argument import FileArgument

+ 37 - 27
cvargparse/parser.py

@@ -1,15 +1,17 @@
 import argparse
 import logging
+import warnings
 
 from cvargparse.argument import Argument as Arg
 from cvargparse.factory import BaseFactory
+from cvargparse.utils.logger_config import init_logging_handlers
 
 class BaseParser(argparse.ArgumentParser):
 
-	def __init__(self, arglist=[], nologging=False, sysargs=None, *args, **kw):
-		self.__nologging = nologging
-		self.__sysargs = sysargs
+	def __init__(self, arglist=[], nologging=False, *args, **kw):
+		self._nologging = nologging
 		self._groups = {}
+		self._args = None
 
 		super(BaseParser, self).__init__(*args, **kw)
 
@@ -17,17 +19,16 @@ class BaseParser(argparse.ArgumentParser):
 
 		if not self.has_logging: return
 
-		group = self.add_argument_group("Logger arguments")
-		group.add_argument(
-			'--logfile', type=str, default='',
-			help='file for logging output')
-
-		group.add_argument(
-			'--loglevel', type=str, default='INFO',
-			help='logging level. see logging module for more information')
-
-		self.__args = None
+		self.add_args([
+			Arg('--logfile', type=str, default='',
+				help='file for logging output'),
+			Arg('--loglevel', type=str, default='INFO',
+				help='logging level. see logging module for more information'),
+		], group_name="Logger arguments")
 
+	@property
+	def args(self):
+		return self._args
 
 	def get_group(self, name):
 		return self._groups.get(name)
@@ -61,25 +62,34 @@ class BaseParser(argparse.ArgumentParser):
 				group.add_argument(*arg[0], **arg[1])
 
 	@property
-	def args(self):
-		if self.__args is None:
-			self.__args = self.parse_args(self.__sysargs)
+	def has_logging(self):
+		return not self._nologging
 
-		return self.__args
+	def parse_args(self, *args, **kwargs):
+		self._args = super(BaseParser, self).parse_args(*args, **kwargs)
 
+		if self.has_logging:
+			self._logging_config(self._args)
 
-	@property
-	def has_logging(self):
-		return not self.__nologging
+		return self._args
+
+	def _logging_config(self, simple=False):
+
+		if self._args.logfile:
+			handler = logging.FileHandler(self._args.logfile, mode="w")
+		else:
+			handler = logging.StreamHandler()
 
-	def init_logger(self, simple=False):
-		if not self.has_logging: return
 		fmt = '%(message)s' if simple else '%(levelname)s - [%(asctime)s] %(filename)s:%(lineno)d [%(funcName)s]: %(message)s'
-		logging.basicConfig(
-			format=fmt,
-			level=getattr(logging, self.args.loglevel.upper(), logging.DEBUG),
-			filename=self.args.logfile or None,
-			filemode="w")
+		if getattr(self._args, "debug", False):
+			lvl = logging.DEBUG
+		else:
+			lvl = getattr(logging, self._args.loglevel.upper(), logging.WARNING)
+
+		self._logger = init_logging_handlers([(handler, fmt, lvl)])
+
+	def init_logger(self, simple=False):
+		warnings.warn("This method does nothing since v0.3.0!")
 
 
 class GPUParser(BaseParser):

+ 23 - 0
cvargparse/utils/logger_config.py

@@ -0,0 +1,23 @@
+import logging
+
+def init_logging_handlers(handler_list,
+	logger_name=None,
+	logger_level=logging.DEBUG,
+	default_fmt='%(message)s',
+	default_level=logging.WARNING):
+
+	logger = logging.getLogger(logger_name)
+	logger.setLevel(logger_level)
+
+	for handler, fmt, lvl in handler_list:
+
+		fmt = fmt or default_fmt
+		fmt_style = "%" if "%" in fmt else "{"
+
+		formatter = logging.Formatter(fmt, style=fmt_style)
+		handler.setFormatter(formatter)
+		handler.setLevel(lvl or default_level)
+
+		logger.addHandler(handler)
+
+	return logger