Skip to main content

Request Attributes in Log Messages

Latest Version Supported Python versions Supported Python versions License build status

What It Does

The pyramid_log distribution includes a Python logging formatter which makes Pyramid request attributes available for use in its format string. Specifically, pyramid_log.Formatter is special in the following ways:

  • It sets a .request attribute on the log record (if one doesn’t already exist.)

  • It supports dotted attribute access in its format string. For example, "%(request.method)s" and even "%(request.matched_route.name)s" will work in the format string.

  • There is a syntax for explicitly specifying fallback values. For example, a format string of "%(request.method|<no request>)s" will format to "<no request>" if there is no current request (or if the current request has no method attribute.)

The pyramid request has many attributes which can be useful when included in the logs of a web app. These include, but are not limited to:

  • request.method

  • request.url (or request.path, request.path_qs, etc…)

  • request.unauthenticated_userid

  • request.client_addr

  • request.GET (or request.POST or request.params)

  • request.matched_route.name, request.view_name

See the Pyramid documentation for a more complete list of available request attributes.

Installation

The distribution may be downloaded from pypi, but it may be easier to install using pip:

pip install pyramid-log

It has been tested on python 2.7, 3.4–3.6 and pypy.

Development happens at https://github.com/dairiki/pyramid_log/.

Configuration

Configuring Logging in a File

If you configure logging in your application configuration (or some other) file you can do something like:

[loggers]
key = root

[handlers]
keys = console

[formatters]
keys = pyramid

[logger_root]
level = INFO
handlers = console

[handler_console]
class = StreamHandler
args = (sys.stderr,)
level = NOTSET
formatter = pyramid

[formatter_pyramid]
# NB: Here is the interesting part!
class = pyramid_log.Formatter
format = %(asctime)s %(request.method|no request)s %(request.path_qs|)s
         %(levelname)-5.5s [%(name)s] %(message)s

This will result in your log messages looking something like:

2014-10-01 17:55:02,001 GET /path?arg=foo
WARNI [myapp.views] This is some log message!

Refer to Pyramid’s chapter on logging and the documentation for the Python logging module’s configuration file format for more details on how this works.

Imperative Configuration

You can of course configure logging imperatively. For example, with:

import logging
from pyramid_log import Formatter

fmt = Formatter(
    '%(asctime)s %(request.client_addr|-)s'
    ' %(request.method|-)s %(request.path_qs|-)s: %(message)s')

logging.basicConfig()
root_logger = logging.getLogger()
for handler in root_logger.handlers:
    handler.setFormatter(fmt)

Then, a view can log a message like so:

log = logging.getLogger(__name__)

@view_config(name='persimmon')
def persimmon_view(request):
    log.warning("%s was called!", request.view_name)

Which will yield a log message like:

2014-10-01 17:55:02,001 192.168.1.1 GET /persimmon: persimmon was called

Further Details

Accessing Dict-like Values

The dot notation can be used to access not only instance attributes, but also to access items in dict-like values. Attribute access is tried first; if there is no attribute of the given name, then the instances __getitem__ method is tried. For example, "%(request.matchdict.id)s" will get at request.matchdict['id'].

Numeric Fallback

Explicit fallback values are always interpreted as strings, however, if the fallback is used in a numeric context, an attempt will be made at conversion to the requested type. For example, if there is no request, "%+(request.status_code|555)d" will format to "+555".

If the fallback string can not be converted to a numeric value, then 0 (zero) is used in integer contexts and NaN is used in float contexts.

Default Fallback Values

If no fallback value is explicitly specified, then a default fallback value will be used if the requested attribute does not exist. The missing attribute name is included in the default fallback value. For example "%(request.method)s" will produce "<?request.method?>" if there is no current request.

See Also

The pyramid_logging distribution provides similar functionality.

Author

Jeff Dairiki <dairiki@dairiki.org>

History

Release 1.0.1 (2021-12-07)

A bit of code refactoring and cleanup in preparation for dropping python 2 support.

No API or functional changes.

Release 1.0 (2021-12-05)

This release adds support for python>=3.8 and pyramid>=2.

The 1.x releases will be the last to support running under python 2.7.

Compatibility

  • Python >= 3.8: logger.Formatter requires the validate=False argument, otherwise it forbids '.' in %-style format strings.

  • Pyramid >= 2.0: provide our own replacement for pyramid.compat which no longer exists

Testing

  • Test under python 3.7–3.10 and pypy3.

  • Stop testing under python 3.4 and 3.5.

  • Test with Pyramid 1.*

  • Convert CI tests from Travis to github workflow

Packaging

  • The packaging has been PEP517-ized.

Release 0.2.1 (2017-12-17)

This release officially drops support for python 2.6, 3.2, 3.3 (and therefore pypy3) and adds support for python 3.5 and 3.6.

Other than changes in test configuration, there are no substantive changes from 0.2.

Release 0.2 (2014-10-09)

Features

Better fallback values.
  • Now, by default, if an attribute is missing (which can happen, e.g., for %(request.method)s is there is no current request) it is rendered as <?attribute-name?> (e.g. "<?request.method?>".)

  • There is now a syntax for explicitly specifying fallback values. E.g. "%(request.method|(no-request))" which will format to (no request), if there is no current request (or if the current request does not have a method attribute.)

Dict-like access to values
  • When looking up a dotted name, if an attribute can not be found, dict-style (__getitem__) lookup will be attempted. E.g. "%(request.matchdict.arg)" will get at request.matchdict['arg'].

Release 0.1.1 (2014-10-02)

Bugs Fixed

  • If an exception is thrown by a request property, render it as None.

  • Disable logging during log formatting to prevent recursion if a request property generates a log message.

Release 0.1 (2014-10-02)

  • Initial release

Metadata

Release files for pyramid-log 1.0.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pyramid-log 1.0.1
File Size Uploaded
pyramid_log-1.0.1.tar.gz 15.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pyramid-log 1.0.1
File Interpreter ABI Platform
pyramid_log-1.0.1-py2.py3-none-any.whl Python 3, Python 2 none any Details

Total release size: 26.7 kB

Release files / pyramid_log-1.0.1.tar.gz

Download URL pyramid_log-1.0.1.tar.gz
Size 15.1 kB
Tags Source
SHA-256 checksum
How to use checksums
0f31d8e779d989a4d2a519a433f1d49a197def4ea2d2f31637ace88f02475712
BLAKE2b-256 checksum
How to use checksums
5e086752a1f0dcaff9d534c3c869259b31c35c41820588475ef29b88b3549ceb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.7.1 importlib_metadata/4.8.2 pkginfo/1.8.2 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.9

Release files / pyramid_log-1.0.1-py2.py3-none-any.whl

Download URL pyramid_log-1.0.1-py2.py3-none-any.whl
Size 11.6 kB
Tags Python 2 Python 3
SHA-256 checksum
How to use checksums
e793190ff2a3a63ca63fdc7ead7e72dcee8aa3512d4eee5f245a64ffd5bfde46
BLAKE2b-256 checksum
How to use checksums
5cfbc6c956235b6c1cd43a760fc08832970ad8c423135be1d80e6633fa9b4b14
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.7.1 importlib_metadata/4.8.2 pkginfo/1.8.2 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.9

Release history Release notifications | RSS feed

This release

1.0.1 This release

2 release files

1.0.0

2 release files

0.2.1

2 release files

0.2

2 release files

0.1.1

1 release file

0.1

1 release file

0.1rc1

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page