Skip to content
/ server Public
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions mysql-test/suite/plugins/r/server_audit.result
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions mysql-test/suite/plugins/r/server_audit_buffering.result
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
26 changes: 26 additions & 0 deletions mysql-test/suite/plugins/r/server_audit_timestamp.result
Original file line number Diff line number Diff line change
@@ -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
3 changes: 3 additions & 0 deletions mysql-test/suite/plugins/r/thread_pool_server_audit.result
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down
4 changes: 4 additions & 0 deletions mysql-test/suite/plugins/t/server_audit_timestamp.opt
Original file line number Diff line number Diff line change
@@ -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'
37 changes: 37 additions & 0 deletions mysql-test/suite/plugins/t/server_audit_timestamp.test
Original file line number Diff line number Diff line change
@@ -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;
24 changes: 23 additions & 1 deletion plugin/server_audit/server_audit.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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];

Expand Down Expand Up @@ -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
};
Expand Down Expand Up @@ -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,
Expand Down