I think the Logging HOWTO might answer some of your questions.
I believe Nengo is not choosing a log file or a log level by itself. Thus, the defaults get used: Printing to the command line and a log level of
'warning'. We provide the convenience function
nengo.utils.logging.log(...) to quickly set up logging to a file and a different log level. If I need logging output, I usually put a
nengo.log('info') at the beginning of my script.
I mainly use it in Nengo to get information about what Nengo is doing that I could not get easily otherwise. For example, it is used in the cache to log hits and misses. That allows me to determine whether the cache is correctly working. From the outside the same decoders are returned for a hit and a miss, so I could not tell otherwise. Another example is the optimizer where I log information on the number of passes and reduction in the number of operators whereas the final model should exactly do the same.
I don't use
logging for ad-hoc debugging output that I intend to remove after diagnosing the problem. Though for complex problems the ability to have some control over the messages produced could be helpful.