Joomla!-开源天空

2008-09-08
首页 专栏热点 Linux系统管理 mysql-proxy lua脚本 保存错误报警日志


mysql-proxy lua脚本 保存错误报警日志

E-mail

脚本的例程如下:

--[[


   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; version 2 of the License.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

--]]


--[[

version 0.0.2

Changelog: 4-12-2008
*it was filtering only insert statements, now it will log any warnings from any statement


This is the sql you need to run to create the database and table
to log the errors and warnings

CREATE DATABASE `logs`

CREATE TABLE `logs`.`t_log` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `err_num` smallint(6) NOT NULL,
  `err_type` char(10) NOT NULL,
  `err_message` char(255) NOT NULL,
  `problem_query` char(255) NOT NULL,
  PRIMARY KEY (`id`)


Feel free to add more columns or change it around, then come back and publish your changes.

--]]

 


---
-- read_query() can rewrite packets
--
-- You can use read_query() to replace the packet sent by the client and rewrite
-- query as you like
--
-- @param packet the mysql-packet sent by the client
--
-- @return
--   * nothing to pass on the packet as is,
--   * proxy.PROXY_SEND_QUERY to send the queries from the proxy.queries queue
--   * proxy.PROXY_SEND_RESULT to send your own result-set
--
function read_query( packet )
        if string.byte(packet) == proxy.COM_QUERY then
                -- Uncomment the next 3 lines and the
                -- matching end to only store if it is an insert statement
--                local query = packet:sub(2)
--                local cmd = query:match('^(%w+)%s+')
--                if cmd and cmd:lower() == 'insert' then
                        proxy.queries:append(1, packet )
                        -- Here we add the SHOW WARNINGS and also set a user defined variable to hold the
                        -- query that gives you the warning
                        proxy.queries:append(2, string.char(proxy.COM_QUERY) .. "SHOW WARNINGS" )
                        proxy.queries:append(3, string.char(proxy.COM_QUERY) .. "SET @statement ='" .. string.sub(packet, 2).."'" )
--                end    --this is the matching end for the if statement
                return proxy.PROXY_SEND_QUERY
        end
end

--Here we have a function that inserts the error and/or warnings into
--a table
--
function insert_query(err_t, err_n,err_m )
        proxy.queries:append(4, string.char(proxy.COM_QUERY) .. "INSERT INTO logs.t_log(err_num,err_type,err_message, problem_query)" ..
        "VALUES(" .. err_n  ..  "," .. "\"" ..
        err_t .."\"" .. "," .. "\"" ..
        err_m .. "\"" .. "," ..
        "@statement"
        ..  ")")
        return proxy.PROXY_SEND_QUERY
end

--
--


---
-- read_query_result() is called when we receive a query result
-- from the server
--
-- we can analyze the response, drop the response and pass it on (default)
--
-- as we injected a SELECT NOW() above, we don't want to tell the client about it
-- and drop the result with proxy.PROXY_IGNORE_RESULT
--
-- @return
--   * nothing or proxy.PROXY_SEND_RESULT to pass the result-set to the client
--   * proxy.PROXY_IGNORE_RESULT to drop the result-set
--
function read_query_result(inj)
        -- we injected the SHOW WARNINGS with the id = 2
        if (inj.type == 2) then
                for row in inj.resultset.rows do
                       --print("injected query returned: " .. row[1] .. ":" .. row[2] .. ":" ..  row[3] )
-- Log errors and warnings here
                        insert_query(row[1],row[2],row[3])
                end
                return proxy.PROXY_IGNORE_RESULT

        end
end

发表您的文章评论

您的姓名 (昵称)
标题:
评分: 很差一般较好很好
评论:
验证码:
请输入验证码