--echo # --echo # WL#9323: Logging services: Improved error logging in 8.0 --echo # # # this test uses the debug mode where we pipe all error logging # to stderr, so log_sink_test (square brackets) and log_sink_json # (curly braces) are interleaved below. log_components_split # tests the "production setup" where different formats go to # different files. # --source include/have_debug.inc --source include/have_log_component.inc --source include/xplugin_wait_for_interfaces.inc let GREP_START=`SELECT DATE_FORMAT(CONVERT_TZ(SYSDATE(6),'SYSTEM','UTC'),'%Y%m%d%H%i%s%f');`; SET @orig_log_error_verbosity= @@GLOBAL.log_error_verbosity; SET @@global.log_error_verbosity=3; let $log_error_= `SELECT @@GLOBAL.log_error`; if($log_error_ == "stderr") { let $log_error_ = $MYSQLTEST_VARDIR/log/mysqld.1.err; } FLUSH LOGS; # Send parse-trace to error log; first one with a current timestamp # to compare against our GREP_START defined above. SET @@session.debug="+d,parser_stmt_to_error_log"; # Now normalize timestamp and thread_ID on all following lines, # for less hassle with --regex_replace in test files. Once # WL#9651 goes live, we can use that to achieve the same thing. SET @@session.debug="+d,log_error_normalize"; SELECT @@global.log_error_services; --echo ## WL#9651 # SET @@global.log_error_filter_rules='+source_line? delete_field. +thread? delete_field. +user? delete_field. +host? delete_field. +query_id? delete_field. +time? delete_field. +_pid? delete_field. +_platform? delete_field. +_client_version? delete_field. +_os? delete_field. +err_code? delete_field.'; # --echo SELECT "*** SWITCHING ERROR LOG TO JSON ***"; INSTALL COMPONENT "file://component_log_sink_json"; SET @@global.log_error_services="log_filter_internal; log_sink_json;"; --echo # may not start with a delimiter --error ER_WRONG_VALUE_FOR_VAR SET @@global.log_error_services=";log_sink_internal"; SHOW WARNINGS; --echo # may not end on a filter --error ER_WRONG_VALUE_FOR_VAR SET @@global.log_error_services="log_sink_internal; log_filter_internal"; SHOW WARNINGS; --echo # may not mix delimiters --error ER_WRONG_VALUE_FOR_VAR SET @@global.log_error_services="log_filter_internal;,log_sink_internal"; SHOW WARNINGS; --echo # whitespace alone is no valid delimiter --error ER_WRONG_VALUE_FOR_VAR SET @@global.log_error_services="log_filter_internal log_sink_internal"; SHOW WARNINGS; --echo # unknown component --error ER_WRONG_VALUE_FOR_VAR SET @@global.log_error_services="azundris"; SHOW WARNINGS; --echo # disallowed. this component exists, but only for internal use during --echo # start-up; it may not be set by the user --error ER_WRONG_VALUE_FOR_VAR SET @@global.log_error_services="log_sink_buffer"; SHOW WARNINGS; SELECT "logging as JSON"; SET @@global.log_error_services="log_filter_internal, log_sink_internal,"; UNINSTALL COMPONENT "file://component_log_sink_json"; --echo SELECT "*** SWITCHING ERROR LOG TO TRAD AND JSON ***"; INSTALL COMPONENT "file://component_log_sink_json"; SET @@global.log_error_services="log_filter_internal, log_sink_internal, log_sink_json"; SELECT "logging as traditional MySQL error log and as JSON"; SET @@global.log_error_services="log_filter_internal; log_sink_internal"; UNINSTALL COMPONENT "file://component_log_sink_json"; --echo SELECT "*** TRYING TO LOG THINGS FROM EXTERNAL SERVICE ***"; --echo # NB: log_sink_test must self-disable its sink after one line. INSTALL COMPONENT "file://component_log_sink_json"; INSTALL COMPONENT "file://component_log_sink_test"; SET @@global.log_error_services="log_filter_internal; log_sink_test; log_sink_json"; SELECT "logging as traditional MySQL error log and as JSON"; --echo # Force a call to variable-checking in all loaded log-services # currently nothing is loaded that can handle this, so we'll fail on update --error ER_UNKNOWN_SYSTEM_VARIABLE SET @@global.log_error_filter_rules= DEFAULT; --echo # Reload logging services FLUSH ERROR LOGS; --echo # Should not be able to uninstall as it's in use. --error ER_COMPONENTS_UNLOAD_CANT_UNREGISTER_SERVICE UNINSTALL COMPONENT "file://component_log_sink_test"; --echo # Remove from active set: SET @@global.log_error_services="log_filter_internal; log_sink_internal"; --echo # Now we can uninstall. UNINSTALL COMPONENT "file://component_log_sink_test"; UNINSTALL COMPONENT "file://component_log_sink_json"; --echo --echo # cleanup SET @@session.debug="-d,parser_stmt_to_error_log"; SET @@session.debug="-d,log_error_normalize"; SET @@global.log_error_verbosity= @orig_log_error_verbosity; ## WL#9651 # SET @@global.log_error_filter_rules=@save_filters; FLUSH ERROR LOGS; --echo --echo ### --echo ### error log file --echo ### --echo let GREP_FILE=$log_error_; perl; use strict; use File::stat; my $file= $ENV{'GREP_FILE'} or die("grep file not set"); my $pattern="^20"; my $stime= $ENV{'GREP_START'}; open(FILE, "$file") or die("Unable to open $file: $!"); while () { my $line = $_; my $ts = 0; if ($stime == 0) { print "$line"; } elsif ($line =~ /$pattern/) { $line =~ /([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])T([0-9][0-9]):([0-9][0-9]):([0-9][0-9])\.([0-9][0-9][0-9][0-9][0-9][0-9])[-+Z][0-9:]* *[0-9]* *?(\[.*)/; $ts=$1.$2.$3.$4.$5.$6.$7; if ($ts >= $stime) { $stime= 0; } } } close(FILE); EOF --echo --echo ### --echo ### done --echo ###