~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to plugin/syslog/logging.cc

  • Committer: Monty Taylor
  • Date: 2010-09-26 21:24:15 UTC
  • mto: (1796.1.2 build)
  • mto: This revision was merged to the branch mainline in revision 1797.
  • Revision ID: mordred@inaugust.com-20100926212415-5fn3p3q75pgiei7r
Moved protocol doc into the docs.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
2
 *  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
3
3
 *
4
 
 *  Copyright (C) 2009 Sun Microsystems, Inc.
 
4
 *  Copyright (C) 2009 Sun Microsystems
5
5
 *  Copyright (C) 2010 Mark Atwood
6
6
 *
7
7
 *  This program is free software; you can redistribute it and/or modify
20
20
 
21
21
#include "config.h"
22
22
 
 
23
#include <drizzled/gettext.h>
 
24
#include <drizzled/session.h>
 
25
 
23
26
#include <stdarg.h>
24
27
#include <limits.h>
 
28
#include <sys/time.h>
25
29
#include <sys/types.h>
26
30
#include <sys/stat.h>
27
31
#include <fcntl.h>
28
32
 
29
 
#include <boost/date_time.hpp>
30
 
 
31
 
#include <drizzled/gettext.h>
32
 
#include <drizzled/session.h>
33
 
 
34
33
#include "logging.h"
35
34
#include "wrap.h"
36
35
 
37
 
namespace drizzle_plugin
38
 
{
39
 
 
40
 
logging::Syslog::Syslog(const std::string &facility,
41
 
                        const std::string &priority,
42
 
                        uint64_t threshold_slow,
43
 
                        uint64_t threshold_big_resultset,
44
 
                        uint64_t threshold_big_examined) :
45
 
  drizzled::plugin::Logging("Syslog Logging"),
46
 
  _facility(WrapSyslog::getFacilityByName(facility.c_str())),
47
 
  _priority(WrapSyslog::getPriorityByName(priority.c_str())),
48
 
  _threshold_slow(threshold_slow),
49
 
  _threshold_big_resultset(threshold_big_resultset),
50
 
  _threshold_big_examined(threshold_big_examined)
51
 
{
52
 
  if (_facility < 0)
53
 
  {
54
 
    drizzled::errmsg_printf(ERRMSG_LVL_WARN,
55
 
                            _("syslog facility \"%s\" not known, using \"local0\""),
56
 
                            facility.c_str());
57
 
    _facility= WrapSyslog::getFacilityByName("local0");
58
 
  }
59
 
 
60
 
  if (_priority < 0)
61
 
  {
62
 
    drizzled::errmsg_printf(ERRMSG_LVL_WARN,
63
 
                            _("syslog priority \"%s\" not known, using \"info\""),
64
 
                            priority.c_str());
65
 
    _priority= WrapSyslog::getPriorityByName("info");
66
 
  }
67
 
}
68
 
 
69
 
 
70
 
bool logging::Syslog::post(drizzled::Session *session)
 
36
using namespace drizzled;
 
37
 
 
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 */
 
41
 
 
42
static uint64_t get_microtime()
 
43
{
 
44
#if defined(HAVE_GETHRTIME)
 
45
  return gethrtime()/1000;
 
46
#else
 
47
  uint64_t newtime;
 
48
  struct timeval t;
 
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;
 
52
  return newtime;
 
53
#endif
 
54
}
 
55
 
 
56
Logging_syslog::Logging_syslog()
 
57
  : drizzled::plugin::Logging("Logging_syslog")
 
58
{
 
59
  syslog_facility= WrapSyslog::getFacilityByName(syslog_module::sysvar_facility);
 
60
  if (syslog_facility < 0)
 
61
  {
 
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");
 
66
  }
 
67
 
 
68
  syslog_priority= WrapSyslog::getPriorityByName(syslog_module::sysvar_logging_priority);
 
69
  if (syslog_priority < 0)
 
70
  {
 
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");
 
75
  }
 
76
 
 
77
  WrapSyslog::singleton().openlog(syslog_module::sysvar_ident);
 
78
}
 
79
 
 
80
 
 
81
bool Logging_syslog::post (Session *session)
71
82
{
72
83
  assert(session != NULL);
73
84
 
 
85
  if (syslog_module::sysvar_logging_enable == false)
 
86
    return false;
 
87
  
74
88
  // return if query was not too small
75
 
  if (session->sent_row_count < _threshold_big_resultset)
 
89
  if (session->sent_row_count < syslog_module::sysvar_logging_threshold_big_resultset)
76
90
    return false;
77
 
  if (session->examined_row_count < _threshold_big_examined)
 
91
  if (session->examined_row_count < syslog_module::sysvar_logging_threshold_big_examined)
78
92
    return false;
79
93
  
80
94
  /* TODO, the session object should have a "utime command completed"
81
95
     inside itself, so be more accurate, and so this doesnt have to
82
96
     keep calling current_utime, which can be slow */
83
97
  
84
 
  boost::posix_time::ptime mytime(boost::posix_time::microsec_clock::local_time());
85
 
  boost::posix_time::ptime epoch(boost::gregorian::date(1970,1,1));
86
 
  uint64_t t_mark= (mytime-epoch).total_microseconds();
 
98
  uint64_t t_mark= get_microtime();
87
99
 
88
100
  // return if query was not too slow
89
 
  if ((t_mark - session->start_utime) < _threshold_slow)
 
101
  if ((t_mark - session->start_utime) < syslog_module::sysvar_logging_threshold_slow)
90
102
    return false;
91
103
  
92
 
  drizzled::Session::QueryString query_string(session->getQueryString());
93
 
  drizzled::util::string::const_shared_ptr schema(session->schema());
 
104
  /* to avoid trying to printf %s something that is potentially NULL */
 
105
  
 
106
  const char *dbs= session->db.empty() ? "" : session->db.c_str();
 
107
  
 
108
  const char *qys= (! session->getQueryString().empty()) ? session->getQueryString().c_str() : "";
 
109
  int qyl= 0;
 
110
  if (qys)
 
111
    qyl= session->getQueryLength();
94
112
 
95
113
  WrapSyslog::singleton()
96
 
    .log(_facility, _priority,
 
114
    .log(syslog_facility, syslog_priority,
97
115
         "thread_id=%ld query_id=%ld"
98
116
         " db=\"%.*s\""
99
117
         " query=\"%.*s\""
103
121
         " tmp_table=%ld total_warn_count=%ld\n",
104
122
         (unsigned long) session->thread_id,
105
123
         (unsigned long) session->getQueryId(),
106
 
         (int) schema->size(),
107
 
         schema->empty() ? "" : schema->c_str(),
108
 
         (int) query_string->length(), 
109
 
         query_string->empty() ? "" : query_string->c_str(),
110
 
         (int) drizzled::command_name[session->command].length,
111
 
         drizzled::command_name[session->command].str,
 
124
         (int) session->db.length(), dbs,
 
125
         qyl, qys,
 
126
         (int) command_name[session->command].length,
 
127
         command_name[session->command].str,
112
128
         (unsigned long long) (t_mark - session->getConnectMicroseconds()),
113
129
         (unsigned long long) (t_mark - session->start_utime),
114
130
         (unsigned long long) (t_mark - session->utime_after_lock),
119
135
  
120
136
    return false;
121
137
}
122
 
 
123
 
} /* namespsace drizzle_plugin */