The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.


Plack::Middleware::DBIC::QueryLog - Expose a DBIC QueryLog Instance in Middleware


    use Plack::Builder;
    builder {
      enable 'DBIC::QueryLog',
        querylog_args => {passthrough => 1};


Plack::Middleware::DBIC::QueryLog does one thing, it places an object that is either an instance of DBIx::Class::QueryLog OR a compatible object into the $env under plack.middleware.dbic.querylog. A new instance is created for each incoming request.

The querylog is intended to be used by DBIX::Class to log and profile SQL queries, particularly during the context of a web request handled by your Plack application. See the documentation for DBIx::Class::QueryLog and in "debugobj" in DBIx::Class::Storage for more information.

This middleware is intended to act as a bridge between DBIx::Class, which can consume and populate the querylog, with a reporting tool such as seen in Plack::Middleware::Debug::DBIC::QueryLog. This functionality was refactored out of Plack::Middleware::Debug::DBIC::QueryLog to facilitate interoperation with other types of reporting tools. For example, you may want query logging but you don't need the Plack debug panels (maybe you are building an RPC or REST application server and want sql query logging, is a possible use case).

Unless you are building some custom logging tools, you probably just want to use the existing debug panel (Plack::Middleware::Debug::DBIC::QueryLog) rather than building something custom around this middleware.

If you are using an existing web application development system such as Catalyst, you can use Catalyst::TraitFor::Model::DBIC::Schema::QueryLog::AdoptPlack to 'hook' the query log into your DBIx::Class schema model. If you are using a different framework, or building your own, please consider releasing your code or sending me a document patch suitable for including in a workbook or FAQ.


This middleware accepts the following arguments.


This is the class which is used to build the querylog unless one is already defined. It defaults to DBIx::Class::QueryLog. You should probably leave this alone unless you need to subclass or augment DBIx::Class::QueryLog.

If the class name you pass has not already been included (via use or require) we will automatically try to require it.


Accepts a HashRef of data which will be passed to "querylog_class" when building the querylog.


This middleware defines the following public subroutines


Returns the PSGI $env key under which you'd expect to find an instance of DBIx::Class::QueryLog.


Given a Plack $env, returns a DBIx::Class::QueryLog, if one exists. You should use this in your code that is trying to access the querylog. For example:

    use Plack::Middleware::DBIC::QueryLog;

    sub get_querylog_from_env {
      my ($self, $env) = @_;

This returns undef if it does not exist. This is the officially supported interface for extracting a DBIx::Class::QueryLog from a Plack request.


Plack, Plack::Middleware, Plack::Middleware::Debug::DBIC::QueryLog, Catalyst::TraitFor::Model::DBIC::Schema::QueryLog::AdoptPlack


John Napiorkowski, <>


Copyright 2011, John Napiorkowski

This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.