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$ * @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; } }