Bugs item #1164953, was opened at 2005-03-17 02:38 Message generated for change (Comment added) made by vsajip You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=105470&aid=1164953&group_id=5470
Category: Python Library Group: None >Status: Closed >Resolution: Invalid Priority: 5 Submitted By: logistix (logistix) Assigned to: Vinay Sajip (vsajip) Summary: logging.basicConfig creates phantom handler Initial Comment: calling logging.basicConfig() creates a phantom handler that doesn't operate in an intuitive way. A reproducable follows. My actual use case: I started off using the logging module on a project with the builting logging.info(), logging.debug(), logging.error() functions. As my needs got more sophisticated, I started creating some loggers via logging.getLogger('a.b.c') I setup a custom handler to do formatting without printing "INFO:a.b.c" headers. One of my import statements triggered a call to logging.basicConfig. Halfway through the running program, my logging messages started showing up twice. Once without the header and once with. I eventually tracked this down to usage of a logging.info() statement. I tried explicitly calling logging.basicConfig (level=logging.ERROR) to disable the duplicate errors, but that didn't work. A trivial patch is attached. It fixes the problem if you explicitly call logging.basicConfig. I don't know if it will fix the implicit calls by logging.info(), etc. C:\Python24>python Python 2.4 (#60, Nov 30 2004, 11:49:19) [MSC v.1310 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import logging >>> >>> logger = logging.getLogger('foo') >>> logger.setLevel(logging.INFO) >>> logger.info('bar') # no output yet No handlers could be found for logger "foo" >>> >>> console = logging.StreamHandler() >>> console.setLevel(logging.INFO) >>> console.setFormatter(logging.Formatter("% (message)s") ... ) >>> logger.addHandler(console) >>> >>> logger.info('foo') foo >>> >>> logger.warning('foo') foo >>> >>> logger.debug('foo') >>> >>> logger.info('foo') foo >>> >>> logging.basicConfig(level=logging.ERROR) >>> >>> logger.info('foo') foo INFO:foo:foo >>> ^Z C:\Python24> ---------------------------------------------------------------------- >Comment By: Vinay Sajip (vsajip) Date: 2005-03-17 10:52 Message: Logged In: YES user_id=308438 Thanks for the feedback, but it's not a bug. Check the docstring for basicConfig: "This function does nothing if the root logger already has handlers configured. It is a convenience method intended for use by simple scripts to do one-shot configuration of the logging package. The default behaviour is to create a StreamHandler which writes to sys.stderr, set a formatter using the BASIC_FORMAT format string, and add the handler to the root logger." The logging.debug(), etc. methods are for simple use of the logging package. If you are using named loggers, then don't use basicConfig() except to configure a handler at the root level - and do this early in your application. Thereafter you can log to the root logger (using logging.debug() and its brethren) or to a named logger which has no handlers set (the root's handlers will be used). If you add a console handler manually to logger "foo" and then add another one to the root handler via basicConfig(), then both handlers will be called (correctly). This is what you are seeing. Your fix (add the level to the handler as well) does not fit the contract of basicConfig(). Users working in simple mode will just use the logger's level. Setting levels in the handler is for more sophisticated use of the logging package than implied by use of basicConfig() and logging.debug(), etc. ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=105470&aid=1164953&group_id=5470 _______________________________________________ Python-bugs-list mailing list Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com