Eigene Werte aus PHP in die Apache Logs schreiben

Heute, na inzwischen eigentlich schon gestern, habe ich bei der Suche nach einer Apache-Konfiguration durch Zufall etwas interessantes gefunden. Eine PHP-Funktion namens “apache_note()“, mit der man Werte aus PHP an die Apache-Logs weitergeben kann.

Der eine oder andere kennt die Funktion vielleicht schon, aber für mich ist sie neu. Daher habe ich damit einfach mal etwas rumprobiert und einen kleinen Codeschipsel dazu gebastelt. Die Apache-Logs können für vielfältige Auswertungen verwendet werden.

Zum Beispiel welche Seiten besucht oder nicht gefunden werden können, zum Tracken von Werbemitteln oder in dem Fall auch zum Protokollieren weiterer PHP-Werte.

In einem früheren Projekt haben wir mal die Zeit und den Speicherverbrauch gemessen die ein PHP-Script braucht, um die Seite auszuliefern. Dazu hatten wir eine einfache Klasse, ähnlich der folgenden (im dem Beispiel wird nur die Zeit gemessen):

class PageBenchmark
{
  private $_startTime;
  private static $_instance;

  protected function __construct()
  {
    register_shutdown_function(array(self::$_instance, 'stop'));
    $this->start();
  }

  protected function __clone() {}

  public function getInstance()
  {
    if (null === self::$_instance) {
      self::$_instance = new self();
    }
    return self::$_instance;
  }

  public function start()
  {
    $this->_startTime = microtime(true);
  }

  public function stop()
  {
    $time = microtime() - $this->_startTime;
    apache_note('worktime', $time);
  }
}

PageBenchmark::getInstance();

Die Klasse ist bewusst einfach gehalten und sollte möglichst ohne weitere Abhängigkeiten funktionieren. Die Verwendung ist dabei recht einfach. Das Script an einer zentralen Stelle möglichst früh einbinden. Durch den Aufruf von getInstance() wird ein Objekt instanziiert und die Methode stop() als Callback registriert.

Wird das Script nun abgearbeitet, wird diese Methode zum Ende aufgerufen und die verbrauchte Zeit wird errechnet und an Apache übergeben.

Damit das ganze dann einen Sinn bekommt, muss die Konfiguration des Webservers noch etwas angepasst werden. Für unser Beispiel schreiben wir die Zeit an das Ende jeder Zeile.

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" [%{worktime}n]" mylogformat
CustomLog /var/www/sandkasten/logs/access.log mylogformat

Danach natürlich den Webserver neu starten, bzw. ein Reload machen. Ab jetzt sollte zu jedem Logeintrag die verbrauchte Zeit mitgeschrieben werden. Die verwendeten Kürzel werden in der Doku zu mod_log_config erklärt.

Viel Spaß beim Probieren!

 

Ein Kommentar

  1. Danke für den Artikel, gerade sowas brauche ich aktuell :)
    Ich hatte es bisher so gelöst das ich die benötigten Werte in ein Cookie speichere und anschließend dieses im LogFormat via %{name}C auslese.

Schlagwörter: Adapter, Amazon, Animation, Annotations, Anonyme Klasse, Ant, Apache, API, Array, ArrayAccess, Attachment, AutoLoader, Bedienung, Bedingung, Benchmark, Bildbearbeitung, BOM, Bootstrap, Bot, Byte Order Mark, Callback, CamelCase, Canvas, Captcha, Cheatsheet, CLI, Closure, Cloud, CodeSniffer, Community, Comparator, Contest, Controller, Converter, CouchDB, Countable, Cronjob, CSV, CustomLibrary, Custom_Model, Data Mapper, Datei, Datenbank, Datenstruktur, Datentypen, Dating, Decorator, Dekorierer, Design Patterns, Dump, Duplikat, each, Eclipse, Entwicklung, Entwurfsmuster, Enum, Erweiterung, Eventhandling, Exception-Handling, Extension, Factory, Fehler, Flash, Foreach, Formatierung, Formular, Funktion, Futon, Header, HTML5, HTTP, IDE, If, Implementierung, InnoDB, Interceptor, Interface, isset, Iterator, Java, JavaScript, jQuery, Konfiguration, Konsole, Kontrollstruktur, kopieren, Late Static Binding, Layout, Linux, Listeners, Logging, Löschen, Magento, Magic Methods, Marketing, Methode, Model, MVC, MySQL, NetBeans, Objekt, Observable, Observer, OOP, Operator, Parameter, Partnersuche, Performance, PHP, phpMyAdmin, PHPUnit, Plugin, Proxy, Qualitätssicherung, Query, Reflection, Request, Response, Rest-API, Rockstar, Routing, S3, Samba, Scheifen, Schleife, Schutz, Secure Shell, Selbstreferenz, Shop, Sicherheit, Sicherung, Singleton Pattern, SOAP, Sortierung, Sourcecode, Spam, Speicherproblem, Spickzettel, SPL, SSH, Statement, Stellvertreter, Strategy Pattern, Stream, String, Sun VirtualBox, Support, Switch, Symfony, Symfony2, Symfony Live, Tag, Template, Template Method, Ternär Operator, Testing, Thumbnail, Tool, Tour, Twig, Type-Cast, Umwandlung, Underscore, unset, Vererbung, Verzweigung, Video, Videospiel, Virtualisierung, Visitor Pattern, Vorschaubild, walk, Webserver, Webservice, Weiterleitung, Wrapper, Youtube, Zeitsteuerung, Zend Framework, Zend_Cloud, Zend_CodeGenerator, Zend_Http_Client, Zend_Service, Zugriffsmethode