Long time no see

Po dolgem času spet nekaj za narodov blagor. Od zadnje objave je minilo kar nekaj časa. Delavniki so še vedno enaki: sestanki, ideje, realizacija, skratka ena velika “gužva” :)
Doma in v službi sem dokončno prešaltal na linux. Svojemu profilu na LinkedIn lahko počasi dodam napredno znanje in administracija Debian/Ubuntu based linux distribucij.
Še vedno veliko raziskujem in testiram. Med zadnjimi uspešnimi eksperimenti je inštalacija Leoparda (Mac Os X 10.5.2) na zunanjem USB disku na dve leti starem PC-ju z AMD Athlon 64 procesorjem. Kako mi je to uspelo, vam ne morem razkriti, saj je celotna stvar namenjena testiranju in ni ravno legalna ;) Koga zanima kaj več si naj ogleda OSx86 Project. Vsekakor je Mac Pro moj developer dream machine, saj mi kljub n-odprtim aplikacijam:

  • Firefox z cca 50 odprtimi tabi
  • Opera z cca 20 odprtimi tabi
  • Safari z cca 10 odprtimi tabi
  • Zend Studio for Eclipse
  • Aptana Studio
  • in še eno 20 raznoraznih programčkov

na PC-ju ni uspelo preobremenit procesor in s tem OS X, da bi ta vsaj malo počepnil. Kako celotna zadeva deluje na originalnem Macu pa si lahko le zamišljam.


Vlogger

Vlogger je majhen programček napisan v perlu s katerim zapisujemo Apache log datoteke razbite na mape virtual hostov. V posameznih mapah se nahajajo dostopi (access.log) po dnevih. Z malenkostnim popravkom skripte pa lahko v istih mapah shranjujemo tudi napake (error.log). Zadeva je zelo podobna cronolog-u, le da ne rabimo za vsak virtual host pisat svojo
direktivo, kar posledično zmanjša število dostop in s tem “file handlov”. Zakaj je to pomembo?
Recimo da ima vsak Virtual Host svoje log datoteke in nimamo nobene posebnosti pri zapisovanju logov (ne uporabljamo rotatorja/parserja ampak pustimo da Apache sam skrbi za log datoteke) bomo pri nekaj več sto Virtualnih Hostov kmalu naleteli na težave. Apache-ju bo kaj kmalu zmanjkalo tako imenovanih “file deskriptorjev“, ki jih ima na voljo.
Tukaj pridejo na pomoč razni “virtual web logfile rotater/parser” programčki. Med njimi je tudi vlogger. Sam sem stestiral vlogger na Debian/Ubuntu linuxu, Mac Os X ter FreeBSD-ju. Na vseh sistemih sem pred tem Apache2 že inštaliral in vlogger je na vseh deloval kot namazan.

Inštalacija

Linux:

sudo apt-get install vlogger

Mac Os X, FreeBSD:
Prenesi datoteko vlogger-1.3, odpakiraj in prekopiraj vlogger v /usr/sbin/ direktorij.

Konfiguracija

Vse kar moremo narediti, da bo vlogger špilal je da v globalno konfiguracijsko datoteko od Apache strežnika postavimo eno “CustomLog” direktivo in ta bo zapisoval dostopne loge za vsak Virtual Host in dan posebej.
Še prej pa popravimo “LogFormat” vrstico (tisto z imenom combined). Dodamo string %v na začetek le te. Odprimo apache konfiguracijsko datoteko[1]:

[...]
#LogFormat "%h %V/%v %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
[...]

Popravimo še “CustomLog” vrstico

[...]
#CustomLog /var/log/apache2/access.log combined
CustomLog "| /usr/sbin/vlogger -t \"access.log.%Y-%m-%d\" -s access.log /var/log/apache2" combined
[...]

Tako bomo zapisovali vse log datoteke v poddirektorije[2] v “/var/log/apache2″ z imenom access.log.yyyy-mm-dd z simbolicnim linkom “access.log”
Kot sem že omenil potrebujemo samo eno “CustomLog” direktivo za celotno konfiguracijo Apache-ja.

NE POZABITE izključit ostale “CustomLog” direktive, še posebej v Virtual Host konfiguracijah!

Dodatna prednost v eni sami dostopni datoteki, poleg že omenjenega limita “file deskriptorjev”, je seveda zmanjšanje server loada še posebej na straneh z veliko prometa.
Vlogger access.log na Ubuntu 6.06
Primer zapisa access logov na Ubuntu 6.06

ErrorLog mode

Z vlogger-jem lahko parsamo tudi napake. V tem modu je parsanje host-a izključeno in datoteka se zapiše z uporabo template datoteke v podani LOGDIR[3].

[...]
#ErrorLog "/var/logs/apache2/error.log"
ErrorLog  "| /usr/sbin/vlogger -e -t \"error.log.%Y-%m-%d\" -s error.log /var/log/apache2/errors"
[...]

Prav tako nastavimo level napak, ki se naj shranjujejo v ErrorLog. Za produkcijo je priporočljiv vsaj level Critital Conditions.

[...]
#
# LogLevel: Control the number of messages logged to the error_log.
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
#
LogLevel crit
[...]

Če želimo v error log ujeti še PHP napake v php.ini-ju nastavimo naslednje:

[...]
;Log errors into a log file (server-specific log, stderr, or error_log (below))
; As stated above, you're strongly advised to use error logging in place of
; error displaying on production web sites.
log_errors = On
[...]

Vlogger error.log na Ubuntu 6.06

Primer zapisa error loga na Ubuntu 6.06

Tip

Z malim popravkom vlogger skripte lahko error.log datoteke zapisujete v Virtual Host mape, kjer se že nahajajo access.log datoteke. Ne priporočam tega v produkciji, saj lahko spet naletimo na problem limita “file deskriptorjev”
Gre bolj za pomoč programerjem, saj opažam da nemalokateri razvijalec kliče na pomoč ob prvi napaki.
Odprimo vlogger skripto in spremenimo[4]:

#!/usr/bin/perl - T v
#!/usr/bin/perl
[...]
        mkdir("$ARGV[0]");
        #print STDERR
        #  "[vlogger] target directory $ARGV[0] does not exist - exiting.\n\n";
        #exit;
[...]

S tem najprej disablom da bi perl preverjal tako imenovane “tainting checks”, ter kreiramo mapo za error.log če ta ne obstaja. Ker se target direktorij za error log preverja takoj ob zagonu Apache-ja, bi se v nasprotnem primeru skripta ustavila in bi se zapisoval samo access.log.

Sedaj samo še dodamo direktivo v Virtual Host konfiguracijo

[...]
<VirtualHost *>
    DocumentRoot "/opt/local/apache2/htdocs/virtualhost"
    ServerName virtualhost
    ErrorLog  "| /usr/sbin/vlogger -e -t \"error.log.%Y-%m-%d\" -s error.log /var/log/apache2/virtualhost"
</VirtualHost>
[...]

Access in Error Log v isti mapi od Virtual Hosta

Access in Error Log v isti mapi od Virtual Hosta.


Happy blogging(coding)!

  1. linux: /etc/apache2/apache2.conf; mac os x: /opt/local/apache2/conf/httpd.conf; freeBSD: /usr/local/etc/apache22/httpd.conf []
  2. virtualhost.com, virtualhost1.com, … []
  3. npr: kreiramo mapo /errors v /var/log/apache2 []
  4. v vrsticah 1 in 174 []

Sorodni zapisi: