Logging¶
You have several options for logging in your
application. You can use any of the options
available to lambda functions as outlined
in the
AWS Lambda Docs.
The simplest option is to just use print statements.
Anything you print will be accessible in cloudwatch logs
as well as in the output of the chalice logs
command.
In addition to using the stdlib logging
module directly,
the framework offers a preconfigured logger designed to work
nicely with Lambda. This is offered purely as a convenience,
you can use print
or the logging
module directly if you prefer.
You can access this logger via the app.log
attribute, which is a logger specifically for your application.
This attribute is an instance of logging.getLogger(your_app_name_)
that’s been preconfigured with reasonable defaults:
StreamHandler associated with
sys.stdout
.Log level set to
logging.ERROR
by default. You can also manually set the logging level by settingapp.log.setLevel(logging.DEBUG)
.A logging formatter that displays the app name, level name, and message.
Examples¶
In the following application, we’re using the application logger
to emit two log messages, one at DEBUG
and one at the ERROR
level:
from chalice import Chalice
app = Chalice(app_name='demolog')
@app.route('/')
def index():
app.log.debug("This is a debug statement")
app.log.error("This is an error statement")
return {'hello': 'world'}
If we make a request to this endpoint, and then look at
chalice logs
we’ll see the following log message:
2016-11-06 20:24:25.490000 9d2a92 demolog - ERROR - This is an error statement
As you can see, only the ERROR
level log is emitted because
the default log level is ERROR
. Also note the log message formatting.
This is the default format that’s been automatically configured.
We can make a change to set our log level to debug:
import logging
from chalice import Chalice
app = Chalice(app_name='demolog')
# Enable DEBUG logs.
app.log.setLevel(logging.DEBUG)
@app.route('/')
def index():
app.log.debug("This is a debug statement")
app.log.error("This is an error statement")
return {'hello': 'world'}
Now if we make a request to the /
URL and look at the
output of chalice logs
, we’ll see the following log message:
2016-11-07 12:29:15.714 431786 demolog - DEBUG - This is a debug statement
2016-11-07 12:29:15.714 431786 demolog - ERROR - This is an error statement
As you can see here, both the debug and error log message are shown.
You can use the -n/--name
option to view the logs for a specific lambda
function. By default, the logs for the API handler lambda function are shown.
This corresponds to any log statements made within an @app.route()
call.
The name option is the logical name of the lambda function. This is the
name of the python function by default, or whatever name you provided
as the name
kwarg to the @app.lambda_function()
call. For example,
given this app:
from chalice import Chalice
app = Chalice(app_name='multilog')
@app.lambda_function()
def foo(event, context):
app.log.debug("Invoking from function foo")
return {'hello': 'world'}
@app.lambda_function(name='MyFunction)
def bar(event, context):
incr_counter()
app.log.debug("Invoking from function bar")
return {'hello': 'world'}
You can retrieve logs for the above function by running:
$ chalice logs --name foo
$ chalice logs --name MyFunction