Вы хотите поместить свой класс в пользовательском/включить/SugarLogger и назвать это что-то вроде SugarXMLLogger (это гибкое, но следует конвенции в SugarCRM). Не забудьте назвать класс таким же, как файл.
Вы должны реализовать LoggerTemplate, по крайней мере, и, если вы хотите, чтобы полная структура регистратора по умолчанию, используемого SugarCRM, вы хотели бы расширить SugarLogger. Однако для простого XML-регистратора это не обязательно.
Хотя я знаю, что вы не запрашивали код для фактического ведения журнала, при тестировании фактического создания пользовательского регистратора я решил его создать. Это моя попытка простого XML-регистратора с использованием SimpleXML. Я протестировал это против Ping API, чтобы посмотреть, как он работает, используя как фатальные журналы для XML, так и все журналы в XML.
<?php
/**
* Save to custom/include/SugarLogger/SugarXMLLogger.php
*
* Usage:
* To make one particular log level write to the XML log do this:
* ```php
* <?php
* LoggerManager::setLogger('fatal', 'SugarXMLLogger');
* $GLOBALS['log']->fatal('Testing out the XML logger');
* ```
*
* To make all levels log to the XML log, do this
* ```php
* <?php
* LoggerManager::setLogger('default', 'SugarXMLLogger');
* $GLOBALS['log']->warn('Testing out the XML logger');
* ```
*/
/**
* Get the interface that his logger should implement
*/
require_once 'include/SugarLogger/LoggerTemplate.php';
/**
* SugarXMLLogger - A very simple logger that will save log entries into an XML
* log file
*/
class SugarXMLLogger implements LoggerTemplate
{
/**
* The name of the log file
*
* @var string
*/
protected $logfile = 'sugarcrm.log.xml';
/**
* The format for the timestamp entry of the log
*
* @var string
*/
protected $dateFormat = '%c';
/**
* The current SimpleXMLElement logger resource
*
* @var SimpleXMLElement
*/
protected $currentData;
/**
* Logs an entry to the XML log
*
* @param string $level The log level being logged
* @param array $message The message to log
* @return boolean True if the log was saved
*/
public function log($level, $message)
{
// Get the current log XML
$this->setCurrentLog();
// Append to it
$this->appendToLog($level, $message);
// Save it
return $this->saveLog();
}
/**
* Saves the log file
*
* @return boolean True if the save was successful
*/
protected function saveLog()
{
$write = $this->currentData->asXML();
return sugar_file_put_contents_atomic($this->logfile, $write);
}
/**
* Sets the SimpleXMLElement log object
*
* If there is an existing log, it will consume it. Otherwise it will create
* a SimpleXMLElement object from a default construct.
*/
protected function setCurrentLog()
{
if (file_exists($this->logfile)) {
$this->currentData = simplexml_load_file($this->logfile);
} else {
sugar_touch($this->logfile);
$this->currentData = simplexml_load_string("<?xml version='1.0' standalone='yes'?><entries></entries>");
}
}
/**
* Adds an entry of level $level to the log, with message $message
*
* @param string $level The log level being logged
* @param array $message The message to log
*/
protected function appendToLog($level, $message)
{
// Set some basics needed for every entry, starting with the current
// user id
$userID = $this->getUserID();
// Get the process id
$pid = getmypid();
// Get the message to log
$message = $this->getMessage($message);
// Set the timestamp
$timestamp = strftime($this->dateFormat);
// Add it to the data now
$newEntry = $this->currentData->addChild('entry');
$newEntry->addChild('timestamp', $timestamp);
$newEntry->addChild('pid', $pid);
$newEntry->addChild('userid', $userID);
$newEntry->addChild('level', $level);
$newEntry->addChild('message', $message);
}
/**
* Gets the user id for the current user, or '-none-' if the current user ID
* is not attainable
*
* @return string The ID of the current user
*/
protected function getUserID()
{
if (!empty($GLOBALS['current_user']->id)) {
return $GLOBALS['current_user']->id;
}
return '-none-';
}
/**
* Gets the message in a loggable format
*
* @param mixed $message The message to log, as a string or an array
* @return string The message to log, as a string
*/
protected function getMessage($message)
{
if (is_array($message) && count($message) == 1) {
$message = array_shift($message);
}
// change to a human-readable array output if it's any other array
if (is_array($message)) {
$message = print_r($message,true);
}
return $message;
}
}
возможно дубликат [Можно ли создавать пользовательские журналы файлы в Sugar CRM своих методов?] (Http://stackoverflow.com/questions/26143788/can-we-create-custom-logs-files- in-sugar-crm-through-its-own-methods) –
@MatthewPoer, пожалуйста, прочитайте вопрос, у меня нет проблем с тем, как реализовать Logger, у меня проблема с тем, куда я должен поместить свой код. Cheers, Vova –
Суть в этом сообщении предполагает 'custom/Company/Helper/Logger.php', который кажется мне странным, я бы создал файл класса в' custom/include/MyLogger.php', чтобы он мог быть легко найдено, требуется и вызывается в логических перехватах. –