PHP error_reporting: mehrere logfiles erstellen?

Blackbenji

Lieutenant
Registriert
Nov. 2009
Beiträge
565
hallo,

ich würde gerne über error_reporting die logfiles auftrennen.

PHP:
    error_reporting(E_ALL ^ E_NOTICE ^ E_WARNING);
    ini_set('display_errors', 0);
    ini_set('display_startup_errors', 0);
    ini_set('log_errors', 1);
    ini_set('error_log', 'log/error.log');
    ini_set('ignore_repeated_errors', 1);
    ini_set('html_errors', 0);

funktioniert für errors einwandfrei.

mein gedanke war nun das über if zu regulieren, klappt aber nicht ganz ..

PHP:
if (error_reporting(E_NOTICE)) {
    ini_set('display_errors', 0);
    ini_set('display_startup_errors', 0);
    ini_set('log_errors', 1);
    ini_set('error_log', 'log/notice.log');
    ini_set('ignore_repeated_errors', 1);
    ini_set('html_errors', 0);
} elseif (error_reporting(E_WARNING)) {
    ini_set('display_errors', 0);
    ini_set('display_startup_errors', 0);
    ini_set('log_errors', 1);
    ini_set('error_log', 'log/warning.log');
    ini_set('ignore_repeated_errors', 1);
    ini_set('html_errors', 0);
} else {
    error_reporting(E_ALL ^ E_NOTICE ^ E_WARNING);
    ini_set('display_errors', 0);
    ini_set('display_startup_errors', 0);
    ini_set('log_errors', 1);
    ini_set('error_log', 'log/error.log');
    ini_set('ignore_repeated_errors', 1);
    ini_set('html_errors', 0);
}

jemand eine bessere idee?

mfg
 
jepp, die ifs prüfen, das war mein fehler. mit ini_set in den ifs funktioniert es nun.

PHP:
if (ini_set('error_reporting', E_NOTICE)) {
    ini_set('display_errors', 0);
    ini_set('display_startup_errors', 0);
    ini_set('log_errors', 1);
    ini_set('error_log', 'log/notice.log');
    ini_set('ignore_repeated_errors', 1);
    ini_set('html_errors', 0);
} elseif (ini_set('error_reporting', E_WARNING)) {
    ini_set('display_errors', 0);
    ini_set('display_startup_errors', 0);
    ini_set('log_errors', 1);
    ini_set('error_log', 'log/warning.log');
    ini_set('ignore_repeated_errors', 1);
    ini_set('html_errors', 0);
} else {
    error_reporting(E_ALL ^ E_NOTICE ^ E_WARNING);
    ini_set('display_errors', 0);
    ini_set('display_startup_errors', 0);
    ini_set('log_errors', 1);
    ini_set('error_log', 'log/error.log');
    ini_set('ignore_repeated_errors', 1);
    ini_set('html_errors', 0);
}

hintergrund: ich möchte wenn fehler auftreten diese genau unterscheiden können. ich kann zwar ein grep auf ein file machen und so etwas finden. aber wenn ich spezielle logs habe, macht es die sache einfacher und übersichtlicher.


hmm nein, funktioniert doch nicht, sobald er das erste if erfolgreich durch hat, führt er kein weiteres aus. schade
 
Zuletzt bearbeitet:
Du solltest dich eingehender mit der Funktionsweise einer if beschäftigen. Was du da tust, ist den Rückgabewert von ini_set() zu prüfen, welcher immer bool(true) sein wird beim Setzen von error_reporting. Ergo wird eben der erste Block ausgeführt, da die Kondition zutrifft. Um dein Vorhaben mit unterschiedlichen Error-Logs zu realisieren, müsstest du einen eigenen Error-Handler definieren, in dem du die Errors je nach Art in bestimmten Files speicherst.

Das könnte z. B. so aussehen:

PHP:
function myErrorHandler($type, $message, $file, $line) {
  if($type & (E_NOTICE | E_USER_NOTICE))
    file_put_contents('log/notice.log', 'Notice: ' . $message . ' in ' . $file . ' on line ' . $line . "\r\n", FILE_APPEND);
  else if($type & (E_WARNING | E_USER_WARNING))
    file_put_contents('log/warning.log', 'Warning: ' . $message . ' in ' . $file . ' on line ' . $line . "\r\n", FILE_APPEND);
  else
    file_put_contents('log/error.log', 'Error of type ' . $type . ': ' . $message . ' in ' . $file . ' on line ' . $line . "\r\n", FILE_APPEND);

  return true;
}

set_error_handler('myErrorHandler');

Diese Funktion wird bei jedem Error (außer E_ERROR) ausgeführt (der PHP-eigene Errorhandler wird komplett übergangen, solange die Funktion true zurückgibt) und speichert den Fehler abhängig von seinem Typ in einer Datei.
 
Zuletzt bearbeitet:
gibt es noch einen schalter ala
ini_set('ignore_repeated_errors', 1);

aktuell wird beim schnellen reload der fehler immer wieder geloggt.
 
Im Optimalfall sollte deine Software keine Errors, nichtmal Notizen werfen. Die Verwendung von ignore_repeated_errors zeugt von schlechtem Code, das sollte man nicht machen. Wenn du unbedingt vermeiden willst, dass ein Fehler mehrmals geloggt wird, musst du dich in deinem Errorhandler selbst darum kümmern.
 
Besser: Dann sollte man den Fehler beseitigen...
Nix is schlimmer, als wenn die error.log schneller wächst als die access.log.
 
da habt ihr natürlich recht ... auch das jemand eine testseite 100 mal hintereinander aufruft ist im endprodukt wohl eher unwarscheinlich ... ;)

trotzdem danke!
 
Zurück
Oben