blueFast
blueFast

Reputation: 44331

Change log level in unittest

I have the impression (but do not find the documentation for it) that unittest sets the logging level to WARNING for all loggers. I would like to:

How can I achieve this?

Upvotes: 28

Views: 10344

Answers (5)

Dwigt
Dwigt

Reputation: 1049

Programmatically:

Put this line of code in each test function defined in your class that you want to set the logging level:

logging.getLogger().setLevel(logging.INFO)

Ex. class:

import unittest
import logging


class ExampleTest(unittest.TestCase):
    def test_method(self):
        logging.getLogger().setLevel(logging.INFO)
        ...

Command Line:

This example just shows how to do it in a normal script, not specific to unittest example. Capturing the log level via command line, using argparse for arguments:

import logging
import argparse

...

def parse_args():
    parser = argparse.ArgumentParser(description='...')
    parser.add_argument('-v', '--verbose', help='enable verbose logging', action='store_const', dest="loglevel", const=logging.INFO, default=logging.WARNING)

...

def main():
    args = parse_args()
    logging.getLogger().setLevel(args.loglevel)

Upvotes: 0

gMale
gMale

Reputation: 17895

this worked for me:

logging.basicConfig(level=logging.DEBUG)

And if I wanted a specific format:

logging.basicConfig(
    level=logging.DEBUG,
    datefmt="%H:%M:%S",
    format="%(asctime)s.%(msecs)03d [%(levelname)-5s] %(message)s",
)

Upvotes: 0

Hassan Mehmood
Hassan Mehmood

Reputation: 1402

See below example for logging in Python. Also you can change LOG_LEVEL using 'setLevel' method.

import os
import logging

logging.basicConfig()
logger = logging.getLogger(__name__)

# Change logging level here.
logger.setLevel(os.environ.get('LOG_LEVEL', logging.INFO))

logger.info('For INFO message')
logger.debug('For DEBUG message')
logger.warning('For WARNING message')
logger.error('For ERROR message')
logger.critical('For CRITICAL message')

Upvotes: 8

Raj Kumar
Raj Kumar

Reputation: 1587

This is in addition to @Vinay's answer above. It does not answer the original question. I wanted to include command line options for modifying the log level. The intent was to get detailed loggin only when I pass a certain parameter from the command line. This is how I solved it:

import sys
import unittest
import logging
from histogram import Histogram
class TestHistogram(unittest.TestCase):

def test_case2(self):
    h = Histogram([2,1,2])
    self.assertEqual(h.calculateMaxAreaON(), 3)

if __name__ == '__main__':
    argv = len(sys.argv) > 1 and sys.argv[1]
    loglevel = logging.INFO if argv == '-v' else logging.WARNING
    logging.basicConfig(level=loglevel)
    unittest.main() 

The intent is to get more verbose logging. I know it does not answer the question, but I'll leave it here in case someone comes looking for a similar requirement such as this.

Upvotes: 0

Vinay Sajip
Vinay Sajip

Reputation: 99307

I don't believe unittest itself does anything to logging, unless you use a _CapturingHandler class which it defines. This simple program demonstrates:

import logging
import unittest

logger = logging.getLogger(__name__)

class MyTestCase(unittest.TestCase):
    def test_something(self):
        logger.debug('logged from test_something')


if __name__ == '__main__':
    # DEBUG for demonstration purposes, but you could set the level from
    # cmdline args to whatever you like
    logging.basicConfig(level=logging.DEBUG, format='%(name)s %(levelname)s %(message)s')
    unittest.main()

When run, it prints

__main__ DEBUG logged from test_something
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

showing that it is logging events at DEBUG level, as expected. So the problem is likely to be related to something else, e.g. the code under test, or some other test runner which changes the logging configuration or redirects sys.stdout and sys.stderr. You will probably need to provide more information about your test environment, or better yet a minimal program that demonstrates the problem (as my example above shows that unittest by itself doesn't cause the problem you're describing).

Upvotes: 14

Related Questions