SentryIntegration: send logged errors (fatal only by default)
This commit is contained in:
parent
7693ea44ee
commit
e9fb4cf504
2 changed files with 65 additions and 13 deletions
34
src/Log.php
34
src/Log.php
|
@ -168,12 +168,6 @@ class Log {
|
||||||
App::get('log.level', 'WARNING', 'string'):
|
App::get('log.level', 'WARNING', 'string'):
|
||||||
'WARNING'
|
'WARNING'
|
||||||
);
|
);
|
||||||
if (self :: $levels[$level] < self :: $levels[self :: $level]) return true;
|
|
||||||
if(self :: $filepath && is_null(self :: $file_fd)) {
|
|
||||||
self :: $file_fd = fopen(self :: $filepath, 'a');
|
|
||||||
if (self :: $file_fd === false)
|
|
||||||
self :: error('Fail to open log file (%s)', self :: $filepath);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extra arguments passed, format message using sprintf
|
// Extra arguments passed, format message using sprintf
|
||||||
if ($extra_args) {
|
if ($extra_args) {
|
||||||
|
@ -183,6 +177,15 @@ class Log {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SentryIntegration :: on_logged_message($level, $message);
|
||||||
|
|
||||||
|
if (!self :: check_message_level($level)) return true;
|
||||||
|
if(self :: $filepath && is_null(self :: $file_fd)) {
|
||||||
|
self :: $file_fd = fopen(self :: $filepath, 'a');
|
||||||
|
if (self :: $file_fd === false)
|
||||||
|
self :: error('Fail to open log file (%s)', self :: $filepath);
|
||||||
|
}
|
||||||
|
|
||||||
if (php_sapi_name() == "cli") {
|
if (php_sapi_name() == "cli") {
|
||||||
$msg = implode(' - ', array(
|
$msg = implode(' - ', array(
|
||||||
date('Y/m/d H:i:s'),
|
date('Y/m/d H:i:s'),
|
||||||
|
@ -361,6 +364,25 @@ class Log {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check specified log level exists
|
||||||
|
* @param mixed $level
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public static function check_level($level) {
|
||||||
|
return array_key_exists($level, self :: $levels);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check specified level is included by configured level
|
||||||
|
* @param string $level
|
||||||
|
* @param string $configured_level
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public static function check_message_level($level, $configured_level=null) {
|
||||||
|
return self :: $levels[$level] >= self :: $levels[($configured_level ?? self :: $level)];
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*******************************************************************************
|
*******************************************************************************
|
||||||
* Handle exception logging
|
* Handle exception logging
|
||||||
|
|
|
@ -20,6 +20,12 @@ class SentryIntegration {
|
||||||
*/
|
*/
|
||||||
protected static $php_error_types;
|
protected static $php_error_types;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Log level
|
||||||
|
* @var string|null
|
||||||
|
*/
|
||||||
|
protected static $log_level = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialization
|
* Initialization
|
||||||
* @return void
|
* @return void
|
||||||
|
@ -31,14 +37,15 @@ class SentryIntegration {
|
||||||
// Set config default values
|
// Set config default values
|
||||||
App :: set_default(
|
App :: set_default(
|
||||||
'sentry',
|
'sentry',
|
||||||
array(
|
[
|
||||||
'dsn' => null,
|
'dsn' => null,
|
||||||
'traces_sample_rate' => 0.2,
|
'traces_sample_rate' => 0.2,
|
||||||
'php_error_types' => array(
|
'php_error_types' => [
|
||||||
'E_ERROR', 'E_PARSE', 'E_CORE_ERROR', 'E_COMPILE_ERROR', 'E_USER_ERROR',
|
'E_ERROR', 'E_PARSE', 'E_CORE_ERROR', 'E_COMPILE_ERROR', 'E_USER_ERROR',
|
||||||
'E_RECOVERABLE_ERROR', 'E_DEPRECATED',
|
'E_RECOVERABLE_ERROR', 'E_DEPRECATED',
|
||||||
),
|
],
|
||||||
)
|
'log_level' => 'FATAL',
|
||||||
|
]
|
||||||
);
|
);
|
||||||
|
|
||||||
self :: $dsn = App::get('sentry.dsn');
|
self :: $dsn = App::get('sentry.dsn');
|
||||||
|
@ -47,6 +54,17 @@ class SentryIntegration {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self :: $log_level = App::get('sentry.log_level', null, 'string');
|
||||||
|
if (!Log::check_level(self :: $log_level)) {
|
||||||
|
$bad_level = self :: $log_level;
|
||||||
|
self :: $log_level = App::get_default("sentry.log_level");
|
||||||
|
Log::warning(
|
||||||
|
"Invalid log level configured for Sentry (%s), use default (%s)",
|
||||||
|
$bad_level,
|
||||||
|
self :: $log_level
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
\Sentry\init([
|
\Sentry\init([
|
||||||
'dsn' => self :: $dsn,
|
'dsn' => self :: $dsn,
|
||||||
'traces_sample_rate' => App::get('sentry.traces_sample_rate', null, 'float'),
|
'traces_sample_rate' => App::get('sentry.traces_sample_rate', null, 'float'),
|
||||||
|
@ -59,7 +77,7 @@ class SentryIntegration {
|
||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
|
|
||||||
self :: $php_error_types = array();
|
self :: $php_error_types = [];
|
||||||
foreach(App::get('sentry.php_error_types', null, 'array') as $php_error_type) {
|
foreach(App::get('sentry.php_error_types', null, 'array') as $php_error_type) {
|
||||||
if (is_string($php_error_type) && defined($php_error_type))
|
if (is_string($php_error_type) && defined($php_error_type))
|
||||||
$php_error_type = constant($php_error_type);
|
$php_error_type = constant($php_error_type);
|
||||||
|
@ -68,7 +86,7 @@ class SentryIntegration {
|
||||||
self :: $php_error_types[] = $php_error_type;
|
self :: $php_error_types[] = $php_error_type;
|
||||||
}
|
}
|
||||||
set_error_handler(
|
set_error_handler(
|
||||||
array('EesyPHP\\SentryIntegration', 'on_php_error'),
|
[static :: class, 'on_php_error'],
|
||||||
E_ALL
|
E_ALL
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -89,7 +107,7 @@ class SentryIntegration {
|
||||||
if ($extra_args) {
|
if ($extra_args) {
|
||||||
$message = call_user_func_array(
|
$message = call_user_func_array(
|
||||||
'sprintf',
|
'sprintf',
|
||||||
array_merge(array($message), $extra_args)
|
array_merge([$message], $extra_args)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
Log :: debug('Error logged in Sentry');
|
Log :: debug('Error logged in Sentry');
|
||||||
|
@ -118,6 +136,18 @@ class SentryIntegration {
|
||||||
);
|
);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Method to run on logged message (directly called by Log::log())
|
||||||
|
* Important: This method can't log anything to avoid log loop.
|
||||||
|
* @param string $level
|
||||||
|
* @param string $message
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function on_logged_message($level, $message) {
|
||||||
|
if (self :: $dsn && Log::check_message_level($level, self :: $log_level))
|
||||||
|
\Sentry\captureMessage($message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# vim: tabstop=2 shiftwidth=2 softtabstop=2 expandtab
|
# vim: tabstop=2 shiftwidth=2 softtabstop=2 expandtab
|
||||||
|
|
Loading…
Reference in a new issue