TigerZF
🌐Español

44.5. Uso de la Factory para crear un Log

Además de la instanciación directa, también puede usar el método estático factory() para instanciar un objeto Log, así como para configurar los writers adjuntos y sus filtros. Usando la factory, puede adjuntar cero o más writers. La configuración puede pasarse como un array o como una instancia de Zend_Config. Si desea crear una instancia de una clase personalizada (que extienda de Zend_Log), puede pasar una opción className al método factory().

Como ejemplo:

$logger = Zend_Log::factory(array(
    'timestampFormat' => 'Y-m-d',
    array(
        'writerName'   => 'Stream',
        'writerParams' => array(
            'stream'   => '/tmp/zend.log',
        ),
        'formatterName' => 'Simple',
        'formatterParams' => array(
            'format'   => '%timestamp%: %message% -- %info%',
        ),
        'filterName'   => 'Priority',
        'filterParams' => array(
            'priority' => Zend_Log::WARN,
        ),
    ),
    array(
        'writerName'   => 'Firebug',
        'filterName'   => 'Priority',
        'filterParams' => array(
            'priority' => Zend_Log::INFO,
        ),
    ),
));

Lo anterior instanciará un logger con dos writers, uno para escribir en un archivo local, y otro para enviar datos a Firebug. Cada uno tiene un filtro de prioridad adjunto, con diferentes prioridades máximas.

Por defecto, los eventos se registran con el formato de fecha ISO 8601. Puede elegir su propio formato con la opción timestampFormat.

Cada writer puede definirse con las siguientes claves:

writerName (requerido)

El nombre "corto" de un writer de log; el nombre del writer de log sin el prefijo/espacio de nombres de clase inicial. Consulte la entrada "writerNamespace" más abajo para más detalles. Ejemplos: "Mock", "Stream", "Firebug".

writerParams (opcional)

Un array asociativo de parámetros a usar al instanciar el writer de log. El método factory() de cada writer de log los mapeará a argumentos del constructor, según se indica más abajo.

writerNamespace (opcional)

El prefijo/espacio de nombres de clase a usar al construir el nombre de clase final del writer de log. Por defecto, si no se proporciona, se asume "Zend_Log_Writer"; sin embargo, puede pasar su propio espacio de nombres si está usando un writer de log personalizado.

formatterName (opcional)

El nombre "corto" de un formatter a usar con el writer de log dado; el nombre del formatter sin el prefijo/espacio de nombres de clase inicial. Consulte la entrada "formatterNamespace" más abajo para más detalles. Ejemplos: "Simple", "Xml".

formatterParams (opcional)

Un array asociativo de parámetros a usar al instanciar el formatter de log. El método factory() de cada formatter de log los mapeará a argumentos del constructor, según se indica más abajo.

formatterNamespace (opcional)

El prefijo/espacio de nombres de clase a usar al construir el nombre de clase final del formatter de log. Por defecto, si no se proporciona, se asume "Zend_Log_Formatter"; sin embargo, puede pasar su propio espacio de nombres si está usando un formatter de log personalizado.

filterName (opcional)

El nombre "corto" de un filtro a usar con el writer de log dado; el nombre del filtro sin el prefijo/espacio de nombres de clase inicial. Consulte la entrada "filterNamespace" más abajo para más detalles. Ejemplos: "Message", "Priority".

filterParams (opcional)

Un array asociativo de parámetros a usar al instanciar el filtro de log. El método factory() de cada filtro de log los mapeará a argumentos del constructor, según se indica más abajo.

filterNamespace (opcional)

El prefijo/espacio de nombres de clase a usar al construir el nombre de clase final del filtro de log. Por defecto, si no se proporciona, se asume "Zend_Log_Filter"; sin embargo, puede pasar su propio espacio de nombres si está usando un filtro de log personalizado.

Cada writer y cada filtro tiene opciones específicas.

44.5.1. Opciones de writer

44.5.1.1. Opciones de Zend_Log_Writer_Db

db

Una instancia de Zend_Db_Adapter.

table

El nombre de la tabla en el RDBMS que contendrá las entradas del log.

columnMap

Un array asociativo que mapea nombres de columna de la tabla de base de datos con campos del evento de log.

44.5.1.2. Opciones de Zend_Log_Writer_Firebug

Este writer de log no toma opciones; cualquiera que se proporcione será ignorada.

44.5.1.3. Opciones de Zend_Log_Writer_Mail

Tabla 44.3. Opciones de Zend_Log_Writer_Mail

Opción Tipo de dato Valor por defecto Descripción
mail String Zend_Mail Una instancia de Zend_Mail
charset String iso-8859-1 Charset del correo
from String o Array NULL Remitente del correo Los parámetros para el tipo Array son:
  • email : dirección del remitente

  • name : nombre del remitente

to String o Array NULL Destinatario(s) del correo
cc String o Array NULL Destinatario(s) en copia del correo
bcc String o Array NULL Destinatario(s) en copia oculta del correo
subject String NULL Asunto del correo
subjectPrependText String NULL Se añade al asunto del correo un resumen del número de errores por prioridad
layout String NULL Una instancia de Zend_Layout
layoutOptions Array NULL Vea la sección Sección 40.3, “Opciones de configuración de Zend_Layout”
layoutFormatter String NULL Una instancia de Zend_Log_Formatter_Interface

44.5.1.4. Opciones de Zend_Log_Writer_Mock

Este writer de log no toma opciones; cualquiera que se proporcione será ignorada.

44.5.1.5. Opciones de Zend_Log_Writer_Null

Este writer de log no toma opciones; cualquiera que se proporcione será ignorada.

44.5.1.6. Opciones de Zend_Log_Writer_Stream

stream|url

Un identificador de stream válido de PHP en el que registrar el log.

mode

El modo de E/S con el que registrar el log; por defecto es "a", de "append" (añadir).

44.5.1.7. Opciones de Zend_Log_Writer_Syslog

application

Nombre de la aplicación usado por el writer de syslog.

facility

Facility usada por el writer de syslog.

44.5.1.8. Opciones de Zend_Log_Writer_ZendMonitor

Este writer de log no toma opciones; cualquiera que se proporcione será ignorada.

44.5.2. Opciones de filtro

44.5.2.1. Opciones de Zend_Log_Filter_Message

regexp

Expresión regular que debe coincidir para registrar un mensaje.

44.5.2.2. Opciones de Zend_Log_Filter_Priority

priority

El nivel máximo de prioridad con el que se registrarán los mensajes.

operator

El operador de comparación con el que se realizan las comparaciones de prioridad; por defecto es "<=".

44.5.2.3. Opciones de Zend_Log_Filter_Suppress

Este filtro de log no toma opciones; cualquiera que se proporcione será ignorada.

44.5.3. Creación de writers y filtros configurables

Si en algún momento necesita escribir sus propios writers y/o filtros de log, puede hacerlos compatibles con Zend_Log::factory() muy fácilmente.

Como mínimo, necesita implementar Zend_Log_FactoryInterface, que espera un método estático factory() que acepte un único argumento, $config, que puede ser un array o un objeto Zend_Config. Si su writer de log extiende de Zend_Log_Writer_Abstract, o su filtro de log extiende de Zend_Log_Filter_Abstract, obtendrá esto de forma gratuita.

Luego, simplemente defina los mapeos entre la configuración aceptada y los argumentos del constructor. Como ejemplo:

class My_Log_Writer_Foo extends Zend_Log_Writer_Abstract
{
    public function __construct($bar, $baz)
    {
        // ...
    }

    public static function factory($config)
    {
        if ($config instanceof Zend_Config) {
            $config = $config->toArray();
        }
        if (!is_array($config)) {
            throw new Exception(
                'factory expects an array or Zend_Config instance'
            );
        }

        $default = array(
            'bar' => null,
            'baz' => null,
        );
        $config = array_merge($default, $config);

        return new self(
            $config['bar'],
            $config['baz']
        );
    }
}

Alternativamente, podría llamar a los setters apropiados tras la instanciación, pero antes de devolver el objeto:

class My_Log_Writer_Foo extends Zend_Log_Writer_Abstract
{
    public function __construct($bar = null, $baz = null)
    {
        // ...
    }

    public function setBar($value)
    {
        // ...
    }

    public function setBaz($value)
    {
        // ...
    }

    public static function factory($config)
    {
        if ($config instanceof Zend_Config) {
            $config = $config->toArray();
        }
        if (!is_array($config)) {
            throw new Exception(
                'factory expects an array or Zend_Config instance'
            );
        }

        $writer = new self();
        if (isset($config['bar'])) {
            $writer->setBar($config['bar']);
        }
        if (isset($config['baz'])) {
            $writer->setBaz($config['baz']);
        }
        return $writer;
    }
}