1*55e87721SMatt Gilbride# Copyright 2018 Google LLC 2*55e87721SMatt Gilbride# 3*55e87721SMatt Gilbride# Licensed under the Apache License, Version 2.0 (the "License"); 4*55e87721SMatt Gilbride# you may not use this file except in compliance with the License. 5*55e87721SMatt Gilbride# You may obtain a copy of the License at 6*55e87721SMatt Gilbride# 7*55e87721SMatt Gilbride# https://www.apache.org/licenses/LICENSE-2.0 8*55e87721SMatt Gilbride# 9*55e87721SMatt Gilbride# Unless required by applicable law or agreed to in writing, software 10*55e87721SMatt Gilbride# distributed under the License is distributed on an "AS IS" BASIS, 11*55e87721SMatt Gilbride# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*55e87721SMatt Gilbride# See the License for the specific language governing permissions and 13*55e87721SMatt Gilbride# limitations under the License. 14*55e87721SMatt Gilbride 15*55e87721SMatt Gilbrideimport logging 16*55e87721SMatt Gilbrideimport sys 17*55e87721SMatt Gilbride 18*55e87721SMatt Gilbridetry: 19*55e87721SMatt Gilbride from colorlog import ColoredFormatter 20*55e87721SMatt Gilbrideexcept ImportError: 21*55e87721SMatt Gilbride ColoredFormatter 22*55e87721SMatt Gilbride 23*55e87721SMatt GilbrideSUCCESS = 25 24*55e87721SMatt Gilbride 25*55e87721SMatt Gilbride 26*55e87721SMatt Gilbrideclass LoggerWithSuccess(logging.getLoggerClass()): # type: ignore 27*55e87721SMatt Gilbride def __init__(self, name, level=logging.NOTSET): 28*55e87721SMatt Gilbride super(LoggerWithSuccess, self).__init__(name, level) 29*55e87721SMatt Gilbride logging.addLevelName(SUCCESS, "SUCCESS") 30*55e87721SMatt Gilbride 31*55e87721SMatt Gilbride def success(self, msg, *args, **kwargs): 32*55e87721SMatt Gilbride if self.isEnabledFor(SUCCESS): 33*55e87721SMatt Gilbride self._log(SUCCESS, msg, args, **kwargs) 34*55e87721SMatt Gilbride else: # pragma: no cover 35*55e87721SMatt Gilbride pass 36*55e87721SMatt Gilbride 37*55e87721SMatt Gilbride 38*55e87721SMatt Gilbridedef _setup_logging(color: bool = bool(ColoredFormatter)): 39*55e87721SMatt Gilbride logging.getLogger("urllib3.connectionpool").setLevel(logging.ERROR) 40*55e87721SMatt Gilbride logging.setLoggerClass(LoggerWithSuccess) 41*55e87721SMatt Gilbride 42*55e87721SMatt Gilbride # Silence any noisy loggers here. 43*55e87721SMatt Gilbride logging.getLogger("watchdog.observers").setLevel(logging.INFO) 44*55e87721SMatt Gilbride 45*55e87721SMatt Gilbride 46*55e87721SMatt Gilbridedef configure_logger(name: str, color: bool = bool(ColoredFormatter)): 47*55e87721SMatt Gilbride """Create and configure the default logger for autosynth. 48*55e87721SMatt Gilbride The logger will prefix the log message with the current time and the 49*55e87721SMatt Gilbride log severity. 50*55e87721SMatt Gilbride """ 51*55e87721SMatt Gilbride logger = logging.getLogger(name) 52*55e87721SMatt Gilbride logger.setLevel(logging.DEBUG) 53*55e87721SMatt Gilbride 54*55e87721SMatt Gilbride handler = logging.StreamHandler() 55*55e87721SMatt Gilbride handler.setLevel(logging.DEBUG) 56*55e87721SMatt Gilbride 57*55e87721SMatt Gilbride if color is True and sys.stdout.isatty(): 58*55e87721SMatt Gilbride formatter = ColoredFormatter( 59*55e87721SMatt Gilbride "%(asctime)s %(purple)s%(name)s > %(log_color)s%(message)s", 60*55e87721SMatt Gilbride reset=True, 61*55e87721SMatt Gilbride log_colors={ 62*55e87721SMatt Gilbride "DEBUG": "cyan", 63*55e87721SMatt Gilbride "INFO": "blue", 64*55e87721SMatt Gilbride "WARNING": "yellow", 65*55e87721SMatt Gilbride "ERROR": "red", 66*55e87721SMatt Gilbride "CRITICAL": "red,bg_yellow", 67*55e87721SMatt Gilbride "SUCCESS": "green", 68*55e87721SMatt Gilbride }, 69*55e87721SMatt Gilbride ) 70*55e87721SMatt Gilbride else: 71*55e87721SMatt Gilbride formatter = logging.Formatter( # type: ignore 72*55e87721SMatt Gilbride "%(asctime)s %(name)s [%(levelname)s] > %(message)s" 73*55e87721SMatt Gilbride ) 74*55e87721SMatt Gilbride 75*55e87721SMatt Gilbride handler.setFormatter(formatter) 76*55e87721SMatt Gilbride logger.addHandler(handler) 77*55e87721SMatt Gilbride return logger 78*55e87721SMatt Gilbride 79*55e87721SMatt Gilbride 80*55e87721SMatt Gilbride_setup_logging() 81*55e87721SMatt Gilbridelogger = configure_logger("synthtool") 82*55e87721SMatt Gilbride 83*55e87721SMatt Gilbride 84*55e87721SMatt Gilbridedef success(*args, **kwargs): 85*55e87721SMatt Gilbride logger.success(*args, **kwargs) 86*55e87721SMatt Gilbride 87*55e87721SMatt Gilbride 88*55e87721SMatt Gilbridedef debug(*args, **kwargs): 89*55e87721SMatt Gilbride logger.debug(*args, **kwargs) 90*55e87721SMatt Gilbride 91*55e87721SMatt Gilbride 92*55e87721SMatt Gilbridedef info(*args, **kwargs): 93*55e87721SMatt Gilbride logger.info(*args, **kwargs) 94*55e87721SMatt Gilbride 95*55e87721SMatt Gilbride 96*55e87721SMatt Gilbridedef warning(*args, **kwargs): 97*55e87721SMatt Gilbride logger.warning(*args, **kwargs) 98*55e87721SMatt Gilbride 99*55e87721SMatt Gilbride 100*55e87721SMatt Gilbridedef error(*args, **kwargs): 101*55e87721SMatt Gilbride logger.warning(*args, **kwargs) 102*55e87721SMatt Gilbride 103*55e87721SMatt Gilbride 104*55e87721SMatt Gilbridedef exception(*args, **kwargs): 105*55e87721SMatt Gilbride logger.warning(*args, **kwargs) 106*55e87721SMatt Gilbride 107*55e87721SMatt Gilbride 108*55e87721SMatt Gilbridedef critical(*args, **kwargs): 109*55e87721SMatt Gilbride logger.critical(*args, **kwargs) 110