I recently deployed a python application in google app engine / container engine. When I went to check the logs, everything was logged at the “ERROR” level even though my application uses python logging properly. As far as I know there are 2 ways to fix that:
- Use the stackdriver client, which requires an additional dependency and somewhat binds your program to google app engine.
- Format the logs in a way that stackdriver can parse them, which is easily configurable.
Since I try to avoid binding my app whenever I can, I chose the latter. This solution is also rather simple. All you need to write the logs in json format with the proper keys.
- Severity: Indicates the log level
- Message: The message itself, which will appear as the line label.
Then you can add whatever keys you would like. Here is a working code sample.
import logging import json class StackdriverFormatter(logging.Formatter): def __init__(self, *args, **kwargs): super(StackdriverFormatter, self).__init__(*args, **kwargs) def format(self, record): return json.dumps({ 'severity': record.levelname, 'message': record.getMessage(), 'name': record.name }) if __name__ == '__main__': log = logging.getLogger('') sh = logging.StreamHandler() sf = StackdriverFormatter() sh.setFormatter(sf) log.addHandler(sh) log.setLevel(logging.DEBUG) log.error("This is an error") log.warning("This is a warning") log.info("I think you got it")