<?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; logs</title>
	<atom:link href="http://slashroot.eu/tag/logs/feed/" rel="self" type="application/rss+xml" />
	<link>http://slashroot.eu</link>
	<description>Notepad of geeky sysadmin</description>
	<lastBuildDate>Thu, 10 May 2012 16:41:54 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Proste statystyki wydruków z bazą sqlite</title>
		<link>http://slashroot.eu/2009/08/21/proste-statystyki-wydrukow-z-baza-sqlite/</link>
		<comments>http://slashroot.eu/2009/08/21/proste-statystyki-wydrukow-z-baza-sqlite/#comments</comments>
		<pubDate>Fri, 21 Aug 2009 11:04:45 +0000</pubDate>
		<dc:creator>root</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[logs]]></category>
		<category><![CDATA[oneliners]]></category>

		<guid isPermaLink="false">http://slashroot.eu/?p=90</guid>
		<description><![CDATA[Potrzebowałem na szybko statystyk wydruków. Do tego skonstruowałem taki oto twór: perl -ne 'print "$1 $2\n" if /(\d+\/[a-zA-z]+\/20\d{2}).*for job (\d+)\./' /var/log/cups/error_log&#124;sort &#124;uniq &#124; awk '{print "insert into printouts values(\""$1"\","$2");"}'&#124; sqlite3 printouts.db Ten z pozoru niezgrabny jednolinijkowiec parsuje plik logów cupsa &#8230; <a href="http://slashroot.eu/2009/08/21/proste-statystyki-wydrukow-z-baza-sqlite/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Potrzebowałem na szybko statystyk wydruków. Do tego skonstruowałem taki oto twór:</p>
<pre class='brush:perl'>
perl -ne 'print "$1 $2\n" if /(\d+\/[a-zA-z]+\/20\d{2}).*for job (\d+)\./' /var/log/cups/error_log|sort |uniq | awk '{print "insert into printouts values(\""$1"\","$2");"}'| sqlite3 printouts.db
</pre>
<p>Ten z pozoru niezgrabny jednolinijkowiec parsuje plik logów cupsa wyciągając z niego numer zadania i datę, a następnie <i>wkłada</i> to do prostej bazy sqlite`a.</p>
<p>Dzięki temu mogłem szybko wydobyć ilość wydruków na dzień. Przy niewielkiej modyfikacji można dołączyć inne pola i już grupować sobie w sqlu co tylko dusza zapragnie. Nie jest to może wyszukany przypadek &#8211; raczej ciekawostka. To samo można uzyskać również za pomocą <b>uniq -c</b>, ale perspektywy tego rozwiązania są o wiele większe.</p>
<p>Na koniec tylko polecenie tworzące trywialną strukturę bazy <b>printouts.db</b>:<br />
<code><br />
sqlite3 printouts.db 'create table printouts(date text,job int)'<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://slashroot.eu/2009/08/21/proste-statystyki-wydrukow-z-baza-sqlite/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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[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; <a href="http://slashroot.eu/2009/08/12/ujarzmione-logi-apache/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<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>

