public
Fork of anotherjesse/exception_logger
Description: our hacks to exception_logger
Clone URL: git://github.com/indirect/exception_logger.git
name age message
file README Sun Aug 24 01:33:09 -0700 2008 Merge in henrik's URL vulnerability fixes [indirect]
file Rakefile Fri Jun 23 21:43:30 -0700 2006 first public version of logged exceptions plugin [technoweenie]
directory assets/ Mon Aug 18 13:51:16 -0700 2008 Reset location.hash when not viewing exception ... [henrik]
directory generators/ Wed Feb 21 08:14:40 -0800 2007 update logged_exception message column to TEXT ... [technoweenie]
file init.rb Thu May 15 07:43:02 -0700 2008 Added support for paginating find, will_paginat... [Jason Knight]
file install.rb Thu May 15 10:17:11 -0700 2008 Fixed view error [Jason Knight]
directory lib/ Sun Aug 24 01:33:09 -0700 2008 Merge in henrik's URL vulnerability fixes [indirect]
directory tasks/ Fri Jun 23 21:43:30 -0700 2006 first public version of logged exceptions plugin [technoweenie]
directory test/ Fri Jun 23 21:43:30 -0700 2006 first public version of logged exceptions plugin [technoweenie]
file uninstall.rb Fri Jun 23 21:43:30 -0700 2006 first public version of logged exceptions plugin [technoweenie]
directory views/ Sun Aug 24 01:33:09 -0700 2008 Merge in henrik's URL vulnerability fixes [indirect]
README
ExceptionLogger
===============

The Exception Logger (forgive the horrible name) logs your Rails exceptions in the database and provides a funky web 
interface to manage them.

First you need to generate the migration:

  ./script/generate exception_migration

Next, you'll need to include the ExceptionLoggable module into ApplicationController.  Once that's done you might want 
to modify key methods to customize the logging:

  render_404(exception) - Shows the 404 template.
  
  render_500(exception) - Shows the 500 template.
  
  log_exception(exception) - Logs the actual exception in the database.
  
  rescue_action_in_public(exception) - Does not log these exceptions: ActiveRecord::RecordNotFound, 
  ActionController::UnknownController, ActionController::UnknownAction

Now add a new route to your routes.rb:

  map.connect "logged_exceptions/:action/:id", :controller => "logged_exceptions"

After that, visit /logged_exceptions in your application to manage the exceptions.

Once you have done that, open up the vendor/plugins/init.rb file and choose your pagination,
supported options are will_paginate, paginating_find, and simple mysql based pagination (Uses LIMIT)
The current default is none. To use the other options you need to uncomment the $PAGINATION_TYPE line
and the require for that pagination, you should comment out what you won't use etc...

It's understandable that you may want to require authentication.  Add this to your config/environments/production.rb:

  # config/environments/production.rb
  config.after_initialize do
    require 'application' unless Object.const_defined?(:ApplicationController)
    LoggedExceptionsController.class_eval do
      # set the same session key as the app
      session :session_key => '_beast_session_id'
      
      # include any custom auth modules you need
      include AuthenticationSystem
      
      before_filter :login_required
      
      # optional, sets the application name for the rss feeds
      self.application_name = "Beast"
      
      protected
        # only allow admins
        # this obviously depends on how your auth system works
        def authorized?
          current_user.is_a?(Admin)
        end
        
        # assume app's login required doesn't use http basic
        def login_required_with_basic
          respond_to do |accepts|
            # alias_method_chain will alias the app's login_required to login_required_without_basic
            accepts.html { login_required_without_basic }
            
            # access_denied_with_basic_auth is defined in LoggedExceptionsController
            # get_auth_data returns back the user/password pair
            accepts.rss do
              access_denied_with_basic_auth unless self.current_user = User.authenticate(*get_auth_data)
            end
          end
        end
        
        alias_method_chain :login_required, :basic
    end
  end

The exact code of course depends on the specific needs of your application.

You can use ActionController::Base.filter_parameter_logging in the LoggedExceptionsController.
In the code given above, do something like

  LoggedExceptionsController.class_eval do
    filter_parameter_logging :password
  end

When viewing a logged exception, parameters whose name has "password" as a substring
will show their values as "[FILTERED]". There is a link to toggle this filtering, in
case you really must have a look.

Note that GET parameters will still be shown unfiltered within the logged URL.

CREDITS

Jamis Buck  - original exception_notification plugin
Rick Olson  - model/controller code
Josh Goebel - design

UPDATES

Chris Wanstrath - use will_paginate
Jason Knight - Pagination support, built on/inspired by Ryanb's willpaginate support.
Henrik Nyh (DanceJam) - log exceptions in dev, linkable exceptions, parameter filtering etc