For all of the logging needs your application modules should use the pmnc_log function:
pmnc_log("I log therefore I am")
will append the following line to the log:
HH:MM:SS.NN [ThreadName] I log therefore I am # module.py:123 in method()
As you can see, each write to the log file is decorated with local time precise to a hundredth of a second, the readable name of the thread to execute your code and the exact location of the pmnc_log statement in it.
Each Pythomnic cage has a separate private log file in logs/node.cage.YYYY-MM-DD.log, which is rotated daily at midnight. The rotated logs are compressed to save space.
Although what and whether to log is left to developer's choice, you are encouraged to perform some reasonable logging. Logging is done to a line-structured plain text file. This simplifies reading and procesing. The log file may be used not only for monitoring the running activity, but also for manual recovering from crash. For that matter, log file does for an administrator the same as transaction log does for a database server. More logging is better than less logging.
One other area where careful logging help immensely is that of blame allocation. It is paricularly important for a middleware application, because in case of a failure you will have to provide evidence that your code is working fine, and it's something else that broke.
Fault-wise, logging is the last resort. If logging itself fails (out of disk space, anyhow), tough, bad luck, the message to the world is lost, but the service must keep running. Therefore logging errors are ignored.