Napisałem sobie dawno temu klasę do logowania zdarzeń, no i chyba zapomniałem w niej przetestować możliwość dodawania wpisów do istniejącego pliku logu, bo coś nie działa jak dzisiaj chciałem wykorzystać w innym projekcie. Za nic nie mogę dojść co jest u licha źle, skoro taki samo kod, ale normalnie, a nie jako metody klasy działa bez problemów.
class Logger
{
/**
* @var mixed Wskaźnik na plik logu
* @access private
*/
var $file;
/**
* @var string Typ logowania (append, read, write)
* @access private
*/
var $log_mode = 'write';
/**
* @var string Ścieżka do pliku wywołującego klasę
* @access private
*/
var $in_file = '';
/**
* @var string Znak(i) końca linii przy zapisie dziennika
* @access public
*/
var $end_line_string = "\r\n";
/**
* Konstruktor klasy Logger
* @param string $file Nazwa lub ścieżka pliku wywołującego obiekt klasy logującej
* @access public
*/
function Logger($file = '')
{
if ($file == '')
$this->in_file = $file;
}
/**
* Ładowanie (lub tworzenie) pliku logu)
* @param string $file_name Ścieżka do pliku logu
* @param string $mode Tryb otwarcia logu (append, write, read)
* @return bool Czy operacja się powiodła
* @access public
*/
function load_log_file($file_name, $mode = 'append')
{
$this->log_mode = $mode;
echo $mode;
if (!file_exists($file_name) && ($mode == 'read'))
return false;
switch($this->log_mode)
{
case 'append': $this->file = fopen($file_name, 'a+');
case 'write': $this->file = fopen($file_name, 'w');
case 'read': $this->file = file($file_name);
default: $this->file = fopen($file_name, 'w');
}
if (!$this->file)
return false;
else
return true;
}
[ciach, tutaj funkcja format_string, ona działa bez problemów]
/**
* Dodanie wpisu do dziennika
* @param string $entry Wpis do dziennika (z opcjonalnymi zmiennymi)
* @param bool $format [Opcjonalny] Czy zamieniać zmienne na ich wartości
* @param int $line Linia, w której wywoływane jest zdarzenie logowania
* @access public
*/
function add_log_entry($entry, $format, $line)
{
if ($format)
$entry = $this->format_string($entry, $line);
if (!fwrite($this->file, $entry . $this->end_line_string))
return false;
else
return true;
}
[ciach, tutaj funkcje do odczytu, nieważne]
/**
* Zakończenie zapisu i zamknięcie pliku
* @access public
*/
function close_log_file()
{
if (($this->log_mode == 'write') || ($this->log_mode == 'append'))
fclose($this->file);
}
}
Co u licha zrobiłem źle, że plik jest czyszczony, a nie jest dopisywane, jeżeli wywołuję load_log_file z parametrem mode na 'append'?
$log = new Logger(__FILE__);
$log->load_log_file('test.log', 'append');
$log->add_log_entry('test', false, 0);
$log->close_log_file();
^^ działa źle
$f = fopen('test.log', 'a');
fwrite($f, 'test2');
fclose($f);
^^ działa dobrze