<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>/root.eu &#187; perl</title>
	<atom:link href="http://slashroot.eu/tag/perl/feed/" rel="self" type="application/rss+xml" />
	<link>http://slashroot.eu</link>
	<description>Notepad of geeky sysadmin</description>
	<lastBuildDate>Thu, 23 Jun 2011 13:04:35 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>Ujarzmione logi apache</title>
		<link>http://slashroot.eu/2009/08/12/ujarzmione-logi-apache/</link>
		<comments>http://slashroot.eu/2009/08/12/ujarzmione-logi-apache/#comments</comments>
		<pubDate>Wed, 12 Aug 2009 10:35:03 +0000</pubDate>
		<dc:creator>root</dc:creator>
				<category><![CDATA[apache]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[logs]]></category>
		<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://slashroot.eu/?p=68</guid>
		<description><![CDATA[<a href="http://slashroot.eu/2009/08/12/ujarzmione-logi-apache/" title="Ujarzmione logi apache"></a>Na co dzień pracuję z aplikacją, która wyrzuca bardzo dużo &#8220;śmieci&#8221; do logów. Tym samym zapycha ona error log, który z nazwy powinien zawierać błędy, a nie informacje o niezainicjalizowanej zmiennej X. Postanowiłem ukrócić ten proceder i filtrować wychodzące z &#8230;<p class="read-more"><a href="http://slashroot.eu/2009/08/12/ujarzmione-logi-apache/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://slashroot.eu/2009/08/12/ujarzmione-logi-apache/" title="Ujarzmione logi apache"></a><p>Na co dzień pracuję z aplikacją, która wyrzuca bardzo dużo &#8220;śmieci&#8221; do logów. Tym samym zapycha ona error log, który z nazwy powinien zawierać błędy, a nie informacje o niezainicjalizowanej zmiennej X. Postanowiłem ukrócić ten proceder i filtrować wychodzące z procesów apache`a komunikaty.</p>
<p>Wykorzystałem do tego perla, gdyż dość sprawnie radzi on sobie z obróbką tekstu i wyrażeniami regularnymi. Poniżej zawartość skryptu <strong>apache-logfilter.pl</strong></p>
<pre class="brush:perl">
#!/usr/bin/perl -w

use strict;

$|=1;   # use unbuffered output

my $logfile;

# check if logfile was passed as 1st argument
if ($ARGV[0])   {
$logfile=$ARGV[0];
}

# assign /dev/null as logfile unless it is already defined
$logfile="/dev/null" unless ($logfile);

# set umask
umask 0022;
my $loghandler=open(LOGFILE,'&gt;&gt;',$logfile);

# autoflush file handler
select((select(LOGFILE), $| = 1)[0]);

# inifinite loop over input from STDIN
while (&lt;STDIN&gt;) {

# omit unwanted lines matching the following patterns
next if (/^Use of uninitialized value/);
next if (/^"my" variable/);
next if (/^Subroutine \w+ redefined/);
next if (/^Variable ".*?" will not stay shared/);
next if (/^Odd number of elements in hash/);
next if (/^Argument ".*?" isn't numeric/);
next if (/^Useless use of .*? in void context/);
next if (/^substr outside of string at/);
next if (/^Unquoted string ".*?" may clash/);
next if (/^Scalar value @.*? better written as/);
next if (/^Parentheses missing around/);

# print to our logfile
print LOGFILE "$_";
}
</pre>
<p>Posiadając już taki skrypt należy przekazać w konfiguracji apache`a jego wywołanie. Odbywa się to za pomocą <em>pipe`a</em> przez który przekazywane są komunikaty do skrypty. W tym przypadku jako parametr podana jest ścieżka do właściwego pliku logu, do którego dopisywane są wiadomości (nie należy zapomnieć o właściwiej konfiguracji logrotate!).<br />
Przykładowa część konfiguracji:</p>
<p><code><br />
ErrorLog "|/usr/local/bin/apache-logfilter.pl /var/log/apache/error_log"<br />
</code></p>
<p>Ciekawą rzeczą jaką napotkałem tutaj był problem buforowanego wyjścia. Otóż do logu nie docierały żadne nowe wiadomości. Wielokrotnie sprawdzałem poprawność skryptu i za każdym razem działał on poprawnie zapuszczony z palca. Po krótkich poszukiwaniach znalazłem zmienną <strong>$|</strong>, której to niezerowe ustawienie powinno mój problem rozwiązać. A jednak nie rozwiązało. Dopiero wymuszenie tego na uchwycie otwartego pliku dało pożądane rezultaty. Odpowiada za to następujące wywołanie:</p>
<p><code><br />
select((select(LOGFILE), $| = 1)[0]);<br />
</code></p>
<p>Teraz wszystko śmiga jak należy &#8211;  czytelność logów zwiększyła się znacząco, a ich rozmiar zmniejszył się kilkukrotnie.</p>
]]></content:encoded>
			<wfw:commentRss>http://slashroot.eu/2009/08/12/ujarzmione-logi-apache/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

