One other thing to consider is if you have code where speed is a concern. Or if you are printing something where formats may change in rare corner cases, like say if communication is lost, or an error occurs.
Consider these 2 options:
msg = "Parameters are: %.3f, %.3f, %.3f, %.3f, %.3f, %.3f, %.3f, %.3f"%(p[0],p[1],p[2],p[3],p[4],p[5],p[6],p[7])
logger.debug(msg)
or
if VERBOSE:
msg = "Parameters are: %.3f, %.3f, %.3f, %.3f, %.3f, %.3f, %.3f, %.3f"%(p[0],p[1],p[2],p[3],p[4],p[5],p[6],p[7])
print msg
In the first case, the string formatting is still getting done even if the logging level is not DEBUG, which will impact overall performance. In the second, if VERBOSE is False, nothing gets done.
Also, I have ran into troubles where exceptions are generated from the string formatting of debug messages. Take for example in the above code, if there is a rare use case where "p" only has 6 values, you will get an index error. Or if one of the p values is "None", you will get an exception. But in the second case, if VERBOSE is False, you will never see a crash caused by the debug code.
So logging is very handy, but I tend to use it only in cases where I want the messaging as a permanent code feature. If I need to put in a temporary message to help debug a one time problem, I'll usually just use print statements.
And also as general rule, stuff the end user is meant to see should be "print".