diff --git a/mysql-test/suite/plugins/r/server_audit.result b/mysql-test/suite/plugins/r/server_audit.result index 7160789b8e6fb..34a59494929a3 100644 --- a/mysql-test/suite/plugins/r/server_audit.result +++ b/mysql-test/suite/plugins/r/server_audit.result @@ -18,6 +18,7 @@ server_audit_syslog_facility LOG_USER server_audit_syslog_ident mysql-server_auditing server_audit_syslog_info server_audit_syslog_priority LOG_INFO +server_audit_timestamp_format set global server_audit_file_path=null; set global server_audit_incl_users=null; set global server_audit_file_path='server_audit.log'; @@ -104,6 +105,7 @@ server_audit_syslog_facility LOG_USER server_audit_syslog_ident mysql-server_auditing server_audit_syslog_info server_audit_syslog_priority LOG_INFO +server_audit_timestamp_format set global server_audit_mode=1; set global server_audit_events=''; create database sa_db; @@ -336,6 +338,7 @@ server_audit_syslog_facility LOG_USER server_audit_syslog_ident mysql-server_auditing server_audit_syslog_info server_audit_syslog_priority LOG_INFO +server_audit_timestamp_format uninstall plugin server_audit; Warnings: Warning 1620 Plugin is busy and will be uninstalled on shutdown diff --git a/mysql-test/suite/plugins/r/server_audit_buffering.result b/mysql-test/suite/plugins/r/server_audit_buffering.result index 9d4c27a726234..580875d9d6c8a 100644 --- a/mysql-test/suite/plugins/r/server_audit_buffering.result +++ b/mysql-test/suite/plugins/r/server_audit_buffering.result @@ -19,6 +19,7 @@ server_audit_syslog_facility LOG_USER server_audit_syslog_ident mysql-server_auditing server_audit_syslog_info server_audit_syslog_priority LOG_INFO +server_audit_timestamp_format set global server_audit_logging=on; set global server_audit_sync_log_file=on; Line count in file: 52 diff --git a/mysql-test/suite/plugins/r/server_audit_timestamp.result b/mysql-test/suite/plugins/r/server_audit_timestamp.result new file mode 100644 index 0000000000000..c20e69ccd0f23 --- /dev/null +++ b/mysql-test/suite/plugins/r/server_audit_timestamp.result @@ -0,0 +1,26 @@ +set global server_audit_logging=on; +select 1; +1 +1 +set global server_audit_timestamp_format='CUSTOM-DATE %Y-%m-%d'; +select 2; +2 +2 +set global server_audit_timestamp_format='CUSTOM-TZ %H:%M:%S %z'; +select 3; +3 +3 +set global server_audit_timestamp_format=''; +select 4; +4 +4 +set global server_audit_logging=off; +TIMESTAMP,HOSTNAME,root,localhost,ID,ID,QUERY,test,'set global server_audit_logging=on',0 +TIMESTAMP,HOSTNAME,root,localhost,ID,ID,QUERY,test,'select 1',0 +CUSTOM-DATE TIMESTAMP,HOSTNAME,root,localhost,ID,ID,QUERY,test,'set global server_audit_timestamp_format=\'CUSTOM-DATE %Y-%m-%d\'',0 +CUSTOM-DATE TIMESTAMP,HOSTNAME,root,localhost,ID,ID,QUERY,test,'select 2',0 +CUSTOM-TZ TIMESTAMP,HOSTNAME,root,localhost,ID,ID,QUERY,test,'set global server_audit_timestamp_format=\'CUSTOM-TZ %H:%M:%S %z\'',0 +CUSTOM-TZ TIMESTAMP,HOSTNAME,root,localhost,ID,ID,QUERY,test,'select 3',0 +TIMESTAMP,HOSTNAME,root,localhost,ID,ID,QUERY,test,'set global server_audit_timestamp_format=\'\'',0 +TIMESTAMP,HOSTNAME,root,localhost,ID,ID,QUERY,test,'select 4',0 +TIMESTAMP,HOSTNAME,root,localhost,ID,ID,QUERY,test,'set global server_audit_logging=off',0 diff --git a/mysql-test/suite/plugins/r/thread_pool_server_audit.result b/mysql-test/suite/plugins/r/thread_pool_server_audit.result index 3b6d7d870010a..42658750b9bfa 100644 --- a/mysql-test/suite/plugins/r/thread_pool_server_audit.result +++ b/mysql-test/suite/plugins/r/thread_pool_server_audit.result @@ -18,6 +18,7 @@ server_audit_syslog_facility LOG_USER server_audit_syslog_ident mysql-server_auditing server_audit_syslog_info server_audit_syslog_priority LOG_INFO +server_audit_timestamp_format set global server_audit_file_path=null; set global server_audit_incl_users=null; set global server_audit_file_path='server_audit.log'; @@ -89,6 +90,7 @@ server_audit_syslog_facility LOG_USER server_audit_syslog_ident mysql-server_auditing server_audit_syslog_info server_audit_syslog_priority LOG_INFO +server_audit_timestamp_format set global server_audit_mode=1; set global server_audit_events=''; create database sa_db; @@ -242,6 +244,7 @@ server_audit_syslog_facility LOG_USER server_audit_syslog_ident mysql-server_auditing server_audit_syslog_info server_audit_syslog_priority LOG_INFO +server_audit_timestamp_format uninstall plugin server_audit; Warnings: Warning 1620 Plugin is busy and will be uninstalled on shutdown diff --git a/mysql-test/suite/plugins/t/server_audit_timestamp.opt b/mysql-test/suite/plugins/t/server_audit_timestamp.opt new file mode 100644 index 0000000000000..f42cc19b15a0e --- /dev/null +++ b/mysql-test/suite/plugins/t/server_audit_timestamp.opt @@ -0,0 +1,4 @@ +--plugin-load-add=server_audit +--server_audit_file_path='server_audit_timestamp.log' +--server_audit_output_type=file +--server_audit_events='query' diff --git a/mysql-test/suite/plugins/t/server_audit_timestamp.test b/mysql-test/suite/plugins/t/server_audit_timestamp.test new file mode 100644 index 0000000000000..7342a62702dcd --- /dev/null +++ b/mysql-test/suite/plugins/t/server_audit_timestamp.test @@ -0,0 +1,37 @@ +--source include/not_embedded.inc + +if (!$SERVER_AUDIT_SO) { + skip No SERVER_AUDIT plugin; +} + +--disable_ps_protocol +--disable_view_protocol + +# The plugin is loaded via .opt file +let $MYSQLD_DATADIR= `SELECT @@datadir`; +let SEARCH_FILE= $MYSQLD_DATADIR/server_audit_timestamp.log; + +set global server_audit_logging=on; + +# Default format +select 1; + +# Custom format 1: Just date +set global server_audit_timestamp_format='CUSTOM-DATE %Y-%m-%d'; +select 2; + +# Custom format 2: Including timezone (if supported by system strftime) +set global server_audit_timestamp_format='CUSTOM-TZ %H:%M:%S %z'; +select 3; + +# Revert to default +set global server_audit_timestamp_format=''; +select 4; + +set global server_audit_logging=off; + +# We use replace_regex to mask the actual volatile parts but keep our prefixes +--replace_regex /\d{4}\d{2}\d{2} \d{2}:\d{2}:\d{2}/TIMESTAMP/ /CUSTOM-DATE \d{4}-\d{2}-\d{2}/CUSTOM-DATE TIMESTAMP/ /CUSTOM-TZ \d{2}:\d{2}:\d{2} [+-]\d{4}/CUSTOM-TZ TIMESTAMP/ /CUSTOM-TZ \d{2}:\d{2}:\d{2}/CUSTOM-TZ TIMESTAMP/ /,[^,]+,root,(localhost|localhost:[0-9]+),(\d+),(\d+),/,HOSTNAME,root,localhost,ID,ID,/ +cat_file $SEARCH_FILE; + +remove_file $SEARCH_FILE; diff --git a/plugin/server_audit/server_audit.cc b/plugin/server_audit/server_audit.cc index 54c8c3f8dc9be..e3546e554e15f 100644 --- a/plugin/server_audit/server_audit.cc +++ b/plugin/server_audit/server_audit.cc @@ -103,7 +103,7 @@ static void closelog() {} const char *(*thd_priv_host_ptr)(MYSQL_THD thd, size_t *length); static char *incl_users, *excl_users, - *file_path, *syslog_info; + *file_path, *syslog_info, *timestamp_format; static char path_buffer[FN_REFLEN]; static unsigned int mode; static ulong output_type; @@ -269,6 +269,10 @@ static MYSQL_SYSVAR_STR(syslog_info, syslog_info, static MYSQL_SYSVAR_UINT(query_log_limit, query_log_limit, PLUGIN_VAR_OPCMDARG, "Limit on the length of the query string in a record", NULL, NULL, 1024, 0, 0x7FFFFFFF, 1); +static MYSQL_SYSVAR_STR(timestamp_format, timestamp_format, + PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_MEMALLOC, + "The format string the strftime() routine applies with its format argument", + NULL, NULL, ""); char locinfo_ini_value[sizeof(struct connection_info)+4]; @@ -353,6 +357,7 @@ static struct st_mysql_sys_var* vars[] = { MYSQL_SYSVAR(syslog_facility), MYSQL_SYSVAR(syslog_priority), MYSQL_SYSVAR(query_log_limit), + MYSQL_SYSVAR(timestamp_format), MYSQL_SYSVAR(loc_info), NULL }; @@ -1183,6 +1188,23 @@ static size_t log_header(char *message, size_t message_len, connection_id, query_id, operation); (void) localtime_r(ts, &tm_time); + if (timestamp_format && timestamp_format[0]) + { + char ts_buffer[128]; + size_t ts_len= strftime(ts_buffer, sizeof(ts_buffer), + timestamp_format, &tm_time); + if (ts_len) + { + return my_snprintf(message, message_len, + "%s,%.*s,%.*s,%.*s%s,%d,%lld,%s", + ts_buffer, + (int) serverhost_len, serverhost, + username_len, username, + host_len, host, port_str, + connection_id, query_id, operation); + } + } + return my_snprintf(message, message_len, "%04d%02d%02d %02d:%02d:%02d,%.*s,%.*s,%.*s%s,%d,%lld,%s", tm_time.tm_year+1900, tm_time.tm_mon+1, tm_time.tm_mday,