<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: logs code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Sun, 18 May 2008 14:02:06 GMT</pubDate>
    <description>DZone Snippets: logs code</description>
    <item>
      <title>Split Apache logs according to GeoIP country</title>
      <link>http://snippets.dzone.com/posts/show/5255</link>
      <description>// Split Apache logs according to GeoIP country&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#!/usr/bin/perl&lt;br /&gt;&lt;br /&gt;# $Id$&lt;br /&gt;&lt;br /&gt;# Split Apache logs according to GeoIP country&lt;br /&gt;&lt;br /&gt;use strict;&lt;br /&gt;use warnings;&lt;br /&gt;&lt;br /&gt;## no critic (ValuesAndExpressions::RequireInterpolationOfMetachars)&lt;br /&gt;our ($VERSION) = '$Revision$' =~ m{ \$Revision: \s+ (\S+) }xms;&lt;br /&gt;## use critic&lt;br /&gt;&lt;br /&gt;use Geo::IP;&lt;br /&gt;&lt;br /&gt;my $gi = Geo::IP-&gt;open('/usr/local/share/GeoIP/GeoIPCity.dat', GEOIP_STANDARD);&lt;br /&gt;&lt;br /&gt;my @logs = @ARGV;&lt;br /&gt;&lt;br /&gt;my %record_for;&lt;br /&gt;&lt;br /&gt;foreach my $log (@logs) {&lt;br /&gt;    die "Can't read $log\n" if !-r $log;&lt;br /&gt;    &lt;br /&gt;    my %fh_for;&lt;br /&gt;    my $num_lines_parsed = 0;&lt;br /&gt;    &lt;br /&gt;    my $log_fh;&lt;br /&gt;    if ($log =~ m/ \.gz \z /xms) {&lt;br /&gt;        open $log_fh, "gzip -cd $log |" or die "Can't open gzip pipe\n";&lt;br /&gt;    }&lt;br /&gt;    else {&lt;br /&gt;        open $log_fh, '&lt;', $log or die "Can't open $log\n";&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    my $log_base = $log;&lt;br /&gt;    $log_base =~ s/ \.gz \z //xms;&lt;br /&gt;    &lt;br /&gt;    while (my $line = &lt;$log_fh&gt;) {&lt;br /&gt;        $num_lines_parsed++;&lt;br /&gt;        if (!($num_lines_parsed % 1000)) {&lt;br /&gt;            print STDERR "Parsed $num_lines_parsed lines of $log\n";&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        my ($host) = $line =~ m/ \A (\S+) \s /xms;&lt;br /&gt;        &lt;br /&gt;        if (!exists $record_for{$host}) {&lt;br /&gt;            my $record = $gi-&gt;record_by_name($host);&lt;br /&gt;            $record_for{$host} = $record || 0;&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        my $country = 'unknown';&lt;br /&gt;        if (exists $record_for{$host} &amp;&amp; $record_for{$host}) {&lt;br /&gt;            $country = lc($record_for{$host}-&gt;country_name());&lt;br /&gt;            $country =~ s/\W+/_/gxms;&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        if (!exists $fh_for{$country}) {&lt;br /&gt;            open $fh_for{$country}, '&gt;', "$log_base.$country.out"&lt;br /&gt;                or die "Can't write to $log_base.$country.out\n";&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        print {$fh_for{$country}} $line;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    foreach my $fh (values %fh_for) {&lt;br /&gt;        close $fh;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    close $log_fh;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Wed, 19 Mar 2008 15:02:26 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5255</guid>
      <author>iansealy (Ian Sealy)</author>
    </item>
    <item>
      <title>truncate Rails development/test logs</title>
      <link>http://snippets.dzone.com/posts/show/4399</link>
      <description>In rails applications development.log and test.log like to grow forever, which takes up space and makes them slow to grep.  If I just delete them running processes with logs open might get confused.  So I can use truncate instead:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;truncate ~/www/*/log/*.log&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Even easier, ask cron to do it for me every night:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;4 22 * * * * truncate -s 0k  ~/www/*/log/*.log&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Tue, 07 Aug 2007 17:17:16 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4399</guid>
      <author>laurelfan (Laurel Fan)</author>
    </item>
    <item>
      <title>Rewrite Apache logs that have incorrect dates</title>
      <link>http://snippets.dzone.com/posts/show/4090</link>
      <description>// Rewrite Apache logs that have incorrect dates&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#!/usr/bin/perl&lt;br /&gt;&lt;br /&gt;# $Id$&lt;br /&gt;&lt;br /&gt;# Rewrite Apache logs that have incorrect dates.&lt;br /&gt;# Example usage: $0 '28/May/2006:01:17:14 +0200' '19/Jan/2007:08:49:14 +0100' \&lt;br /&gt;#                access_log.* error_log.*&lt;br /&gt;&lt;br /&gt;use strict;&lt;br /&gt;use warnings;&lt;br /&gt;&lt;br /&gt;## no critic (ValuesAndExpressions::RequireInterpolationOfMetachars)&lt;br /&gt;our ($VERSION) = '$Revision$' =~ m{ \$Revision: \s+ (\S+) }xms;&lt;br /&gt;## use critic&lt;br /&gt;&lt;br /&gt;use HTTP::Date;&lt;br /&gt;&lt;br /&gt;my @DAYS   = qw(Sun Mon Tue Wed Thu Fri Sat);&lt;br /&gt;my @MONTHS = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);&lt;br /&gt;&lt;br /&gt;my $wrong_datetime = shift @ARGV;&lt;br /&gt;my $right_datetime = shift @ARGV;&lt;br /&gt;&lt;br /&gt;my ($timezone) = $right_datetime =~ m/ ([+-]\d\d\d\d)\z/xms;&lt;br /&gt;&lt;br /&gt;my $seconds_diff = str2time($right_datetime) - str2time($wrong_datetime);&lt;br /&gt;&lt;br /&gt;foreach my $file (@ARGV) {&lt;br /&gt;    print "Rewriting $file\n";&lt;br /&gt;    open my $IN,  '&lt;', $file&lt;br /&gt;        or die "Can't open $file: $!\n";&lt;br /&gt;    open my $OUT, '&gt;', "$file.rewritten"&lt;br /&gt;        or die "Can't write to $file.rewritten: $!\n";&lt;br /&gt;    while (&lt;$IN&gt;) {&lt;br /&gt;        if (m{&lt;br /&gt;               \A&lt;br /&gt;               (.+\s+) # Before date and time (if any)&lt;br /&gt;               \[&lt;br /&gt;               (&lt;br /&gt;                   \d\d/\w\w\w/\d\d\d\d # Date&lt;br /&gt;                   :\d\d:\d\d:\d\d      # Time&lt;br /&gt;                   \s&lt;br /&gt;                   [\+\-]\d\d\d\d       # Time zone&lt;br /&gt;               )&lt;br /&gt;               \]&lt;br /&gt;               (\s+.+) # After date and time&lt;br /&gt;               \z&lt;br /&gt;             }xms) {&lt;br /&gt;            print {$OUT} &lt;br /&gt;              $1, q{[},&lt;br /&gt;              rewrite_access_datetime($2, $seconds_diff, $timezone),&lt;br /&gt;              q{]}, $3;&lt;br /&gt;        }&lt;br /&gt;        elsif (m{&lt;br /&gt;               \A&lt;br /&gt;               \[&lt;br /&gt;               (&lt;br /&gt;                   \w\w\w \s \w\w\w \s \d\d \s # Date&lt;br /&gt;                   \d\d:\d\d:\d\d \s           # Time&lt;br /&gt;                   \d\d\d\d                    # Year&lt;br /&gt;               )&lt;br /&gt;               \]&lt;br /&gt;               (\s+.+) # After date and time&lt;br /&gt;               \z&lt;br /&gt;             }xms) {&lt;br /&gt;            print {$OUT} &lt;br /&gt;              q{[},&lt;br /&gt;              rewrite_error_datetime($1, $seconds_diff),&lt;br /&gt;              q{]}, $2;&lt;br /&gt;        }&lt;br /&gt;        else {&lt;br /&gt;            print {$OUT} $_;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;sub rewrite_access_datetime {&lt;br /&gt;    my ($datetime, $seconds_diff, $timezone) = @_;&lt;br /&gt;    &lt;br /&gt;    my ($sign, $hours, $minutes) = $timezone =~ m/\A([+-])(\d\d)(\d\d)\z/xms;&lt;br /&gt;    my $seconds_offset = ($hours * 60 + $minutes) * 60;&lt;br /&gt;    &lt;br /&gt;    $datetime = str2time($datetime) + $seconds_diff;&lt;br /&gt;    if    ($sign eq q{+}) {&lt;br /&gt;        $datetime = $datetime + $seconds_offset;&lt;br /&gt;    }&lt;br /&gt;    elsif ($sign eq q{-}) {&lt;br /&gt;        $datetime = $datetime - $seconds_offset;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    my ($sec, $min, $hour, $mday, $mon, $year) = gmtime $datetime;&lt;br /&gt;    return sprintf '%02d/%s/%04d:%02d:%02d:%02d %s',&lt;br /&gt;        $mday, $MONTHS[$mon], $year + 1900, $hour, $min, $sec, $timezone;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;sub rewrite_error_datetime {&lt;br /&gt;    my ($datetime, $seconds_diff) = @_;&lt;br /&gt;    &lt;br /&gt;    $datetime = str2time($datetime) + $seconds_diff;&lt;br /&gt;    &lt;br /&gt;    my ($sec, $min, $hour, $mday, $mon, $year, $wday) = gmtime $datetime;&lt;br /&gt;    return sprintf '%s %s %02d %02d:%02d:%02d %04d',&lt;br /&gt;        $DAYS[$wday], $MONTHS[$mon], $mday, $hour, $min, $sec, $year + 1900;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sat, 02 Jun 2007 07:26:38 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4090</guid>
      <author>iansealy (Ian Sealy)</author>
    </item>
  </channel>
</rss>
