Thank you Alan, ----- from previous mail ----
> if any(logleveltocheck.upper() in lf for lf in ['DEBUG', > 'INFO', 'WARNING', 'ERROR', 'CRITICAL']): > return logleveltocheck.upper() Are you sure that is what you want? It seems very complicated unless you are allowing the user to supply an abbreviated form. Otherwise if logleveltocheck.upper() in ['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL']: return logleveltocheck.upper() might be easier? > else > return 'INFO' > > log_file_level='INFO' #check_log_level('info') > log_console_level='INFO' #check_log_level('info') > > #root level > logger.setLevel('INFO') I'm not sure what this is supposed to be doing! ------ end ---- I am thinking about a module where user can change the logging mode and doing so without modifying code, I am thinking to extend it with parameter module. I seen many software that if user set logging Level 1,2,3,4 or support mode, then application will create more information in the log file accordingly. The method I am using most likely is wrong. I dont know where should I trigger the log Level to achieve parameterize logging mode. I have one question I have following set stream_handler.setLevel('INFO') <--- handler to console file_handler.setLevel('INFO') <---- handler to file both are added to logger logger.addHandler(file_handler) logger.addHandler(stream_handler) If I did not set the logger.setLevel like following logger.setLevel('INFO') the logger unable to process logger.info('Current log level is : {}'.format(logger.level)) ----> return 10 if logger.setLevel('DEBUG') if not My question is what is the different between stream_handler.setLevel('INFO') and logger.setLevel('INFO') Why do we need logger.setLevel('INFO') if we stated following stream_handler.setLevel('INFO') <--- handler to console file_handler.setLevel('INFO') <---- handler to file --- complete code import logging #DEBUG : Detailed information, typically of interest only when diagnosing problems. #INFO : Confirmation that things are working as expected. #WARNING (default): An indication that something unexpected happened, or indicative of some problem in the near future # (e.g. 'disk space low'). The software is still working as expected. #ERROR : Due to a more serious problem, the software has not been able to perform some function. #CRITICAL :A serious error, indicating that the program itself may be unable to continue running. from functools import wraps def logme(orig_func): #Without getLogger name it will log all in root logger = logging.getLogger(__name__) #Check log level within understanable parameter, set to INFO if is not permitable value def check_log_level(logleveltocheck): #as per advised from Alan Gauld @python.org if logleveltocheck.upper() in ['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL']: return logleveltocheck.upper() else: return 'INFO' log_file_level='INFO' #check_log_level('info') log_console_level='INFO' #check_log_level('info') #root level logger.setLevel('DEBUG') formatter = logging.Formatter('%(asctime)s :: %(name)s :: %(levelname)s :: %(message)s') #Read log file from parameter logfile='mylogfile.log' file_handler = logging.FileHandler(logfile) file_handler.setLevel(log_file_level) file_handler.setFormatter(formatter) stream_handler = logging.StreamHandler() stream_handler.setLevel(log_console_level) stream_handler.setFormatter(formatter) logger.addHandler(file_handler) logger.addHandler(stream_handler) #this wraps is to make sure we are returning orig_func instead of wrapper @wraps(orig_func) def wrapper(*args, **kwargs): logger.info('Ran with args: {}, and kwargs: {}'.format(args, kwargs)) logger.info('Current log level is : {}'.format(logger.level)) return orig_func(*args, **kwargs) return wrapper def timer(orig_func): import time #this wraps is to make sure we are returning orig_func instead of wrapper @wraps(orig_func) def wrapper(*args, **kwargs): t1 = time.time() result = orig_func(*args, **kwargs) t2 = time.time() - t1 print('{} ran in {} sec'.format(orig_func.__name__, t2)) return result @logme def hello(name, age): print('I am {}, and I am {} years old'.format(name, age)) hello('Peter Parker', 20) On Fri, Aug 2, 2019 at 12:14 AM Alan Gauld via Tutor <tutor@python.org> wrote: > On 01/08/2019 10:11, Sinardy Xing wrote: > > > ---- start here--- > > > > import logging > > > > ..snip... > > > > from functools import wraps > > > > def logme(func_to_log): > > import logging > > You don't need the import, it's already done in the first line. > > > > #Check log level within understanable parameter, set to INFO if is > not > > permitable value > > def check_log_level(logleveltocheck): > > This looks like an indentation error? > It should be at the same level as the import statement. > > > if any(logleveltocheck.upper() in lf for lf in ['DEBUG', > > 'INFO', 'WARNING', 'ERROR', 'CRITICAL']): > > return logleveltocheck.upper() > > Are you sure that is what you want? It seems very complicated unless you > are allowing the user to supply an abbreviated form. Otherwise > > if logleveltocheck.upper() in ['DEBUG', 'INFO', 'WARNING', > 'ERROR', 'CRITICAL']: > return logleveltocheck.upper() > > might be easier? > > > else > > return 'INFO' > > > > log_file_level='INFO' #check_log_level('info') > > log_console_level='INFO' #check_log_level('info') > > > > #root level > > logger.setLevel('INFO') > > I'm not sure what this is supposed to be doing! > > > formatter = logging.Formatter('%(asctime)s :: %(name)s :: > %(levelname)s > > :: %(message)s') > > > > #Read log file from parameter > > logfile='mylogfile.log' > > file_handler = logging.FileHandler(logfile) > > file_handler.setLevel(log_file_level) > > file_handler.setFormatter(formatter) > > > > stream_handler = logging.StreamHandler() > > stream_handler.setLevel(log_console_level) > > stream_handler.setFormatter(formatter) > > > > logger.addHandler() > > logger.addHandler(stream_handler) > > > > #this wraps is to make sure we are returning func_to_log instead of > > wrapper > > @wraps(func_to_log) > > def wrapper(*args, **kwargs): > > logger.info('Ran with args: {}, and kwargs: {}'.format(args, > > kwargs)) > > return func_to_log(*args, **kwargs) > > > > return wrapper > > -- > Alan G > Author of the Learn to Program web site > http://www.alan-g.me.uk/ > http://www.amazon.com/author/alan_gauld > Follow my photo-blog on Flickr at: > http://www.flickr.com/photos/alangauldphotos > > > _______________________________________________ > Tutor maillist - Tutor@python.org > To unsubscribe or change subscription options: > https://mail.python.org/mailman/listinfo/tutor > _______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: https://mail.python.org/mailman/listinfo/tutor