Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: класс для ведения логов
Форумы портала PHP.SU » PHP » Пользовательские функции » класс для ведения логов

Страниц (1): [1]
 

1. Stierus - 31 Марта, 2009 - 10:06:14 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. class Log{
  4.                 //Log::write('message', 'file');
  5.                 static function write($mess="", $name="main"){
  6.                         if(strlen(trim($mess)) < 2){
  7.                                 return fasle;
  8.                         }
  9.                         if(preg_match("/^([_a-z0-9A-Z]+)$/i", $name, $matches)){
  10.                                 $file_path = $_SERVER['DOCUMENT_ROOT'].'logs/'.$name.'.txt';
  11.                                 $text = htmlspecialchars($mess)."\r\n";
  12.                                 $handle = fopen($file_path, "a");
  13.                                 @flock ($handle, LOCK_EX);
  14.                                 fwrite ($handle, $text);
  15.                                 fwrite ($handle, "==============================================================\r\n\r\n");
  16.                                 @flock ($handle, LOCK_UN);
  17.                                 fclose($handle);
  18.                                 return true;
  19.                         }
  20.                         else{
  21.                                 return false;
  22.                         }
  23.                 }
  24.         }
  25. ?>
  26.  


Это простенький класс для удобного ведения логов. используется: Log:write('message'); и у вас автоматически в папке /logs/ создастся файл main.txt, в котором будет лежать ваше сообщение. Для большего удобства у функции есть 2-й параметр Log:write('message', 'test'); его смысл - указать название файла, в который будет записано ваше сообщение (в нашем случае оно будет записано в файл test.txt). Часто нельзя выводить на экран некие метки - удобно записать в файл и посмотреть после выполнения.
2. EuGen - 31 Марта, 2009 - 10:50:26 - перейти к сообщению
Полезный класс, есть только, наверное, возможность улучшить:
А почему бы не задавать имя лог-файла в конструкторе? Не придется при необходимости ведения нескольких логов сразу каждый раз писать при вызове функции. То есть, к примеру, выглядело бы это так:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. $logFile=new Log("your_log.log");
  4. //какой-то код
  5. $logFile->write("message");
  6. ?>
  7.  

Ну и такие методы, как очистка лога, или даже поиск в нем могли бы быть полезны.
3. Stierus - 31 Марта, 2009 - 10:52:09 - перейти к сообщению
А смысл? Так удобнее стало или что ?Улыбка Если ты ведешь отдельно логи ошибок авторизации, работы с базой данных, системные сбои и тд - тебе кучу экземпляров плодить придётся, а так просто меняем второй параметр и всё. А по поводу наворотов - тут уже у каждого свои тараканы, кто как захочет - так и навернет (именно для этого я и делал класс, а не просто функцию). Мне нужно было лишь сохранение, очистить можно просто удалением файла, либо переименовывая (подставляя дату), лично мне так было удобнее.
4. EuGen - 31 Марта, 2009 - 10:52:51 - перейти к сообщению
В том и смысл что не писать много раз имя файла, а создать на каждый лог-файл свой экземпляр, так даже логичнее.
5. Stierus - 31 Марта, 2009 - 10:55:46 - перейти к сообщению
не знаю log::write($err, 'auth'); ... что-то вроде метки - наглядно. Ну, может быть, у меня паранойя - не очень люблю переменные плодить, я в них путаться начинаю, забывать как обозвал - приходится всё время по коду скакать и искать Улыбка
(Добавление)
Надо будет автоматически массивы распознавать - это да, полезная штука, хотел как-то и забыл. Как добавлю - выложу (если кто-то раньше меня это не сделает)
6. EuGen - 31 Марта, 2009 - 10:58:28 - перейти к сообщению
Вот смотри.
Я просто уже сталкивался. Есть необходимость вести 4 лог-файла, например. И код, который в размере с учетом всей компактности ООП строк так 700-800.
Во-первых, каждый раз писать, а во вторых, еще и вспоминать в какой именно лог-файл писать конкретное сообщение.
Определенно каждый способ имеет право на существование, я лишь предложил альтернативный.
7. Stierus - 31 Марта, 2009 - 11:00:13 - перейти к сообщению
Ну да, тут уж смотря какие задачи.
8. Roler - 31 Марта, 2009 - 11:05:56 - перейти к сообщению
Не особо понял только, зачем preg_match, просто на случай ошибки в имени файла?
9. Stierus - 31 Марта, 2009 - 11:06:02 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. class logger{
  4.         public $file_name = NULL;
  5.        
  6.         public function __construct($log_file_name='main'){
  7.                 if (!(class_exists("Log"))){
  8.                         return false;
  9.                 }
  10.                 if(preg_match("/^([_a-z0-9A-Z]+)$/i", $log_file_name, $matches)){
  11.                         $this->file_name = $log_file_name;
  12.                 }
  13.                 else{
  14.                         return false;
  15.                 }
  16.         }
  17.        
  18.         public function write($mess=''){
  19.                 return Log::write($mess, $this->file_name);
  20.         }
  21. ?>
  22.  

(Добавление)
Цитата:
Не особо понял только, зачем preg_match, просто на случай ошибки в имени файла?
Да, что бы имя файла состояло только из латинских букв, цифр и знака подчеркивания.
10. LEONeso - 28 Ноября, 2010 - 12:44:45 - перейти к сообщению
Хороший класс - полезная штука. Спасибо. Спасибо и до свидания

Я тут незначительное дополнение сделал, условие:
PHP:
скопировать код в буфер обмена
  1.             if (!file_exists($file_path)) {touch($file_path);}

или же более простой вариант
PHP:
скопировать код в буфер обмена
  1. $handle = fopen($file_path, "a+");

оба варианта работают

результат:
PHP:
скопировать код в буфер обмена
  1. class Log{
  2. //Log::write('message', 'file');
  3. static function write($mess="", $name="main"){
  4.         if(strlen(trim($mess)) < 2){
  5. return fasle;
  6.         }
  7.         if(preg_match("/^([_a-z0-9A-Z]+)$/i", $name, $matches)){
  8. $file_path = $_SERVER['DOCUMENT_ROOT'].'/logs/'.$name.'.txt';
  9.             //если с условием, то вставить его сюда
  10. $text = htmlspecialchars($mess)."\r\n";
  11. $handle = fopen($file_path, "a");//если без условия, то после "a" поставить плюс "a+"
  12. @flock ($handle, LOCK_EX);
  13. fwrite ($handle, $text);
  14. fwrite ($handle, "==============================================================\r\n\r\n");
  15. @flock ($handle, LOCK_UN);
  16. fclose($handle);
  17. return true;
  18.         }
  19.         else{return false;}
  20. }
  21.         }


Удобно для ведения нескольких логов, автоматически создает файл, если он не найден.

--
При необходимости можно добавить дату и время: замена строки
PHP:
скопировать код в буфер обмена
  1. $text = date("d.m.Y (H:i)")." - ".htmlspecialchars($mess)."\r\n";


если все скрестить, то получится, что-то типа:
PHP:
скопировать код в буфер обмена
  1. class Log{
  2. static function write($mess="", $name="info_error"){
  3.         if(strlen(trim($mess)) < 2){
  4. return fasle;
  5.         }
  6.         if(preg_match("/^([_a-z0-9A-Z]+)$/i", $name, $matches)){
  7. $file_path=$_SERVER['DOCUMENT_ROOT'].'/logs/'.$name.'.txt';
  8. $text = date("d.m.Y (H:i:s)")." - ".htmlspecialchars($mess)."\r\n";
  9. $handle = fopen($file_path, "a+");
  10. @flock ($handle, LOCK_EX);
  11. fwrite ($handle, $text);
  12. //fwrite ($handle, "==============================================================\r\n\r\n");
  13. @flock ($handle, LOCK_UN);
  14. fclose($handle);
  15. return true;
  16.         }
  17.         else{return false;}
  18. }
  19.         }
  20.  
  21. //Log::write('Текст для записи', 'file_name');

 

Powered by ExBB FM 1.0 RC1