diff --git a/library/log4php/layouts/LoggerLayoutXml.php b/library/log4php/layouts/LoggerLayoutXml.php new file mode 100644 --- /dev/null +++ b/library/log4php/layouts/LoggerLayoutXml.php @@ -0,0 +1,210 @@ +It does not output a complete well-formed XML file. + * The output is designed to be included as an external entity in a separate file to form + * a correct XML file.

+ * + * Example: + * + * {@example ../../examples/php/layout_xml.php 19}
+ * + * {@example ../../examples/resources/layout_xml.properties 18}
+ * + * The above would print: + * + *
+ * 
+ *    
+ *        
+ *        
+ *    
+ * 
+ * 
+ * + * @version $Revision: 1213283 $ + * @package log4php + * @subpackage layouts + */ +class LoggerLayoutXml extends LoggerLayout { + const LOG4J_NS_PREFIX = 'log4j'; + const LOG4J_NS = 'http://jakarta.apache.org/log4j/'; + + const LOG4PHP_NS_PREFIX = 'log4php'; + const LOG4PHP_NS = 'http://logging.apache.org/log4php/'; + + const CDATA_START = ''; + const CDATA_PSEUDO_END = ']]>'; + const CDATA_EMBEDDED_END = ']]>]]>getLog4jNamespace()) { + $this->namespace = self::LOG4J_NS; + $this->namespacePrefix = self::LOG4J_NS_PREFIX; + } else { + $this->namespace = self::LOG4PHP_NS; + $this->namespacePrefix = self::LOG4PHP_NS_PREFIX; + } + } + + /** + * @return string + */ + public function getHeader() { + return "<{$this->namespacePrefix}:eventSet " . + "xmlns:{$this->namespacePrefix}=\"{$this->namespace}\" " . + "version=\"0.3\" " . + "includesLocationInfo=\"" . ($this->getLocationInfo() ? "true" : "false") . "\"" . + ">" . PHP_EOL; + } + + /** + * Formats a {@link LoggerLoggingEvent} in conformance with the log4php.dtd. + * + * @param LoggerLoggingEvent $event + * @return string + */ + public function format(LoggerLoggingEvent $event) { + $ns = $this->namespacePrefix; + + $loggerName = $event->getLoggerName(); + $timeStamp = number_format((float)($event->getTimeStamp() * 1000), 0, '', ''); + $thread = $event->getThreadName(); + $level = $event->getLevel()->toString(); + + $buf = "<$ns:event logger=\"{$loggerName}\" level=\"{$level}\" thread=\"{$thread}\" timestamp=\"{$timeStamp}\">" . PHP_EOL; + $buf .= "<$ns:message>"; + $buf .= $this->encodeCDATA($event->getRenderedMessage()); + $buf .= "" . PHP_EOL; + + $ndc = $event->getNDC(); + if (!empty($ndc)) { + $buf .= "<$ns:NDC>encodeCDATA($ndc); + $buf .= "]]>" . PHP_EOL; + } + + $mdcMap = $event->getMDCMap(); + if (!empty($mdcMap)) { + $buf .= "<$ns:properties>" . PHP_EOL; + foreach ($mdcMap as $name => $value) { + $buf .= "<$ns:data name=\"$name\" value=\"$value\" />" . PHP_EOL; + } + $buf .= "" . PHP_EOL; + } + + if ($this->getLocationInfo()) { + $locationInfo = $event->getLocationInformation(); + $buf .= "<$ns:locationInfo " . + "class=\"" . $locationInfo->getClassName() . "\" " . + "file=\"" . htmlentities($locationInfo->getFileName(), ENT_QUOTES) . "\" " . + "line=\"" . $locationInfo->getLineNumber() . "\" " . + "method=\"" . $locationInfo->getMethodName() . "\" "; + $buf .= "/>" . PHP_EOL; + } + + $buf .= "" . PHP_EOL; + + return $buf; + } + + /** + * @return string + */ + public function getFooter() { + return "namespacePrefix}:eventSet>" . PHP_EOL; + } + + + /** + * Whether or not file name and line number will be included in the output. + * @return boolean + */ + public function getLocationInfo() { + return $this->locationInfo; + } + + /** + * The {@link $locationInfo} option takes a boolean value. By default, + * it is set to false which means there will be no location + * information output by this layout. If the the option is set to + * true, then the file name and line number of the statement at the + * origin of the log statement will be output. + */ + public function setLocationInfo($flag) { + $this->setBoolean('locationInfo', $flag); + } + + /** + * @return boolean + */ + public function getLog4jNamespace() { + return $this->log4jNamespace; + } + + /** + * @param boolean + */ + public function setLog4jNamespace($flag) { + $this->setBoolean('log4jNamespace', $flag); + } + + /** + * Encases a string in CDATA tags, and escapes any existing CDATA end + * tags already present in the string. + * @param string $string + */ + private function encodeCDATA($string) { + $string = str_replace(self::CDATA_END, self::CDATA_EMBEDDED_END, $string); + return self::CDATA_START . $string . self::CDATA_END; + } +} +