1
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
4
* Copyright (C) 2009 Sun Microsystems
5
* Copyright (C) 2010 Mark Atwood
7
* This program is free software; you can redistribute it and/or modify
8
* it under the terms of the GNU General Public License as published by
9
* the Free Software Foundation; version 2 of the License.
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
23
#include <drizzled/gettext.h>
24
#include <drizzled/session.h>
29
#include <sys/types.h>
36
using namespace drizzled;
38
/* stolen from mysys/my_getsystime
39
until the Session has a good utime "now" we can use
40
will have to use this instead */
42
static uint64_t get_microtime()
44
#if defined(HAVE_GETHRTIME)
45
return gethrtime()/1000;
49
/* loop is because gettimeofday may fail on some systems */
50
while (gettimeofday(&t, NULL) != 0) {}
51
newtime= (uint64_t)t.tv_sec * 1000000 + t.tv_usec;
56
Logging_syslog::Logging_syslog()
57
: drizzled::plugin::Logging("Logging_syslog")
59
syslog_facility= WrapSyslog::getFacilityByName(syslog_module::sysvar_facility);
60
if (syslog_facility < 0)
62
errmsg_printf(ERRMSG_LVL_WARN,
63
_("syslog facility \"%s\" not known, using \"local0\""),
64
syslog_module::sysvar_facility);
65
syslog_facility= WrapSyslog::getFacilityByName("local0");
68
syslog_priority= WrapSyslog::getPriorityByName(syslog_module::sysvar_logging_priority);
69
if (syslog_priority < 0)
71
errmsg_printf(ERRMSG_LVL_WARN,
72
_("syslog priority \"%s\" not known, using \"info\""),
73
syslog_module::sysvar_logging_priority);
74
syslog_priority= WrapSyslog::getPriorityByName("info");
77
WrapSyslog::singleton().openlog(syslog_module::sysvar_ident);
81
bool Logging_syslog::post (Session *session)
83
assert(session != NULL);
85
if (syslog_module::sysvar_logging_enable == false)
88
// return if query was not too small
89
if (session->sent_row_count < syslog_module::sysvar_logging_threshold_big_resultset)
91
if (session->examined_row_count < syslog_module::sysvar_logging_threshold_big_examined)
94
/* TODO, the session object should have a "utime command completed"
95
inside itself, so be more accurate, and so this doesnt have to
96
keep calling current_utime, which can be slow */
98
uint64_t t_mark= get_microtime();
100
// return if query was not too slow
101
if ((t_mark - session->start_utime) < syslog_module::sysvar_logging_threshold_slow)
104
/* to avoid trying to printf %s something that is potentially NULL */
106
const char *dbs= session->db.empty() ? "" : session->db.c_str();
108
const char *qys= (! session->getQueryString().empty()) ? session->getQueryString().c_str() : "";
111
qyl= session->getQueryLength();
113
WrapSyslog::singleton()
114
.log(syslog_facility, syslog_priority,
115
"thread_id=%ld query_id=%ld"
119
" t_connect=%lld t_start=%lld t_lock=%lld"
120
" rows_sent=%ld rows_examined=%ld"
121
" tmp_table=%ld total_warn_count=%ld\n",
122
(unsigned long) session->thread_id,
123
(unsigned long) session->getQueryId(),
124
(int) session->db.length(), dbs,
126
(int) command_name[session->command].length,
127
command_name[session->command].str,
128
(unsigned long long) (t_mark - session->getConnectMicroseconds()),
129
(unsigned long long) (t_mark - session->start_utime),
130
(unsigned long long) (t_mark - session->utime_after_lock),
131
(unsigned long) session->sent_row_count,
132
(unsigned long) session->examined_row_count,
133
(unsigned long) session->tmp_table,
134
(unsigned long) session->total_warn_count);