library/log4php/appenders/LoggerAppenderSyslog.php
changeset 46 f11c31f7fa3e
parent 45 a56e7f9a0463
child 47 03388ec805b4
equal deleted inserted replaced
45:a56e7f9a0463 46:f11c31f7fa3e
     1 <?php
       
     2 /**
       
     3  * Licensed to the Apache Software Foundation (ASF) under one or more
       
     4  * contributor license agreements. See the NOTICE file distributed with
       
     5  * this work for additional information regarding copyright ownership.
       
     6  * The ASF licenses this file to You under the Apache License, Version 2.0
       
     7  * (the "License"); you may not use this file except in compliance with
       
     8  * the License. You may obtain a copy of the License at
       
     9  *
       
    10  *       http://www.apache.org/licenses/LICENSE-2.0
       
    11  *
       
    12  * Unless required by applicable law or agreed to in writing, software
       
    13  * distributed under the License is distributed on an "AS IS" BASIS,
       
    14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
       
    15  * See the License for the specific language governing permissions and
       
    16  * limitations under the License.
       
    17  */
       
    18 
       
    19 /**
       
    20  * Log events to a system log using the PHP syslog() function.
       
    21  *
       
    22  * This appenders requires a layout.
       
    23  *
       
    24  * ## Configurable parameters: ##
       
    25  *
       
    26  * - **ident** - The ident of the syslog message.
       
    27  * - **priority** - The priority for the syslog message (used when overriding
       
    28  *     priority).
       
    29  * - **facility** - The facility for the syslog message
       
    30  * - **overridePriority** - If set to true, the message priority will always
       
    31  *     use the value defined in {@link $priority}, otherwise the priority will
       
    32  *     be determined by the message's log level.
       
    33  * - **option** - The option value for the syslog message.
       
    34  *
       
    35  * Recognised syslog options are:
       
    36  *
       
    37  * - CONS     - if there is an error while sending data to the system logger, write directly to the system console
       
    38  * - NDELAY - open the connection to the logger immediately
       
    39  * - ODELAY - delay opening the connection until the first message is logged (default)
       
    40  * - PERROR - print log message also to standard error
       
    41  * - PID    - include PID with each message
       
    42  *
       
    43  * Multiple options can be set by delimiting them with a pipe character,
       
    44  * e.g.: "CONS|PID|PERROR".
       
    45  *
       
    46  * Recognised syslog priorities are:
       
    47  *
       
    48  * - EMERG
       
    49  * - ALERT
       
    50  * - CRIT
       
    51  * - ERR
       
    52  * - WARNING
       
    53  * - NOTICE
       
    54  * - INFO
       
    55  * - DEBUG
       
    56  *
       
    57  * Levels are mapped as follows:
       
    58  *
       
    59  * - <b>FATAL</b> to LOG_ALERT
       
    60  * - <b>ERROR</b> to LOG_ERR
       
    61  * - <b>WARN</b> to LOG_WARNING
       
    62  * - <b>INFO</b> to LOG_INFO
       
    63  * - <b>DEBUG</b> to LOG_DEBUG
       
    64  * - <b>TRACE</b> to LOG_DEBUG
       
    65  *
       
    66  * @version $Revision: 1337820 $
       
    67  * @package log4php
       
    68  * @subpackage appenders
       
    69  * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
       
    70  * @link http://logging.apache.org/log4php/docs/appenders/syslog.html Appender documentation
       
    71  */
       
    72 class LoggerAppenderSyslog extends LoggerAppender {
       
    73 
       
    74     /**
       
    75      * The ident string is added to each message. Typically the name of your application.
       
    76      *
       
    77      * @var string
       
    78      */
       
    79     protected $ident = "Apache log4php";
       
    80 
       
    81     /**
       
    82      * The syslog priority to use when overriding priority. This setting is
       
    83      * required if {@link overridePriority} is set to true.
       
    84      *
       
    85      * @var string
       
    86      */
       
    87     protected $priority;
       
    88 
       
    89     /**
       
    90      * The option used when opening the syslog connection.
       
    91      *
       
    92      * @var string
       
    93      */
       
    94     protected $option = 'PID|CONS';
       
    95 
       
    96     /**
       
    97      * The facility value indicates the source of the message.
       
    98      *
       
    99      * @var string
       
   100      */
       
   101     protected $facility = 'USER';
       
   102 
       
   103     /**
       
   104      * If set to true, the message priority will always use the value defined
       
   105      * in {@link $priority}, otherwise the priority will be determined by the
       
   106      * message's log level.
       
   107      *
       
   108      * @var string
       
   109      */
       
   110     protected $overridePriority = false;
       
   111 
       
   112     /**
       
   113      * Holds the int value of the {@link $priority}.
       
   114      * @var int
       
   115      */
       
   116     private $intPriority;
       
   117 
       
   118     /**
       
   119      * Holds the int value of the {@link $facility}.
       
   120      * @var int
       
   121      */
       
   122     private $intFacility;
       
   123 
       
   124     /**
       
   125      * Holds the int value of the {@link $option}.
       
   126      * @var int
       
   127      */
       
   128     private $intOption;
       
   129 
       
   130     /**
       
   131      * Sets the {@link $ident}.
       
   132      *
       
   133      * @param string $ident
       
   134      */
       
   135     public function setIdent($ident) {
       
   136         $this->ident = $ident;
       
   137     }
       
   138 
       
   139     /**
       
   140      * Sets the {@link $priority}.
       
   141      *
       
   142      * @param string $priority
       
   143      */
       
   144     public function setPriority($priority) {
       
   145         $this->priority = $priority;
       
   146     }
       
   147 
       
   148     /**
       
   149      * Sets the {@link $facility}.
       
   150      *
       
   151      * @param string $facility
       
   152      */
       
   153     public function setFacility($facility) {
       
   154         $this->facility = $facility;
       
   155     }
       
   156 
       
   157     /**
       
   158      * Sets the {@link $overridePriority}.
       
   159      *
       
   160      * @param string $overridePriority
       
   161      */
       
   162     public function setOverridePriority($overridePriority) {
       
   163         $this->overridePriority = $overridePriority;
       
   164     }
       
   165 
       
   166     /**
       
   167      * Sets the 'option' parameter.
       
   168      *
       
   169      * @param string $option
       
   170      */
       
   171     public function setOption($option) {
       
   172         $this->option = $option;
       
   173     }
       
   174 
       
   175     /**
       
   176      * Returns the 'ident' parameter.
       
   177      *
       
   178      * @return string $ident
       
   179      */
       
   180     public function getIdent() {
       
   181         return $this->ident;
       
   182     }
       
   183 
       
   184     /**
       
   185      * Returns the 'priority' parameter.
       
   186      *
       
   187      * @return string
       
   188      */
       
   189     public function getPriority() {
       
   190         return $this->priority;
       
   191     }
       
   192 
       
   193     /**
       
   194      * Returns the 'facility' parameter.
       
   195      *
       
   196      * @return string
       
   197      */
       
   198     public function getFacility() {
       
   199         return $this->facility;
       
   200     }
       
   201 
       
   202     /**
       
   203      * Returns the 'overridePriority' parameter.
       
   204      *
       
   205      * @return string
       
   206      */
       
   207     public function getOverridePriority() {
       
   208         return $this->overridePriority;
       
   209     }
       
   210 
       
   211     /**
       
   212      * Returns the 'option' parameter.
       
   213      *
       
   214      * @return string
       
   215      */
       
   216     public function getOption() {
       
   217         return $this->option;
       
   218     }
       
   219 
       
   220 
       
   221     public function activateOptions() {
       
   222         $this->intPriority = $this->parsePriority();
       
   223         $this->intOption = $this->parseOption();
       
   224         $this->intFacility = $this->parseFacility();
       
   225 
       
   226         $this->closed = false;
       
   227     }
       
   228 
       
   229     public function close() {
       
   230         if ($this->closed != true) {
       
   231             closelog();
       
   232             $this->closed = true;
       
   233         }
       
   234     }
       
   235 
       
   236     /**
       
   237      * Appends the event to syslog.
       
   238      *
       
   239      * Log is opened and closed each time because if it is not closed, it
       
   240      * can cause the Apache httpd server to log to whatever ident/facility
       
   241      * was used in openlog().
       
   242      *
       
   243      * @see http://www.php.net/manual/en/function.syslog.php#97843
       
   244      */
       
   245     public function append(LoggerLoggingEvent $event) {
       
   246         $priority = $this->getSyslogPriority($event->getLevel());
       
   247         $message = $this->layout->format($event);
       
   248 
       
   249         openlog($this->ident, $this->intOption, $this->intFacility);
       
   250         syslog($priority, $message);
       
   251         closelog();
       
   252     }
       
   253 
       
   254     /** Determines which syslog priority to use based on the given level. */
       
   255     private function getSyslogPriority(LoggerLevel $level) {
       
   256         if ($this->overridePriority) {
       
   257             return $this->intPriority;
       
   258         }
       
   259         return $level->getSyslogEquivalent();
       
   260     }
       
   261 
       
   262     /** Parses a syslog option string and returns the correspodning int value. */
       
   263     private function parseOption() {
       
   264         $value = 0;
       
   265         $options = explode('|', $this->option);
       
   266 
       
   267         foreach ($options as $option) {
       
   268             if (!empty($option)) {
       
   269                 $constant = "LOG_" . trim($option);
       
   270                 if (defined($constant)) {
       
   271                     $value |= constant($constant);
       
   272                 } else {
       
   273                     trigger_error("log4php: Invalid syslog option provided: $option. Whole option string: {$this->option}.", E_USER_WARNING);
       
   274                 }
       
   275             }
       
   276         }
       
   277         return $value;
       
   278     }
       
   279 
       
   280     /** Parses the facility string and returns the corresponding int value. */
       
   281     private function parseFacility() {
       
   282         if (!empty($this->facility)) {
       
   283             $constant = "LOG_" . trim($this->facility);
       
   284             if (defined($constant)) {
       
   285                 return constant($constant);
       
   286             } else {
       
   287                 trigger_error("log4php: Invalid syslog facility provided: {$this->facility}.", E_USER_WARNING);
       
   288             }
       
   289         }
       
   290     }
       
   291 
       
   292     /** Parses the priority string and returns the corresponding int value. */
       
   293     private function parsePriority() {
       
   294         if (!empty($this->priority)) {
       
   295             $constant = "LOG_" . trim($this->priority);
       
   296             if (defined($constant)) {
       
   297                 return constant($constant);
       
   298             } else {
       
   299                 trigger_error("log4php: Invalid syslog priority provided: {$this->priority}.", E_USER_WARNING);
       
   300             }
       
   301         }
       
   302     }
       
   303 }