diff --git a/charon/cmd/command.py b/charon/cmd/command.py index 799b69fa..46ada2d7 100644 --- a/charon/cmd/command.py +++ b/charon/cmd/command.py @@ -126,7 +126,7 @@ def upload( """ tmp_dir = work_dir try: - __decide_mode(is_quiet=quiet, is_debug=debug) + __decide_mode(product, version, is_quiet=quiet, is_debug=debug) if dryrun: logger.info("Running in dry-run mode," "no files will be uploaded.") @@ -279,7 +279,7 @@ def delete( """ tmp_dir = work_dir try: - __decide_mode(is_quiet=quiet, is_debug=debug) + __decide_mode(product, version, is_quiet=quiet, is_debug=debug) if dryrun: logger.info("Running in dry-run mode," "no files will be deleted.") @@ -386,17 +386,17 @@ def __validate_prod_key(product: str, version: str) -> bool: return True -def __decide_mode(is_quiet: bool, is_debug: bool): +def __decide_mode(product: str, version: str, is_quiet: bool, is_debug: bool): if is_quiet: logger.info("Quiet mode enabled, " "will only give warning and error logs.") - set_logging(level=logging.WARNING) + set_logging(product, version, level=logging.WARNING) elif is_debug: logger.info("Debug mode enabled, " "will give all debug logs for tracing.") - set_logging(level=logging.DEBUG) + set_logging(product, version, level=logging.DEBUG) else: - set_logging(level=logging.INFO) + set_logging(product, version, level=logging.INFO) @group() diff --git a/charon/config.py b/charon/config.py index 3e464fb8..18ecdd42 100644 --- a/charon/config.py +++ b/charon/config.py @@ -48,7 +48,7 @@ def get_aws_profile(self) -> str: def get_aws_bucket(self, target: str) -> str: target_: Dict = self.__targets.get(target, None) if not target_ or not isinstance(target_, Dict): - logger.error("The target %s is not found in charon configuration.") + logger.error("The target %s is not found in charon configuration.", target) return None bucket = target_.get("bucket", None) if not bucket: diff --git a/charon/constants.py b/charon/constants.py index 242030f3..0fdc01b1 100644 --- a/charon/constants.py +++ b/charon/constants.py @@ -175,3 +175,5 @@ ''' PROD_INFO_SUFFIX = ".prodinfo" + +DEFAULT_ERRORS_LOG = "errors.log" diff --git a/charon/pkgs/maven.py b/charon/pkgs/maven.py index 77b95f52..dd60c2e5 100644 --- a/charon/pkgs/maven.py +++ b/charon/pkgs/maven.py @@ -37,7 +37,6 @@ import logging import re - logger = logging.getLogger(__name__) @@ -648,7 +647,7 @@ def _generate_rollback_archetype_catalog( try: local_archetypes = _parse_archetypes(f.read()) except ElementTree.ParseError: - logging.warning( + logger.warning( "Failed to parse archetype-catalog.xml from local archive with root: %s. " "SKIPPING invalid archetype processing.", root @@ -670,7 +669,7 @@ def _generate_rollback_archetype_catalog( try: remote_archetypes = _parse_archetypes(remote_xml) except ElementTree.ParseError: - logging.warning( + logger.warning( "Failed to parse archetype-catalog.xml from bucket: %s. " "CLEANING invalid remote archetype-catalog.xml", bucket @@ -749,7 +748,7 @@ def _generate_upload_archetype_catalog( try: local_archetypes = _parse_archetypes(f.read()) except ElementTree.ParseError: - logging.warning( + logger.warning( "Failed to parse archetype-catalog.xml from local archive with root: %s. " "SKIPPING invalid archetype processing.", root @@ -768,7 +767,7 @@ def _generate_upload_archetype_catalog( try: remote_archetypes = _parse_archetypes(remote_xml) except ElementTree.ParseError: - logging.warning( + logger.warning( "Failed to parse archetype-catalog.xml from bucket: %s. " "OVERWRITING bucket archetype-catalog.xml with the valid, local copy.", bucket diff --git a/charon/pkgs/pkg_utils.py b/charon/pkgs/pkg_utils.py index bf628291..a3e0b354 100644 --- a/charon/pkgs/pkg_utils.py +++ b/charon/pkgs/pkg_utils.py @@ -35,9 +35,11 @@ def __post_process( operation: str ): if len(failed_files) == 0 and len(failed_metas) == 0: - logger.info("Product release %s is successfully" - "%s Ronda service.", operation, product_key) + logger.info("Product release is successfully %s " + " %s Ronda service.", operation, product_key) else: + total = len(failed_files) + len(failed_metas) + logger.error("%d file(s) occur errors/warnings, please see errors.log for details.", total) logger.error("Product release %s is %s Ronda " "service, but has some failures as below:", product_key, operation) diff --git a/charon/utils/logs.py b/charon/utils/logs.py index 7b0f43c4..a832b562 100644 --- a/charon/utils/logs.py +++ b/charon/utils/logs.py @@ -15,10 +15,10 @@ """ import logging import sys +import os from locale import nl_langinfo, CODESET -from os import fdopen, dup -from charon.constants import CHARON_LOGGING_FMT +from charon.constants import CHARON_LOGGING_FMT, DEFAULT_ERRORS_LOG class EncodedStream(object): @@ -26,7 +26,7 @@ class EncodedStream(object): # over stderr. Normal techniques were not working, so we dup # the file handler and force it UTF-8. :-( def __init__(self, fileno, encoding): - self.binarystream = fdopen(dup(fileno), 'wb') + self.binarystream = os.fdopen(os.dup(fileno), 'wb') self.encoding = encoding def write(self, text): @@ -45,7 +45,7 @@ def __del__(self): pass -def set_logging(name="charon", level=logging.DEBUG, handler=None): +def set_logging(product: str, version: str, name="charon", level=logging.DEBUG, handler=None): # create logger logger = logging.getLogger(name) for hdlr in list(logger.handlers): # make a copy so it doesn't change @@ -69,6 +69,21 @@ def set_logging(name="charon", level=logging.DEBUG, handler=None): # add ch to logger logger.addHandler(handler) + set_log_file_handler(product, version, logger) + logger = logging.getLogger('charon') for hdlr in list(logger.handlers): # make a copy so it doesn't change hdlr.setFormatter(formatter) + + +def set_log_file_handler(product: str, version: str, logger: logging): + log_loc = os.getenv("ERROR_LOG_LOCATION") + error_log = "".join([product, "-", version, ".", DEFAULT_ERRORS_LOG]) + if log_loc: + os.makedirs(log_loc, exist_ok=True) + error_log = os.path.join(log_loc, error_log) + handler = logging.FileHandler(error_log) + formatter = logging.Formatter(fmt=CHARON_LOGGING_FMT) + handler.setFormatter(formatter) + handler.setLevel(logging.WARN) + logger.addHandler(handler)