当前位置:首页 > 开发 > 系统架构 > 架构 > 正文

log_lua记录行为日志

发表于: 2014-09-22   作者:cywhoyi   来源:转载   浏览次数:
摘要: 上篇讲到ngx_lua模块的安装,既然站在巨人的肩膀上,那么接下来就是把日志放入到文件中 用的lua的脚本语言,IDE工具是mac  Sublime Text 3,以及windows Lua Editor local cjson = require "cjson" local logging = {} local function incr(dict

上篇讲到ngx_lua模块的安装,既然站在巨人的肩膀上,那么接下来就是把日志放入到文件中

用的lua的脚本语言,IDE工具是mac  Sublime Text 3,以及windows Lua Editor

local cjson  = require "cjson"

local logging = {}

local function incr(dict, key, increment)
    increment = increment or 1
    local newval, err = dict:incr(key, increment)
    
    if not newval or err then
      dict:add(key, increment)
      newval = increment
    end
    
    return newval
end

function logging.log_response_time(dict, value)
    local sum_key = "request_time-sum"
    local count_key = "request_time-count"
    local start_time_key = "request_time-start_time"
    local request_time_key = value
    
    dict:add(start_time_key, ngx.now())
    
    incr(dict, sum_key, value)
    incr(dict, count_key)
    incr(dict, request_time_key)
    
    return true
end

function logging.log_response_status(dict)
    local response_code = ngx.var.status or ""
    local response_key = "response_code-"..response_code
    
    incr(dict, response_key)
    
    return true
end

function logging.get_timing_values(dict)
    local keys = dict:get_keys(0)
    local response_times = {}
    
    for k,v in pairs(keys) do
        if tonumber(v) then
            val = dict:get(v)
            response_times[#response_times] = {response_time = v, count = val}
        end
    end
    
    dict:flush_all()
    
    return cjson.encode(response_times)
end

function logging.get_timing_summary(dict)
    local sum_key = "request_time-sum"
    local count_key = "request_time-count"
    local start_time_key = "request_time-start_time"
    local keys = dict:get_keys(0)
    local start_time = dict:get(start_time_key)
    local count = dict:get(count_key) or 0
    local sum = dict:get(sum_key) or 0
    local mean = 0
    local stdevsum = 0
    local qps = 0
    
    if count > 0 then mean = sum / count end
    
    for k,v in pairs(keys) do
        if tonumber(v) then
            val = dict:get(v)
            maxval = maxval and (maxval > val and maxval or val) or val
            if oldmax ~= maxval then mode = v modecount = val end
            oldmax = maxval
            mintime = mintime and (mintime < v and mintime or v) or v
            maxtime = maxtime and (maxtime > v and maxtime or v) or v
            stdevsum = stdevsum + (mean - v)^2
        end
    end
    
    local stdev = math.sqrt(stdevsum/count)
    
    local elapsed_time = 0
    
    if start_time then
        elapsed_time = ngx.now() - start_time
    end
    
    if elapsed_time > 0 then
        qps = count / elapsed_time
    end
    
    dict:flush_all()
    
    local summary = {count=count,
                     qps=qps,
                     mean=mean,
                     mode=mode,
                     modecount=modecount,
                     mintime=mintime,
                     maxtime=maxtime,
                     stdev=stdev,
                     elapsed_time=elapsed_time}
    
    return cjson.encode(summary)
end

function logging.get_response_summary(dict)
    local response_key_prefix = "response_code-"
    local response_codes = {}
    local keys = dict:get_keys(0)
    
    for k,v in pairs(keys) do
        if v:find(response_key_prefix, 1, true) then
            val = dict:get(v)
            response_codes[#response_codes] = {response_code = v, count = val}
        end
    end
    
    return cjson.encode(response_codes)
end

return logging

 在Hub上弄了个案例,然后简单地把日志记录了下来

 

看到一个缩略图的解决方案

-- 写入文件
local function writefile(filename, info)
    local wfile=io.open(filename, "w") --写入文件(w覆盖)
    assert(wfile)  --打开时验证是否出错		
    wfile:write(info)  --写入传入的内容
    wfile:close()  --调用结束后记得关闭
end

-- 检测路径是否目录
local function is_dir(sPath)
    if type(sPath) ~= "string" then return false end

    local response = os.execute( "cd " .. sPath )
    if response == 0 then
        return true
    end
    return false
end

-- 检测文件是否存在
local file_exists = function(name)
    local f=io.open(name,"r")
    if f~=nil then io.close(f) return true else return false end
end

local area = nil
local originalUri = ngx.var.uri;
local originalFile = ngx.var.file;
local index = string.find(ngx.var.uri, "([0-9]+)x([0-9]+)");  
if index then 
    originalUri = string.sub(ngx.var.uri, 0, index-2);  
    area = string.sub(ngx.var.uri, index);  
    index = string.find(area, "([.])");  
    area = string.sub(area, 0, index-1);  

    local index = string.find(originalFile, "([0-9]+)x([0-9]+)");  
    originalFile = string.sub(originalFile, 0, index-2)
end

-- check original file
if not file_exists(originalFile) then
    local fileid = string.sub(originalUri, 2);
    -- main
    local fastdfs = require('restyfastdfs')
    local fdfs = fastdfs:new()
    fdfs:set_tracker("192.168.1.113", 22122)
    fdfs:set_timeout(1000)
    fdfs:set_tracker_keepalive(0, 100)
    fdfs:set_storage_keepalive(0, 100)
    local data = fdfs:do_download(fileid)
    if data then
       -- check image dir
        if not is_dir(ngx.var.image_dir) then
            os.execute("mkdir -p " .. ngx.var.image_dir)
        end
        writefile(originalFile, data)
    end
end

-- 创建缩略图
local image_sizes = {"80x80", "800x600", "40x40", "60x60"};  
function table.contains(table, element)  
    for _, value in pairs(table) do  
        if value == element then
            return true  
        end  
    end  
    return false  
end 

if table.contains(image_sizes, area) then  
    local command = "gm convert " .. originalFile  .. " -thumbnail " .. area .. " -background gray -gravity center -extent " .. area .. " " .. ngx.var.file;  
    os.execute(command);  
end;

if file_exists(ngx.var.file) then
    --ngx.req.set_uri(ngx.var.uri, true);  
    ngx.exec(ngx.var.uri)
else
    ngx.exit(404)
end

 

log_lua记录行为日志

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
大型互联网应用记录用户的行为是一个问题,如何在不影响用户体验的情况下,异步的追踪用户的行为,a
大型互联网应用记录用户的行为是一个问题,如何在不影响用户体验的情况下,异步的追踪用户的行为,a
大型互联网应用记录用户的行为是一个问题,如何在不影响用户体验的情况下,异步的追踪用户的行为,a
在上一节,我们已经可以使用clickstream 记录用户的行为日志了,可以按照我们的格式要求将日志记录
在上一节,我们已经可以使用clickstream 记录用户的行为日志了,可以按照我们的格式要求将日志记录
在上一节,我们已经可以使用clickstream 记录用户的行为日志了,可以按照我们的格式要求将日志记录
在上一节,我们已经可以使用clickstream 记录用户的行为日志了,可以按照我们的格式要求将日志记录
公司审计部门要求我们对所有的主机系统添加用户行为审计功能,记录用户账户的登陆时间和行为信息,
http://hi.baidu.com/xbnh0217/item/fd78f92a010dedc1ef10f1a7 man1900.iteye.com/blog/648107 blog
作为系统管理员,有些时候是需要记录系统中的其他用户的一些操作行为的,例如:当系统管理员怀疑系
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号