Настроить ведение журнала - CakePHP (1.3) - PullRequest
2 голосов
/ 10 января 2012

Я бы хотел расширить возможности лесозаготовок CakePHP. Использование

$this->log($msg, $level)

вы можете записать $msg с $level в tmp / logs / $ level.log.

Как я хотел бы использовать ведение журнала:

  1. Отдельные функции для разных уровней, например, $this->debug($msg) для $this->log($msg, 'debug') и $this->error($msg) для $this->log($msg, 'error') и т. Д. Для ведения журнала.
  2. Автоматически помещает имя класса перед сообщением, например, $this->debug($msg) приведет к «MyClass: $ msg», если $this имеет тип «MyClass».

Я знаю, что могу расширить функциональность за счет расширения AppModel, AppController и т. Д., Но, поскольку мне нужна функциональность повсюду в моем приложении, я бы предпочел расширить Object для CakePHP - но не нашел стабильного механизма для этого не хочу менять его в торт / папку). Я думал о реализации нового класса для этой функциональности, но я не уверен, как сделать это доступным в cakephp.

Не могли бы вы дать мне несколько советов, где / как я могу аккуратно реализовать эти расширения?

Ответы [ 2 ]

2 голосов
/ 11 января 2012

В дополнение к тому, что сказал деизель (кстати, отличная рецензия, деизель), вам не нужно использовать регистратор Cake.Вы можете использовать любую систему регистрации, которую захотите.Выбор существующей среды ведения журналов, которая вам нравится, вероятно, будет самым безопасным выбором.bootstrap.php - хорошее место для любых require вызовов или инициализаций.

В противном случае, если вы хотите сделать что-то «в» Cake, я бы порекомендовал создать плагин с трио интерфейсов протоколирования: Компонент, Поведение и Помощник.Таким образом, функциональность регистрации будет доступна в ваших моделях, представлениях и контроллерах.Что касается того, как его кодировать, мне нравится идея сделать классы тортов тонкими прокси для вашего реального класса журналирования и использовать магический метод __call() в ваших прокси для анализа запросов на регистрацию и среды, а затем передать эту информацию вашему регистратору, чтобыобрабатывать единообразно.

Вы сможете написать что-то вроде $this->MyLogger->oops("stubbed my toe") и, возможно, иметь файл oops.log с вашими сообщениями и любой дополнительной информацией (вызывающей контроллер / представление / модель, время и дата и т. д.), которую выхотел бы в комплекте.

2 голосов
/ 11 января 2012

Глобальные удобные методы

Ну, вы действительно не можете сделать исправление обезьян в PHP (как минимум 5.2), и это, вероятно, хорошая вещь дляразработчики, которые должны поддерживать ваш код после вашего ухода.:)

CakePHP - будучи платформой MVC со строгими соглашениями - затрудняет вам нарушение парадигмы MVC, позволяя только расширять части, которые вам нужны в изоляции (то есть. AppModel, AppControllerи т. д.) и сохранение объектно-ориентированного основания в ядре нетронутым (что затрудняет добавление кода, который «может использоваться везде» для возможного неправильного использования).

Что касается добавления функциональности, которая выходит за пределы разделения MVCместо для этого app/config/bootstrap.php.Когда вы размещаете код здесь, становится ясно, что он не является частью фреймворка (вполне справедливо), но позволяет вам добавлять подобные вещи до того, как CakePHP даже загрузится.Вот несколько вариантов действий:

  1. Создание функции (например, некоторые пользовательские функции, такие как error(), которые вызывают CakeLog::write() так, как вам нравится).
  2. Загрузите класс (например, загрузите свой собственный класс журналирования, называемый что-то вроде .. Log, чтобы вы могли вызывать Log::error() местами)
  3. См. Ниже:

API логгера

Cake позволяет выполнять множество настроек для таких вещей, как логгер, но, к сожалению, API, представленный нам, уже определен в ядре в этом случае.API для входа в CakePHP выглядит следующим образом, и вы можете использовать любой подход где угодно (ну, первый только в классах):

$this->log($msg, $level) // any class extending `Object` inherits this
// or
CakeLog::write($level, $message); // this is actually what is called by the above

Произвольный параметр $level, который вы пытаетесь исключитьна самом деле довольно мощная функция :

$this->log('Cannot connect to SMTP server', 'email'); // logs to app/logs/email.log
// vs
$this->email('Cannot connect to SMTP server'); // ambiguous - does this send emails?

Мы только что создали совершенно новый тип журналов без написания дополнительной строки кода, и совершенно ясно, какова цель нашего кода.

Настройка регистратора

Разработчики ядра имели возможность добавить условие , позволяющее нам полностью заменить класс регистратора, если мы захотим:

function log($msg, $type = LOG_ERROR) {
    if (!class_exists('CakeLog')) { // winning
        require LIBS . 'cake_log.php';
    }
    // ...

Как видите, базовый класс CakeLog создается только в том случае, если такого класса не существует, что дает вам возможность вставить что-то собственного создания (или точную копию с несколькими изменениями - хотявы хотели бы синхронизировать изменения с ядром - вручную - при обновлении):

// app/config/bootstrap.php
App::import('Lib', 'CakeLog'); // copy cake/libs/cake_log.php to app/lib/cake_log.php

Вышеприведенное даст вам полный контроль над реализацией CakeLog class в вашем приложении, так что вы можете сделать что-то вроде динамического добавления имени вызывающего класса в ваши сообщения журнала.Однако более прямой способ сделать это (и другие типы ведения журнала - например, в базе данных) - это создать собственный поток журнала :

CakeLog::config('file', array(
    'engine' => 'FileLog', // copy cake/libs/log/file_log.php to app/libs/log/file_log.php
));

TL; DR - Несмотря на то, что вы можете загрузить свой собственный код до начальной загрузки CakePHP или для использования отдельно в каждом из предоставленных слоев MVC, вы не должны вмешиваться в иерархию объектов, предоставляемую ядром.Это затрудняет добавление методов класса, которые наследуются глобально.

Мой совет: используйте предоставленный вам API и сконцентрируйтесь на добавлении дополнительных функций вместо синтаксических тонкостей.:)

...