diff --git a/src/fire2a/__init__.py b/src/fire2a/__init__.py index 2aabea7..0ec9f45 100644 --- a/src/fire2a/__init__.py +++ b/src/fire2a/__init__.py @@ -17,8 +17,8 @@ """ __author__ = "Fernando Badilla" __revision__ = "$Format:%H$" - import logging +import sys from importlib.metadata import PackageNotFoundError, distribution from pathlib import Path from typing import Any, Dict, List, Tuple, Union @@ -69,16 +69,28 @@ def setup_logger(name: str = __name__, verbosity: int = 0, logfile: Path = None) # root logger logger = logging.getLogger() - # Create a stream handler - import sys - - stream_handler = logging.StreamHandler(sys.stdout) - - # Create a rotating file handler + # Find or create StreamHandler + stream_handler = None + for h in logger.handlers: + if isinstance(h, logging.StreamHandler): + stream_handler = h + break + if stream_handler is None: + stream_handler = logging.StreamHandler(sys.stdout) + logger.addHandler(stream_handler) + + # Find or create RotatingFileHandler + rf_handler = None if logfile: from logging.handlers import RotatingFileHandler - rf_handler = RotatingFileHandler(logfile, maxBytes=25 * 1024, backupCount=5) + for h in logger.handlers: + if isinstance(h, RotatingFileHandler): + rf_handler = h + break + if rf_handler is None: + rf_handler = RotatingFileHandler(logfile, maxBytes=25 * 1024, backupCount=5) + logger.addHandler(rf_handler) # Set the logs level if verbosity in ["CRITICAL", "FATAL"] or verbosity == -1: @@ -93,9 +105,11 @@ def setup_logger(name: str = __name__, verbosity: int = 0, logfile: Path = None) level = logging.DEBUG else: level = logging.DEBUG + logger.setLevel(level) - stream_handler.setLevel(level) - if logfile: + if stream_handler: + stream_handler.setLevel(level) + if logfile and rf_handler: rf_handler.setLevel(level) # formatter @@ -104,13 +118,15 @@ def setup_logger(name: str = __name__, verbosity: int = 0, logfile: Path = None) "%(asctime)s %(levelname)s %(name)s %(message)s", datefmt="%Y-%m-%d %H:%M:%S", ) - stream_handler.setFormatter(formatter) - if logfile: + if stream_handler: + stream_handler.setFormatter(formatter) + if logfile and rf_handler: rf_handler.setFormatter(formatter) # Add the handlers to the logger - logger.addHandler(stream_handler) - if logfile: + if stream_handler: + logger.addHandler(stream_handler) + if logfile and rf_handler: logger.addHandler(rf_handler) logger.debug("Logger initialized @level %s", logging.getLevelName(level)) diff --git a/src/fire2a/agglomerative_clustering.py b/src/fire2a/agglomerative_clustering.py index 8bdf852..01249f3 100644 --- a/src/fire2a/agglomerative_clustering.py +++ b/src/fire2a/agglomerative_clustering.py @@ -709,7 +709,8 @@ def main(argv=None): global logger from fire2a import setup_logger - logger = setup_logger(verbosity=args.verbose) + name = __name__ if __name__ != "__main__" else "fire2a.agglomerative_clustering" + logger = setup_logger(name, verbosity=args.verbose) logger.info("args %s", args) diff --git a/src/fire2a/cell2fire.py b/src/fire2a/cell2fire.py index f6ae8e3..86fda55 100644 --- a/src/fire2a/cell2fire.py +++ b/src/fire2a/cell2fire.py @@ -366,7 +366,7 @@ def final_scar_step(i, data, afile, scar_raster, scar_raster_ds, burn_prob, burn if burn_prob: if np_any(data == -1): mask = data != -1 - burn_prob_arr[ mask ] += data[ mask ] + burn_prob_arr[mask] += data[mask] else: burn_prob_arr += data @@ -566,8 +566,7 @@ def build_stats( callback=None, feedback=None, ): - """Builds final statistics raster (1 band per-simulation) and summary raster (2 bands: mean against pixel burn count and stdev against total number of simulations) files - """ + """Builds final statistics raster (1 band per-simulation) and summary raster (2 bands: mean against pixel burn count and stdev against total number of simulations) files""" from numpy import float32 as np_float32 from numpy import loadtxt as np_loadtxt from numpy import sqrt as np_sqrt @@ -635,7 +634,7 @@ def build_stats( mask = data != -9999 tmp = data[mask] summed[mask] += tmp - sumsquared[mask] += tmp ** 2 + sumsquared[mask] += tmp**2 burncount[mask & (data != 0)] += 1 if callback: @@ -668,7 +667,7 @@ def build_stats( # std # from all simulations N = len(files) - stddev = np_sqrt(sumsquared / N - (summed/N)**2) + stddev = np_sqrt(sumsquared / N - (summed / N) ** 2) # beacause this is always zero: # stddev = np_zeros((H, W), dtype=np_float32) - 9999 # zero_mask = burncount == 0 @@ -773,7 +772,8 @@ def main(argv=None): global logger from fire2a import setup_logger - logger = setup_logger(verbosity=args.verbose, logfile=args.logfile) + name = __name__ if __name__ != "__main__" else "fire2a.cell2fire" + logger = setup_logger(name, verbosity=args.verbose, logfile=args.logfile) # set other modules logging level logging.getLogger("asyncio").setLevel(logging.INFO) diff --git a/src/fire2a/downstream_protection_value.py b/src/fire2a/downstream_protection_value.py index 3885700..89f1880 100644 --- a/src/fire2a/downstream_protection_value.py +++ b/src/fire2a/downstream_protection_value.py @@ -450,7 +450,8 @@ def main(argv=None): if argv is None: argv = sys.argv[1:] args = argument_parser(argv) - logger = setup_logger(__name__, args.verbosity, args.logfile) + name = __name__ if __name__ != "__main__" else "fire2a.downstream_protection_value" + logger = setup_logger(name, args.verbosity, args.logfile) logger.info(f"{args=}") logger.debug("debugging...") diff --git a/src/fire2a/knapsack.py b/src/fire2a/knapsack.py index dd1ccbf..274bafa 100644 --- a/src/fire2a/knapsack.py +++ b/src/fire2a/knapsack.py @@ -299,7 +299,7 @@ def pre_solve(argv): global logger from fire2a import setup_logger - logger = setup_logger(verbosity=args.verbose) + logger = setup_logger(name=__name__, verbosity=args.verbose) logger.info("args %s", args) diff --git a/src/fire2template/documenting.py b/src/fire2template/documenting.py index 1550f75..4728e41 100644 --- a/src/fire2template/documenting.py +++ b/src/fire2template/documenting.py @@ -133,7 +133,8 @@ def do_something(self, *args, **kwargs): def main(argv): """This is a function docstring that describes a function""" - logger = setup_logger(__name__, 2, None) + name = __name__ if __name__ != "__main__" else "fire2a.documenting" + logger = setup_logger(name, 2, None) logger.info("Hello world!") logger.info(f"argv:{argv}") returns = b_method((1, "a"), "b", "c", an_optional_argument=2, d="e", f="g") diff --git a/src/fire2template/template.py b/src/fire2template/template.py index 0d0c84e..a57e6d6 100644 --- a/src/fire2template/template.py +++ b/src/fire2template/template.py @@ -143,7 +143,8 @@ def main(argv=None): global logger from fire2template import setup_logger - logger = setup_logger(verbosity=args.verbose, logfile=args.logfile) + name = __name__ if __name__ != "__main__" else "fire2a.template" + logger = setup_logger(name, verbosity=args.verbose, logfile=args.logfile) # set other modules logging level logging.getLogger("asyncio").setLevel(logging.INFO)