`
cywhoyi
  • 浏览: 418192 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

log_lua记录行为日志

阅读更多

上篇讲到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

 

1
0
分享到:
评论

相关推荐

    跟我学Nginx+Lua开发_nginxlua原理_nginx_

    可以借助 ngx.log 输出日志,使用luac或luadump 进行脚本编译和分析,以及通过Nginx的错误日志和访问日志了解运行状态。 总结,《跟我学Nginx+Lua开发》这本书深入浅出地讲解了如何利用Nginx与Lua进行Web服务开发,...

    freeswitch LUA 脚本reference

    非session API则涉及更多与系统管理相关的操作,如freeswitch bridge用于桥接通话,freeswitch consoleLog用于控制台日志记录等。 2. 方法的具体使用说明:每个方法下面通常会提供该方法的语法(Syntax)、参数...

    客户端打点日志

    客户端打点日志是指在客户端应用程序中通过特定的记录机制来收集用户交互行为的过程。这些交互行为可能包括但不限于用户的点击事件、页面浏览时间、错误信息等。通过这种方式收集的数据对于了解用户习惯、优化产品...

    Nginx高性能Web服务器详解

    Nginx的日志功能强大,可以通过log_format自定义日志格式,便于分析访问行为。access_log和error_log分别记录正常请求和错误信息。通过结合第三方工具如Nginx ingress controller和Prometheus,可以进行性能监控和...

    2D DM游戏开发软件

    "update.log"记录了更新过程中的日志信息,有助于排查问题;"error.txt"则保存了运行时的错误报告,对调试和优化软件非常有帮助。 总结来说,2D DM游戏开发软件是一个集成了LUA脚本支持和可视化编辑功能的游戏开发...

    web-logs:从knihovna.pedf.cuni.cz备份访问日志

    knihovna.pedf.cuni.cz可能是一个图书馆的网站或者在线资源平台,其访问日志记录了用户对这个网站的访问行为和交互信息。 【描述解析】 "网络日志 从knihovna.pedf.cuni.cz备份访问日志" 描述简单明了,它再次确认...

    nginx配置

    - `access_log`: 配置访问日志,记录客户端请求信息。 3. **反向代理与负载均衡** - `proxy_pass`: 配置反向代理,将客户端请求转发到上游服务器。 - `upstream`: 定义一组服务器进行负载均衡,可以使用轮询、...

    Nginx教程从入门到精通到失业

    - **日志缓存**:通过 `open_log_file_cache` 控制日志文件的打开和关闭行为,提高性能。 - **日志切割**:设置日志轮转策略,自动分割日志文件,避免单个日志文件过大。 #### 七、Apache 和 Nginx 支持 SSI 配置 ...

    Nginx Open Source [Updated]:Nginx 开源 1.16.1-开源

    例如,增强的log_by_lua*指令可以方便地在Lua脚本中处理日志记录,提供更丰富的日志分析和处理能力。 最后,Nginx的更新通常也会包含对最新操作系统和硬件的支持,确保在不同环境下都能稳定运行。1.16.1可能增加了...

    redis6.0.8配置文件

    - `loglevel`: 日志记录级别,有 debug、verbose、notice、warning 四种。 - `slowlog-log-slower-than`: 记录执行时间超过该值的命令,用于性能分析。 - `slowlog-max-len`: 缓慢日志队列的最大长度。 8. **...

    nginx-1.14.0 - 源码.rar

    4. **日志优化**:根据需要调整log_format,避免不必要的日志记录,减轻磁盘I/O负担。 通过对Nginx 1.14.0 源码的深入理解和实践,开发者可以更好地定制化服务器配置,满足特定场景的需求,提升互联网服务的性能和...

    kong0.1.2源码

    Kong允许通过插件来定制日志输出,其中`kong/plugins/log-serializers`目录下的`basic.lua`文件就是用于处理基本日志序列化的。这个改动可能涉及到日志内容、格式或者输出目的地的改变,例如从JSON格式改为CSV,或者...

    redis 配置详细介绍

    - `slowlog-log-slower-than`: 记录执行时间超过该值的命令到慢查询日志。 9. **其他设置** - `lua-time-limit`: Lua脚本执行的超时时间,防止因为脚本执行过长导致阻塞。 - `hash-max-ziplist-entries`和`hash-...

    redis的配置文件,解压后放到conf文件夹下

    - `slowlog-log-slower-than`: 记录执行时间超过该值的命令到慢查询日志。 - `slowlog-max-len`: 慢查询日志的最大长度。 以上是`redis.conf`中主要的配置选项,实际使用中需要根据服务器的硬件资源、应用需求...

    mpr 2.8 Manual

    这会将日志消息保存到当前目录下的一个名为`log.pid.gz`的文件中,其中`pid`是执行程序的进程ID。如果你的程序创建子进程,可能会生成多个日志文件。更多关于`MPRFI`的详细信息见后文。 #### 特殊情况处理 - **...

    redis3.2 最新版本启动配置文件redis.conf详细说明.rar

    - `slowlog-log-slower-than`: 记录执行时间超过该值(微秒)的命令。 3. **内存管理**: - `maxmemory`: 设置Redis的最大内存限制,达到此值后根据`maxmemory-policy`策略进行淘汰。 - `maxmemory-policy`: ...

    redis集群方法大全

    32. **slowlog-log-slower-than**:记录慢查询的日志阈值。 33. **slowlog-max-len**:慢查询日志最大长度。 34. **latency-monitor-threshold**:监控延迟阈值。 35. **notify-keyspace-events**:通知事件类型...

    ctools

    例如,一个`ctools.log`模块可能用于日志记录,它包含各种级别(如`info`,`warn`,`error`)的记录函数,使得调试和监控应用程序变得简单。 2. **配置管理**:在ctools中,可能有一个`ctools.config`模块,用于...

    redis3.2 最新版本启动配置文件redis.conf详细说明 1

    - `logfile` 定义日志文件的位置,可以关闭日志记录到文件(设置为空字符串)。 5. **数据库**: - `databases` 设置 Redis 支持的数据库数量,默认为 16,可以通过 `SELECT` 命令切换。 6. **持久化**: - RDB...

    redis二进制包及配置文件说明

    3. **日志级别(loglevel)**:可设置为debug、notice、warning,以控制Redis的日志输出详细程度。 4. **持久化(persistence)**:包括RDB(定期保存数据库快照)和AOF(Append Only File,记录所有写操作)。通过...

Global site tag (gtag.js) - Google Analytics