clogger.git  about / heads / tags
configurable request logging for Rack
$ git log --pretty=format:'%h %s (%cs)%d'
4ae4cf7 switch to TypedData macros for allocation (2024-02-01)
	(HEAD -> master)
6b0768f rack 3.x compatibility (2024-02-01)
2991f00 update deprecated license identifier (2024-02-01)
0a6b4a2 workaround for time(2) being non-monotonic (2023-05-11)
461c3d4 use _POSIX_C_SOURCE=200809L (2023-05-11)
91de1c8 fix $request_time{9,0} for 32-bit platforms (2022-12-25)
e0efbc3 clogger 2.4.0 (2022-06-16)
	(tag: v2.4.0)
a16af82 doc: drop git:// URLs, use shorter domain for IMAP links (2022-06-16)
226e3c0 pure: fix time.rb incompatibility in Ruby 3.1+ (2022-06-16)
10f13b8 escape env['REQUEST_METHOD'] for non-strict HTTP servers (2022-06-16)

$ git cat-file blob HEAD:README
= clogger - configurable request logging for Rack

clogger is Rack middleware for logging HTTP requests.  The log format
is customizable so you can specify exactly which fields to log.


* highly customizable with easy-to-read nginx-like log format variables.

* pre-defines Apache Common Log Format, Apache Combined Log Format and
  Rack::CommonLogger (as distributed by Rack 1.0 and 1.1) formats.
  See Clogger::Format for the predefined formats.

* Untrusted values are escaped (all HTTP headers, request URI components)
  to make life easier for HTTP log parsers. The following bytes are escaped:

    ' (single quote)
    " (double quote)
    all bytes in the range of \x00-\x1F

* multi-instance capable and (optionally) reentrant.  You can use
  clogger in a multi-threaded server, and even multiple cloggers logging
  to different locations and different formats in the same process.

* Pure Ruby version for non-MRI versions of Ruby (or via CLOGGER_PURE=1
  in the environment).  The optional C extension is loaded by default
  under C Ruby and under Rubinius, too.


clogger may be loaded as Rack middleware in your

  # ENV['CLOGGER_PURE'] = '1' # uncomment to disable C extension
  require "clogger"
  use Clogger,
      :format => :Combined,
      :path => "/path/to/log",
      :reentrant => true

If you're using Rails 2.3.x or later, in your config/environment.rb
somewhere inside the " do |config|" block:

  config.middleware.use 'Clogger',
      :format => :Combined,
      :path => "/path/to/log",
      :reentrant => false

Instead of specifying a :path, you may also specify a :logger object
that receives a "<<" method:

  use Clogger, :logger=> $stdout, :reentrant => true


* $http_* - HTTP request headers (e.g. $http_user_agent)
* $sent_http_* - HTTP response headers (e.g. $sent_http_content_length)
* $content_length - HTTP request body size
  ($http_content_length is not allowed by Rack)
* $content_type - HTTP request content type
  ($http_content_type is not allowed by Rack)
* $cookie_* - HTTP request cookie (e.g. $cookie_session_id)
  Rack::Request#cookies must have been used by the underlying application
  to parse the cookies into a hash.
* $request_method - the HTTP request method (e.g. GET, POST, HEAD, ...)
* $path_info - path component requested (e.g. /index.html)
* $query_string - request query string (not including leading "?")
* $request_uri - the URI requested ($path_info?$query_string)
* $request - the first line of the HTTP request
  ($request_method $request_uri $http_version)
* $request_time, $request_time{PRECISION}, $request_time{POWER,PRECISION} -
  time taken for request (including response body iteration). PRECISION
  defaults to 3 (milliseconds) if not specified but may be specified
  anywhere from 0(seconds) to 6(microseconds). POWER will raise the time to
  the provided power of 10, useful for converting to micro- or nanoseconds.
  POWER defaults to 0 if not specified but may be specified any from 0 to 9
* $time_iso8601 - current local time in ISO 8601 format,
  e.g. "1970-01-01T00:00:00+00:00"
* $time_local - current local time in Apache log format,
  e.g. "01/Jan/1970:00:00:00 +0000"
* $usec - current time in seconds.microseconds since the Epoch
* $msec - current time in seconds.milliseconds since the Epoch
* $body_bytes_sent - bytes in the response body (Apache: %B)
* $response_length - body_bytes_sent, except "-" instead of "0" (Apache: %b)
* $remote_user - HTTP-authenticated user
* $remote_addr - IP of the requesting client socket
* $status - three-digit HTTP status code (e.g. 200, 404, 302)
* $ip - X-Forwarded-For request header if available, $remote_addr if not
* $pid - process ID of the current process
* $e{Thread.current} - Thread processing the request
* $e{Fiber.current} - Fiber processing the request
* $env{variable_name} - any Rack environment variable (e.g. rack.url_scheme)


* {Ruby}[], {Rack}[]


The latest development happens in git and is published to the following:

   git clone
   git clone

You may also browse and download snapshot tarballs:

* (gitweb)

We use email for coordination and development, see below:


All feedback (bug reports, user/development discussion, patches, pull
requests) is done via publicly-archived email:

* imaps://
* nntps://

Tor users may also access HTTP, IMAP, and NNTP archives via .onion:

* http://7fh6tueqddpjyxjmgtdiueylzoqt6pt7hec3pukyptlmohoowvhde4yd.onion/clogger-public/
* imap://7fh6tueqddpjyxjmgtdiueylzoqt6pt7hec3pukyptlmohoowvhde4yd.onion/inbox.comp.lang.ruby.clogger.0
* nntp://7fh6tueqddpjyxjmgtdiueylzoqt6pt7hec3pukyptlmohoowvhde4yd.onion/inbox.comp.lang.ruby.clogger

AUTH=ANONYMOUS is supported for IMAP and IMAPS, and any
username + password will work.

No subscription or real names will ever be required to email us.
Do not send HTML email, do not top post.




For RubyGems users:

  gem install clogger

There is an optional C extension that should be compatible with
MatzRuby.  The extensions should automatically be disabled for users of
other Ruby implementations, but be sure to let us know if that's not the

# heads (aka `branches'):
$ git for-each-ref --sort=-creatordate refs/heads \
	--format='%(HEAD) %(refname:short) %(subject) (%(creatordate:short))'
* master       switch to TypedData macros for allocation (2024-02-01)
  respond_to-priv SQUASH/WIP - use rb_funcallv to handle second respond_to arg (2017-05-21)

# tags:
$ git for-each-ref --sort=-creatordate refs/tags \
	--format='%(refname:short) %(subject) (%(creatordate:short))'
v2.4.0       clogger 2.4.0 (2022-06-16) tar.gz
v2.3.1       clogger 2.3.1 (2021-05-25) tar.gz
v2.3.0       clogger 2.3.0 - $request_time{POWER,PRECISION} support (2020-08-10) tar.gz
v2.2.1       clogger 2.2.1 - move away from .org TLD (2020-01-08) tar.gz
v2.2.0       clogger v2.2.0 - Rack 2.x compatibility fix (2017-05-23) tar.gz
v2.1.0       clogger 2.1.0 - rack 2.x compatibility and more! (2016-07-28) tar.gz
v2.0.2       clogger 2.0.2 - bugfixes for pure Ruby users (2015-02-27) tar.gz
v2.0.1       clogger 2.0.1 - doc updates and new mailing list (2015-01-13) tar.gz
v2.0.0       clogger 2.0.0 - updated website URL, cleanups (2014-05-12) tar.gz
v1.4.0       clogger 1.4.0 - updated website URL, cleanups (2014-05-12) tar.gz

# associated public inboxes:
# (number on the left is used for dev purposes)

git clone