Examples

Basic Example

import logging
from uuid import uuid4

import fprl
from flask import Flask, current_app, request

# Init our app
app = Flask("test_app")


@app.route("/")
def hi():
    request.logger.info("Stuff happens")
    return "Hello World!"


# Configure fprl
app.before_request(fprl.inject_logger)


# Configure logging
logging.basicConfig(level="DEBUG")


# Configure some automated logging at request start/end
#
# Note that this additional before_request occurs **after**
# the fprl configuration - so we have access to the logger.
def log_request_completes(resp):
    request.logger.debug("Request complete!")
    return resp


def log_request_begins():
    request.logger.debug("Request begins!")


app.before_request(log_request_begins)
app.after_request(log_request_completes)

Structlog Example

import datetime
import logging
from uuid import uuid4

import fprl
import structlog
from flask import Flask, current_app, request


def build_structlog_logger():
    logger = structlog.get_logger("{}.per_request".format(current_app.import_name))
    logger = logger.bind(request_id=uuid4().hex)
    if int(datetime.datetime.now().isoformat()[-1]) % 2 == 0:
        logger.bind(demo="Bind per request!")
    return logger


# Init our app
app = Flask("test_app")


@app.route("/")
def hi():
    request.logger.info("Stuff happens", stuff=[1, 2, 3])
    return "Hello World!"


# Configure fprl
# Override the fprl.build_logger call to return a
# structlog instance of a stdlib logger.
fprl.build_logger = build_structlog_logger
# Hook
app.before_request(fprl.inject_logger)


# Configure logging/structlog
logging.basicConfig(level="INFO")
structlog.configure(
    processors=[
        structlog.processors.TimeStamper(),
        structlog.processors.JSONRenderer(indent=2, sort_keys=True),
    ],
    context_class=structlog.threadlocal.wrap_dict(dict),
    logger_factory=structlog.stdlib.LoggerFactory(),
)


# Configure some automated logging at request start/end
#
# Note that this additional before_request occurs **after**
# the fprl configuration - so we have access to the logger.
def log_request_completes(resp):
    request.logger.debug("Request complete!")
    return resp


def log_request_begins():
    request.logger.debug("Request begins!")


app.before_request(log_request_begins)
app.after_request(log_request_completes)