While investigating unusual WordPress behavior, I needed a way to log all queries to a file for detailed analysis, but stream a subset to the console.
This wp-config parameter
define('SAVEQUERIES', true);
and snippet in functions.php (from Bob Sherron)
// outputs SQL queries to a log add_action('shutdown', 'sql_logger'); function sql_logger() { global $wpdb; $log_file = fopen(ABSPATH.'/sql_log.txt', 'a'); fwrite($log_file, "//////////////////////////////////////////\n\n" . date("F j, Y, g:i:s a")."\n"); foreach($wpdb->queries as $q) { fwrite($log_file, $q[0] . " - ($q[1] s)" . "\n\n"); } fclose($log_file); }
logs all queries to sql_log.txt. On the server, I can then run
tail -f sql_log.txt | grep "WHERE \`option_name\` = 'sidebars_widgets'" | tee sidebars_widgets.txt
Note the backticks around option_name and single quotes around sidebars_widgets.
Breakdown of the individual commands:
tail -f sql_log.txt
Stream the end of sql_log.txt to stdout, as it’s updated
grep "WHERE \`option_name\` = 'sidebars_widgets'"
Filter only queries that update the row I’m interested in
tee sidebars_widgets.txt
Display the filtered lines on the console and write to sidebars_widgets.txt for later review