16 use GravityKit\GravityView\Monolog\Logger as MonologLogger;
88 if ( ! $initialized ) {
89 add_filter(
'gk/foundation/settings/' . FoundationCore::ID .
'/save/before', [ $this,
'save_settings' ] );
90 add_filter(
'gk/foundation/settings', [ $this,
'get_settings' ] );
93 $this->_settings = SettingsFramework::get_instance();
95 $this->_logger_id = $logger_id;
96 $this->_logger_title = $logger_title;
105 $this->_log_path = apply_filters(
'gk/foundation/logger/log-path', $this->_log_path );
109 if ( $logger_handler ) {
110 $this->_logger =
new MonologLogger( $logger_id );
112 $this->_logger->pushHandler( $logger_handler );
128 public static function get_instance( $logger_id =
'', $logger_title =
'' ) {
129 $logger_id = $logger_id ?: self::DEFAULT_LOGGER_ID;
130 $logger_title = $logger_title ?: self::DEFAULT_LOGGER_TITLE;
132 if ( empty( self::$_instances[ $logger_id ] ) ) {
133 self::$_instances[ $logger_id ] =
new self( $logger_id, $logger_title );
136 return self::$_instances[ $logger_id ];
147 $settings = $this->_settings->get_plugin_settings( FoundationCore::ID );
150 if ( class_exists(
'GFLogging' ) && get_option(
'gform_enable_logging' ) ) {
162 error_log(
'Could not initialize file logging for GravityKit:' . $e->getMessage() );
166 case 'query_monitor':
168 case 'chrome_logger':
169 return new ChromePHPHandler();
184 $saved_gk_settings_values = $this->_settings->get_plugin_settings( FoundationCore::ID );
189 if ( ! is_main_site() && empty( $saved_gk_settings_values ) ) {
190 $saved_gk_settings_values = $this->_settings->get_plugin_settings( FoundationCore::ID, get_main_site_id() );
193 $default_logger_settings = [
195 'logger_type' =>
'file',
199 $logger =
Arr::get( $saved_gk_settings_values,
'logger', $default_logger_settings[
'logger'] );
200 $logger_type =
Arr::get( $saved_gk_settings_values,
'logger_type', $default_logger_settings[
'logger_type'] );
202 add_filter(
'gk/foundation/inline-styles',
function ( $styles ) {
206 background-color: rgba(255, 251, 235, var(--tw-bg-opacity))
211 background-color: rgba(239, 246, 255, var(--tw-bg-opacity))
215 --tw-text-opacity: 1;
216 color: rgba(251, 191, 36, var(--tw-text-opacity))
220 --tw-text-opacity: 1;
221 color: rgba(180, 83, 9, var(--tw-text-opacity))
225 --tw-text-opacity: 1;
226 color: rgba(96, 165, 250, var(--tw-text-opacity))
230 --tw-text-opacity: 1;
231 color: rgba(29, 78, 216, var(--tw-text-opacity))
234 .hover\:text-yellow-600:hover {
235 --tw-text-opacity: 1;
236 color: rgba(217, 119, 6, var(--tw-text-opacity))
239 .hover\:text-blue-600:hover {
240 --tw-text-opacity: 1;
241 color: rgba(37, 99, 235, var(--tw-text-opacity))
251 $query_monitor_notice = strtr(
252 esc_html_x(
'You must install [link]Query Monitor[/link] WordPress plugin to use this option.',
'Placeholders inside [] are not to be translated.',
'gk-gravityview' ),
254 '[link]' =>
'<a href="https://wordpress.org/plugins/query-monitor/" class="font-medium underline text-yellow-700 hover:text-yellow-600">',
259 $chrome_logger_tip = strtr(
260 esc_html_x(
'You must install [link]Chrome Logger[/link] browser extension to use this option.',
'Placeholders inside [] are not to be translated.',
'gk-gravityview' ),
262 '[link]' =>
'<a href="https://craig.is/writing/chrome-logger" class="font-medium underline text-yellow-700 hover:text-yellow-600">',
267 $gravity_forms_logger_tip = strtr(
268 esc_html_x(
'Logging is currently handled by [link]Gravity Forms[/link].',
'Placeholders inside [] are not to be translated.',
'gk-gravityview' ),
270 '[link]' =>
'<a href="' . admin_url(
'admin.php?page=gf_settings&subview=gravityformslogging' ) .
'" class="font-medium underline text-yellow-700 hover:text-yellow-600">',
276 <svg
class=
"h-5 w-5 text-yellow-400" xmlns=
"http://www.w3.org/2000/svg" viewBox=
"0 0 20 20" fill=
"currentColor" aria-hidden=
"true">
277 <path fill-rule=
"evenodd" d=
"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z" clip-rule=
"evenodd" />
281 $checkmark_icon = <<<HTML
282 <svg
class=
"h-5 w-5 text-blue-400" xmlns=
"http://www.w3.org/2000/svg" viewBox=
"0 0 20 20" fill=
"currentColor" aria-hidden=
"true">
283 <path fill-rule=
"evenodd" d=
"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule=
"evenodd" />
287 $notice_template = <<<HTML
288 <div
class=
"bg-%color%-50 p-4">
290 <div
class=
"flex-shrink-0">
294 <p
class=
"text-sm text-%color%-700">
302 $logger_settings = [];
304 $_update_gk_settings =
function () use ( &$logger_settings, &$gk_settings, $default_logger_settings ) {
306 Arr::set( $gk_settings,
'gk_foundation.sections.2.settings', array_merge(
307 Arr::get( $gk_settings,
'gk_foundation.sections.2.settings' ),
312 Arr::set( $gk_settings,
'gk_foundation.defaults', array_merge(
313 Arr::get( $gk_settings,
'gk_foundation.defaults' ),
314 $default_logger_settings
318 if ( ! $logger && class_exists(
'GFLogging' ) && get_option(
'gform_enable_logging' ) ) {
319 $logger_settings[] = [
320 'id' =>
'gravity_forms_logger_tip',
321 'html' => strtr( $notice_template, [
322 '%color%' =>
'yellow',
323 '%icon%' => $info_icon,
324 '%notice%' => $gravity_forms_logger_tip
334 $logger_settings = array_merge( $logger_settings, [
337 'type' =>
'checkbox',
338 'title' => esc_html__(
'Enable Logging',
'gk-gravityview' ),
342 'id' =>
'logger_type',
344 'title' => esc_html__(
'Log Type',
'gk-gravityview' ),
345 'description' => esc_html__(
'Where to store log output',
'gk-gravityview' ),
346 'value' => $logger_type,
349 'title' => esc_html__(
'File',
'gk-gravityview' ),
353 'title' => esc_html__(
'Query Monitor',
'gk-gravityview' ),
354 'value' =>
'query_monitor',
357 'title' => esc_html__(
'Chrome Logger',
'gk-gravityview' ),
358 'value' =>
'chrome_logger',
368 'id' =>
'chrome_logger_tip',
369 'html' => strtr( $notice_template, [
370 '%color%' =>
'yellow',
371 '%icon%' => $info_icon,
372 '%notice%' => $chrome_logger_tip
375 'id' =>
'logger_type',
377 'value' =>
'chrome_logger',
379 'excludeFromSave' =>
true,
383 if ( ! class_exists(
'QueryMonitor' ) ) {
384 $logger_settings[] = [
385 'id' =>
'query_monitor_notice',
386 'html' => strtr( $notice_template, [
387 '%color%' =>
'yellow',
388 '%icon%' => $info_icon,
389 '%notice%' => $query_monitor_notice
392 'id' =>
'logger_type',
394 'value' =>
'query_monitor',
396 'excludeFromSave' =>
true,
400 if ( ! $this->_logger ||
'file' !== $logger_type || ! file_exists( $log_file ) ) {
401 $_update_gk_settings();
406 $download_link = sprintf(
'%s/%s/%s',
409 basename( $log_file )
412 $download_notice = strtr(
413 esc_html_x(
'Download [link]log file[/link] ([size] / [date_modified]).',
'Placeholders inside [] are not to be translated.',
'gk-gravityview' ),
415 '[link]' =>
'<a href="' . $download_link .
'" class="font-medium underline text-blue-700 hover:text-blue-600">',
417 '[size]' => size_format( filesize( $log_file ), 2 ),
418 '[date_modified]' => date_i18n(
'Y-m-d @ H:i:s', filemtime( $log_file ) ),
422 $logger_settings[] = [
424 'html' => strtr( $notice_template, [
426 '%icon%' => $checkmark_icon,
427 '%notice%' => $download_notice
430 'id' =>
'logger_type',
436 $_update_gk_settings();
452 return $new_settings;
455 if ( ! empty( $new_settings[
'logger'] ) &&
'file' === $new_settings[
'logger_type'] ) {
456 return $new_settings;
459 $this->_logger->getHandlers()[0]->close();
463 return $new_settings;
474 return sprintf(
'%s/%s/gravitykit-%s.log', WP_CONTENT_DIR, $this->_log_path, $hash );
488 if ( ! $this->_logger instanceof MonologLogger ) {
499 $log_heartbeat = apply_filters(
'gk/foundation/logger/allow-heartbeat-requests',
false );
501 if ( isset( $_REQUEST[
'action'] ) &&
'heartbeat' == $_REQUEST[
'action'] && ! $log_heartbeat ) {
505 if ( CoreHelpers::is_callable_class_method( [ $this->_logger,
$name ] ) ) {
506 return call_user_func_array( [ $this->_logger,
$name ], $arguments );
static set(&$array, $key, $value)
{}
get_settings( $gk_settings)
Returns UI settings for the logger.
static get( $array, $key, $default=null)
{}
get_logger_handler()
Returns handler that will process log messages.
get_log_file()
Returns log file name with path.
save_settings( $new_settings)
Deletes log files when UI savings are saved and the logger type is no longer "file".
static get_instance( $secret_key='')
Returns class instance.
const DEFAULT_LOGGER_TITLE
Handler for the Query Monitor plugin.
__construct( $logger_id, $logger_title)
Class constructor.
__call( $name, array $arguments=[])
Magic method to access Monolog's logger class methods.
Logging framework for GravityKit.
static get_instance( $logger_id='', $logger_title='')
Returns class instance.