[Tutor] Create Logging module
Sinardy Xing
sinardyxing at gmail.com
Fri Aug 2 02:36:25 EDT 2019
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 at 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 at python.org
> To unsubscribe or change subscription options:
> https://mail.python.org/mailman/listinfo/tutor
>
More information about the Tutor
mailing list