You need to set the logging level for the logger as well. By default, it's set to logging.WARNWARNING, so neither handler is seeing the message, let alone determining if it should be handled.
logging.basicConfig( level=logging.INFO, handlers={ _add_handler(logging.FileHandler("filename.log")), _add_handler(logging.StreamHandler()) })