Production Log Analyzer
rubyforge.org/projects/rails-analyzer
About
The Production Analyzer lets you find out which pages on your site are dragging you down. PL Analyze requires the use of SyslogLogger (included) because the default Logger doesn’t give any way to associate lines logged to a request.
SyslogLogger gives you many other advantages, such as the ability to combine logs from multiple machines.
Installing
Download
Grab the gem (or tar.gz or .zip) from the RubyForge project:
rubyforge.org/frs/?group_id=586
What you need
Either:
A syslogd that doesn’t suck. This means that syslog.conf(5) shows a !prog specification. (FreeBSD’s syslogd doesn’t suck, but OS X’s syslogd does.)
or:
Some hacking skills to make Rails log the pid of the process for each line logged. You’ll also have to teach LogParser#parse about this. Feel free to submit patches with tests. (Patches without tests are useless to me.)
What you need to do
Either:
Use SyslogLogger according to directions on the SyslogLogger page, including setting up your non-sucky syslogd as directed.
or:
Use your hacking skills and set up a logger that your hacked LogParser#parse can deal with.
Then:
Set up a cronjob (or something like that) to run log files through pl_analyze.
Using pl_analyze
To run pl_analyze simply give it the name of a log file to analyze.
pl_analyze /var/log/production.log
If you want, you can run it from a cron something like this:
/usr/bin/gzip -dc /var/log/production.log.0.gz | /usr/local/bin/pl_analyze /dev/stdin
Or, have pl_analyze email you (which is preferred, because tabs get preserved):
/usr/bin/gzip -dc /var/log/production.log.0.gz | /usr/local/bin/pl_analyze /dev/stdin -e [email protected] -s "pl_analyze for `date -v-1d "+%D"`"
In the future, pl_analyze will be able to read from STDIN.
Sample output
Request Times Summary: Count Avg Std Dev Min Max
ALL REQUESTS: 11 0.576 0.508 0.000 1.470
ThingsController#view: 3 0.716 0.387 0.396 1.260
TeamsController#progress: 2 0.841 0.629 0.212 1.470
RssController#uber: 2 0.035 0.000 0.035 0.035
PeopleController#progress: 2 0.489 0.489 0.000 0.977
PeopleController#view: 2 0.731 0.371 0.360 1.102
Average Request Time: 0.634
Request Time Std Dev: 0.498
Slowest Request Times:
TeamsController#progress took 1.470s
ThingsController#view took 1.260s
PeopleController#view took 1.102s
PeopleController#progress took 0.977s
ThingsController#view took 0.492s
ThingsController#view took 0.396s
PeopleController#view took 0.360s
TeamsController#progress took 0.212s
RssController#uber took 0.035s
RssController#uber took 0.035s
------------------------------------------------------------------------
DB Times Summary: Count Avg Std Dev Min Max
ALL REQUESTS: 11 0.366 0.393 0.000 1.144
ThingsController#view: 3 0.403 0.362 0.122 0.914
TeamsController#progress: 2 0.646 0.497 0.149 1.144
RssController#uber: 2 0.008 0.000 0.008 0.008
PeopleController#progress: 2 0.415 0.415 0.000 0.830
PeopleController#view: 2 0.338 0.149 0.189 0.486
Average DB Time: 0.402
DB Time Std Dev: 0.394
Slowest Total DB Times:
TeamsController#progress took 1.144s
ThingsController#view took 0.914s
PeopleController#progress took 0.830s
PeopleController#view took 0.486s
PeopleController#view took 0.189s
ThingsController#view took 0.173s
TeamsController#progress took 0.149s
ThingsController#view took 0.122s
RssController#uber took 0.008s
RssController#uber took 0.008s
------------------------------------------------------------------------
Render Times Summary: Count Avg Std Dev Min Max
ALL REQUESTS: 11 0.219 0.253 0.000 0.695
ThingsController#view: 3 0.270 0.171 0.108 0.506
TeamsController#progress: 2 0.000 0.000 0.000 0.000
RssController#uber: 2 0.012 0.000 0.012 0.012
PeopleController#progress: 2 0.302 0.302 0.000 0.604
PeopleController#view: 2 0.487 0.209 0.278 0.695
Average Render Time: 0.302
Render Time Std Dev: 0.251
Slowest Total Render Times:
PeopleController#view took 0.695s
PeopleController#progress took 0.604s
ThingsController#view took 0.506s
PeopleController#view took 0.278s
ThingsController#view took 0.197s
ThingsController#view took 0.108s
RssController#uber took 0.012s
RssController#uber took 0.012s
TeamsController#progress took 0.000s
TeamsController#progress took 0.000s
What’s missing
-
More reports
-
Command line arguments including:
-
Help
-
What type of log file you’ve got (if somebody sends patches with tests)
-
-
Read from STDIN
-
Lots more