NEW Support logging to a Sentry server
Sentry is an Open Source error logging and aggregation platform. It can be used on-premise or hosted at https://getsentry.com
This commit is contained in:
parent
3b5473abe4
commit
7bb917e637
187
htdocs/core/modules/syslog/mod_syslog_sentry.php
Normal file
187
htdocs/core/modules/syslog/mod_syslog_sentry.php
Normal file
@ -0,0 +1,187 @@
|
|||||||
|
<?php
|
||||||
|
/* Copyright (C) 2004-2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
|
||||||
|
* Copyright (C) 2004-2009 Laurent Destailleur <eldy@users.sourceforge.net>
|
||||||
|
* Copyright (C) 2015 Raphaël Doursenaud <rdoursenaud@gpcsolutions.fr>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
require_once DOL_DOCUMENT_ROOT . '/includes/autoload.php';
|
||||||
|
require_once DOL_DOCUMENT_ROOT . '/core/modules/syslog/logHandler.php';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class to manage logging to Sentry
|
||||||
|
*
|
||||||
|
* @see https://docs.getsentry.com/on-premise/clients/php/
|
||||||
|
*/
|
||||||
|
class mod_syslog_sentry extends LogHandler implements LogHandlerInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var string Log handler code
|
||||||
|
*/
|
||||||
|
public $code = 'sentry';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return name of logger
|
||||||
|
*
|
||||||
|
* @return string Name of logger
|
||||||
|
*/
|
||||||
|
public function getName()
|
||||||
|
{
|
||||||
|
return 'Sentry';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Version of the module ('x.y.z' or 'dolibarr' or 'experimental' or 'development')
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getVersion()
|
||||||
|
{
|
||||||
|
return 'dolibarr';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Content of the info tooltip.
|
||||||
|
*
|
||||||
|
* @return false|string
|
||||||
|
*/
|
||||||
|
public function getInfo()
|
||||||
|
{
|
||||||
|
global $langs;
|
||||||
|
return $langs->trans('SyslogSentryFromProject');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Is the module active ?
|
||||||
|
*
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
public function isActive()
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return array of configuration data
|
||||||
|
*
|
||||||
|
* @return array Return array of configuration data
|
||||||
|
*/
|
||||||
|
public function configure()
|
||||||
|
{
|
||||||
|
global $langs;
|
||||||
|
return array(
|
||||||
|
array(
|
||||||
|
'constant' => 'SYSLOG_SENTRY_DSN',
|
||||||
|
'name' => $langs->trans('SyslogSentryDSN'),
|
||||||
|
'default' => '',
|
||||||
|
'attr' => 'size="100" placeholder="https://<key>:<secret>@app.getsentry.com/<project>"'
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return if configuration is valid
|
||||||
|
*
|
||||||
|
* @return array Array of errors. Empty array if ok.
|
||||||
|
*/
|
||||||
|
public function checkConfiguration()
|
||||||
|
{
|
||||||
|
global $conf;
|
||||||
|
|
||||||
|
$errors = array();
|
||||||
|
|
||||||
|
$dsn = $conf->global->SYSLOG_SENTRY_DSN;
|
||||||
|
|
||||||
|
try {
|
||||||
|
$client = new Raven_Client(
|
||||||
|
$dsn,
|
||||||
|
array('curl_method' => 'sync')
|
||||||
|
);
|
||||||
|
} catch (InvalidArgumentException $ex) {
|
||||||
|
$errors[] = "ERROR: There was an error parsing your DSN:\n " . $ex->getMessage();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$errors) {
|
||||||
|
// Send test event and check for errors
|
||||||
|
$client->captureMessage('TEST: Sentry syslog configuration check', null, Raven_Client::DEBUG);
|
||||||
|
$last_error = $client->getLastError();
|
||||||
|
if ($last_error) {
|
||||||
|
$errors[] = $last_error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$errors) {
|
||||||
|
// Install handlers
|
||||||
|
$error_handler = new Raven_ErrorHandler($client);
|
||||||
|
$error_handler->registerExceptionHandler();
|
||||||
|
$error_handler->registerErrorHandler();
|
||||||
|
$error_handler->registerShutdownFunction();
|
||||||
|
}
|
||||||
|
|
||||||
|
return $errors;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Export the message
|
||||||
|
*
|
||||||
|
* @param array $content Array containing the info about the message
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function export($content)
|
||||||
|
{
|
||||||
|
global $conf;
|
||||||
|
$dsn = $conf->global->SYSLOG_SENTRY_DSN;
|
||||||
|
$client = new Raven_Client(
|
||||||
|
$dsn,
|
||||||
|
array('curl_method' => 'exec')
|
||||||
|
);
|
||||||
|
|
||||||
|
$client->user_context(array(
|
||||||
|
'username' => ($content['user'] ? $content['user'] : ''),
|
||||||
|
'ip_address' => $content['ip']
|
||||||
|
));
|
||||||
|
|
||||||
|
$client->tags_context(array(
|
||||||
|
'version' => DOL_VERSION
|
||||||
|
));
|
||||||
|
|
||||||
|
$client->registerSeverityMap(array(
|
||||||
|
LOG_EMERG => Raven_Client::FATAL,
|
||||||
|
LOG_ALERT => Raven_Client::FATAL,
|
||||||
|
LOG_CRIT => Raven_Client::ERROR,
|
||||||
|
LOG_ERR => Raven_Client::ERROR,
|
||||||
|
LOG_WARNING => Raven_Client::WARNING,
|
||||||
|
LOG_NOTICE => Raven_Client::WARNING,
|
||||||
|
LOG_INFO => Raven_Client::INFO,
|
||||||
|
LOG_DEBUG => Raven_Client::DEBUG,
|
||||||
|
));
|
||||||
|
|
||||||
|
if (substr($content['message'], 0, 3) === 'sql') {
|
||||||
|
global $db;
|
||||||
|
$query = substr($content['message'], 4, strlen($content['message']));
|
||||||
|
$client->captureQuery(
|
||||||
|
$query,
|
||||||
|
$client->translateSeverity($content['level']),
|
||||||
|
$db->type
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$client->captureMessage(
|
||||||
|
$content['message'],
|
||||||
|
null,
|
||||||
|
$client->translateSeverity($content['level'])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1411,6 +1411,8 @@ SyslogFilename=File name and path
|
|||||||
YouCanUseDOL_DATA_ROOT=You can use DOL_DATA_ROOT/dolibarr.log for a log file in Dolibarr "documents" directory. You can set a different path to store this file.
|
YouCanUseDOL_DATA_ROOT=You can use DOL_DATA_ROOT/dolibarr.log for a log file in Dolibarr "documents" directory. You can set a different path to store this file.
|
||||||
ErrorUnknownSyslogConstant=Constant %s is not a known Syslog constant
|
ErrorUnknownSyslogConstant=Constant %s is not a known Syslog constant
|
||||||
OnlyWindowsLOG_USER=Windows only supports LOG_USER
|
OnlyWindowsLOG_USER=Windows only supports LOG_USER
|
||||||
|
SyslogSentryDSN=Sentry DSN
|
||||||
|
SyslogSentryFromProject=DSN from your Sentry project
|
||||||
##### Donations #####
|
##### Donations #####
|
||||||
DonationsSetup=Donation module setup
|
DonationsSetup=Donation module setup
|
||||||
DonationsReceiptModel=Template of donation receipt
|
DonationsReceiptModel=Template of donation receipt
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user