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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: класс для ведения логов

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: PHP
Stierus Супермодератор
Отправлено: 31 Марта, 2009 - 10:06:14
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




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). Часто нельзя выводить на экран некие метки - удобно записать в файл и посмотреть после выполнения.

(Отредактировано автором: 31 Марта, 2009 - 10:06:33)

 
My status
 Top
EuGen Администратор
Отправлено: 31 Марта, 2009 - 10:50:26
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Полезный класс, есть только, наверное, возможность улучшить:
А почему бы не задавать имя лог-файла в конструкторе? Не придется при необходимости ведения нескольких логов сразу каждый раз писать при вызове функции. То есть, к примеру, выглядело бы это так:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. $logFile=new Log("your_log.log");
  4. //какой-то код
  5. $logFile->write("message");
  6. ?>
  7.  

Ну и такие методы, как очистка лога, или даже поиск в нем могли бы быть полезны.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Stierus Супермодератор
Отправлено: 31 Марта, 2009 - 10:52:09
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




А смысл? Так удобнее стало или что ?Улыбка Если ты ведешь отдельно логи ошибок авторизации, работы с базой данных, системные сбои и тд - тебе кучу экземпляров плодить придётся, а так просто меняем второй параметр и всё. А по поводу наворотов - тут уже у каждого свои тараканы, кто как захочет - так и навернет (именно для этого я и делал класс, а не просто функцию). Мне нужно было лишь сохранение, очистить можно просто удалением файла, либо переименовывая (подставляя дату), лично мне так было удобнее.

(Отредактировано автором: 31 Марта, 2009 - 10:53:52)

 
My status
 Top
EuGen Администратор
Отправлено: 31 Марта, 2009 - 10:52:51
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




В том и смысл что не писать много раз имя файла, а создать на каждый лог-файл свой экземпляр, так даже логичнее.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Stierus Супермодератор
Отправлено: 31 Марта, 2009 - 10:55:46
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




не знаю log::write($err, 'auth'); ... что-то вроде метки - наглядно. Ну, может быть, у меня паранойя - не очень люблю переменные плодить, я в них путаться начинаю, забывать как обозвал - приходится всё время по коду скакать и искать Улыбка
(Добавление)
Надо будет автоматически массивы распознавать - это да, полезная штука, хотел как-то и забыл. Как добавлю - выложу (если кто-то раньше меня это не сделает)
 
My status
 Top
EuGen Администратор
Отправлено: 31 Марта, 2009 - 10:58:28
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Вот смотри.
Я просто уже сталкивался. Есть необходимость вести 4 лог-файла, например. И код, который в размере с учетом всей компактности ООП строк так 700-800.
Во-первых, каждый раз писать, а во вторых, еще и вспоминать в какой именно лог-файл писать конкретное сообщение.
Определенно каждый способ имеет право на существование, я лишь предложил альтернативный.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Stierus Супермодератор
Отправлено: 31 Марта, 2009 - 11:00:13
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




Ну да, тут уж смотря какие задачи.
 
My status
 Top
Roler
Отправлено: 31 Марта, 2009 - 11:05:56
Post Id



Посетитель


Покинул форум
Сообщений всего: 458
Дата рег-ции: Авг. 2008  
Откуда: Россия


Помог: 1 раз(а)




Не особо понял только, зачем preg_match, просто на случай ошибки в имени файла?
 
 Top
Stierus Супермодератор
Отправлено: 31 Марта, 2009 - 11:06:02
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




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, просто на случай ошибки в имени файла?
Да, что бы имя файла состояло только из латинских букв, цифр и знака подчеркивания.

(Отредактировано автором: 31 Марта, 2009 - 11:08:23)

 
My status
 Top
LEONeso
Отправлено: 28 Ноября, 2010 - 12:44:45
Post Id



Посетитель


Покинул форум
Сообщений всего: 499
Дата рег-ции: Янв. 2010  
Откуда: Россия, Москва


Помог: 1 раз(а)




Хороший класс - полезная штука. Спасибо. Спасибо и до свидания

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

или же более простой вариант

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

результат:
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');

(Отредактировано автором: 08 Декабря, 2010 - 15:19:22)



-----
Для некоторых лучший способ написать что-нибудь осмысленное - это сесть _опой на клавиатуру.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Пользовательские функции »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB