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

Reply via email to