Here what Zend_Log_Writer_Syslog could look like:

class Zend_Log_Writer_Syslog extends Zend_Log_Writer_Abstract
{
    /**
     * Maps Zend_Log priorities to PHP's syslog priorities
     * @var array
     */
    protected $_priorities = array(Zend_Log::EMERG  => LOG_EMERG,
                                   Zend_Log::ALERT  => LOG_ALERT,
                                   Zend_Log::CRIT   => LOG_CRIT,
                                   Zend_Log::ERR    => LOG_ERR,
                                   Zend_Log::WARN   => LOG_WARNING,
                                   Zend_Log::NOTICE => LOG_NOTICE,
                                   Zend_Log::INFO   => LOG_INFO,
                                   Zend_Log::DEBUG  => LOG_DEBUG);

    /**
     * The default log priority - for unmapped custom priorities
     * @var string
     */
    protected $_defaultPriority = LOG_NOTICE;

    public function __construct($application = 'Zend_Log')
    {
        if (false === @openlog($application, LOG_PID, LOG_USER)) {
            throw new Zend_Log_Exception('Cannot connect to syslog');
        }
    }

    /**
     * Close syslog.
     *
     * @return void
     */
    public function shutdown()
    {
        @closelog();
    }

    /**
     * Write a message to syslog.
     *
     * @param  array  $event  event data
     * @return void
     */
    protected function _write($event)
    {
        if (array_key_exists($event['priority'], $this->_priorities)) {
            $priority = $this->_priorityStyles[$event['priority']];
        } else {
            $priority = $this->_defaultPriority;
        }

        if (false === @syslog($priority, $event['message'])) {
            throw new Zend_Log_Exception('Unable to write to syslog');
        }
    }
}

Even if LOG_USER should be fine for most users (it is available on
Windows too) methods allowing to change facility could be added, the
rest should be fine.

Could someone test if this would "work out of the box" on windows?

Cheers,
Thomas

NB: I'm not sure about the @'s in front of the syslog functions - as
    syslog is working fine on all of my systems I never experienced
    such an error ;-) If no one knows I'll test it - if there is even
    one single scenario producing a PHP-notice they have to stay there.


Thomas Gelf schrieb:
Hi list,

as surely most of you have a lot of free time available I'll throw
in a new old topic to hopefully be discussed in this round ;-)

It's about logging. I like Zend_Log, it's well done - but the writers
currently available are not an option for most of my projects. Let's
make some example:

* stream writers writing to local files are running fine, are not
  blocking parallel requests and should be ok so far if you just
  want your logs to be written down somewhere

* it's difficult to set up a secure environment allowing PHP scripts
  running under different UIDs writing to the same log file (mostly
  leading to insecure logfile permissions or strange hacks)

* hacked PHP sites are able to modify (application) log entries if
  PHP is able to write to them

* if you want a cronjob to rotate log files for a PHP-written daemon
  you have to implement signal handlers (who has ever done so knows
  that this could be a really funny task)

* writing to DB is great for small projects - but impossible for sites
  with heavy traffic. If you want to handle high loads your application
  should be able to serve most requests without the need to connect to
  your database cluster

* ZF documentation should make people aware of locking and therefore
  performance issues when using MyISAM instead of InnoDB on MySQL

* who wants to achieve a distributed centralized logging is currently
  either forced to write it's own syslog writer or probably going to
  reimplement things syslog would usually do for you

Said all this: why is there still no Zend_Log_Writer_Syslog? Windows
is no excuse - PHP's syslog() function exists also there, so we should
be able to satisfy ZF's rules. And those rare windows people taking
care of their logs will surely be able to find out where they are going
to finish ;-) We should however avoid LOCAL*-facilities, as far as I
know (didn't test it) they are not available on windows.

Thanks for your feedback - and have a nice weekend!

Regards,
Thomas Gelf



Reply via email to