上篇讲到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
相关推荐
可以借助 ngx.log 输出日志,使用luac或luadump 进行脚本编译和分析,以及通过Nginx的错误日志和访问日志了解运行状态。 总结,《跟我学Nginx+Lua开发》这本书深入浅出地讲解了如何利用Nginx与Lua进行Web服务开发,...
非session API则涉及更多与系统管理相关的操作,如freeswitch bridge用于桥接通话,freeswitch consoleLog用于控制台日志记录等。 2. 方法的具体使用说明:每个方法下面通常会提供该方法的语法(Syntax)、参数...
客户端打点日志是指在客户端应用程序中通过特定的记录机制来收集用户交互行为的过程。这些交互行为可能包括但不限于用户的点击事件、页面浏览时间、错误信息等。通过这种方式收集的数据对于了解用户习惯、优化产品...
Nginx的日志功能强大,可以通过log_format自定义日志格式,便于分析访问行为。access_log和error_log分别记录正常请求和错误信息。通过结合第三方工具如Nginx ingress controller和Prometheus,可以进行性能监控和...
"update.log"记录了更新过程中的日志信息,有助于排查问题;"error.txt"则保存了运行时的错误报告,对调试和优化软件非常有帮助。 总结来说,2D DM游戏开发软件是一个集成了LUA脚本支持和可视化编辑功能的游戏开发...
knihovna.pedf.cuni.cz可能是一个图书馆的网站或者在线资源平台,其访问日志记录了用户对这个网站的访问行为和交互信息。 【描述解析】 "网络日志 从knihovna.pedf.cuni.cz备份访问日志" 描述简单明了,它再次确认...
- `access_log`: 配置访问日志,记录客户端请求信息。 3. **反向代理与负载均衡** - `proxy_pass`: 配置反向代理,将客户端请求转发到上游服务器。 - `upstream`: 定义一组服务器进行负载均衡,可以使用轮询、...
- **日志缓存**:通过 `open_log_file_cache` 控制日志文件的打开和关闭行为,提高性能。 - **日志切割**:设置日志轮转策略,自动分割日志文件,避免单个日志文件过大。 #### 七、Apache 和 Nginx 支持 SSI 配置 ...
例如,增强的log_by_lua*指令可以方便地在Lua脚本中处理日志记录,提供更丰富的日志分析和处理能力。 最后,Nginx的更新通常也会包含对最新操作系统和硬件的支持,确保在不同环境下都能稳定运行。1.16.1可能增加了...
- `loglevel`: 日志记录级别,有 debug、verbose、notice、warning 四种。 - `slowlog-log-slower-than`: 记录执行时间超过该值的命令,用于性能分析。 - `slowlog-max-len`: 缓慢日志队列的最大长度。 8. **...
4. **日志优化**:根据需要调整log_format,避免不必要的日志记录,减轻磁盘I/O负担。 通过对Nginx 1.14.0 源码的深入理解和实践,开发者可以更好地定制化服务器配置,满足特定场景的需求,提升互联网服务的性能和...
Kong允许通过插件来定制日志输出,其中`kong/plugins/log-serializers`目录下的`basic.lua`文件就是用于处理基本日志序列化的。这个改动可能涉及到日志内容、格式或者输出目的地的改变,例如从JSON格式改为CSV,或者...
- `slowlog-log-slower-than`: 记录执行时间超过该值的命令到慢查询日志。 9. **其他设置** - `lua-time-limit`: Lua脚本执行的超时时间,防止因为脚本执行过长导致阻塞。 - `hash-max-ziplist-entries`和`hash-...
- `slowlog-log-slower-than`: 记录执行时间超过该值的命令到慢查询日志。 - `slowlog-max-len`: 慢查询日志的最大长度。 以上是`redis.conf`中主要的配置选项,实际使用中需要根据服务器的硬件资源、应用需求...
这会将日志消息保存到当前目录下的一个名为`log.pid.gz`的文件中,其中`pid`是执行程序的进程ID。如果你的程序创建子进程,可能会生成多个日志文件。更多关于`MPRFI`的详细信息见后文。 #### 特殊情况处理 - **...
- `slowlog-log-slower-than`: 记录执行时间超过该值(微秒)的命令。 3. **内存管理**: - `maxmemory`: 设置Redis的最大内存限制,达到此值后根据`maxmemory-policy`策略进行淘汰。 - `maxmemory-policy`: ...
32. **slowlog-log-slower-than**:记录慢查询的日志阈值。 33. **slowlog-max-len**:慢查询日志最大长度。 34. **latency-monitor-threshold**:监控延迟阈值。 35. **notify-keyspace-events**:通知事件类型...
例如,一个`ctools.log`模块可能用于日志记录,它包含各种级别(如`info`,`warn`,`error`)的记录函数,使得调试和监控应用程序变得简单。 2. **配置管理**:在ctools中,可能有一个`ctools.config`模块,用于...
- `logfile` 定义日志文件的位置,可以关闭日志记录到文件(设置为空字符串)。 5. **数据库**: - `databases` 设置 Redis 支持的数据库数量,默认为 16,可以通过 `SELECT` 命令切换。 6. **持久化**: - RDB...
3. **日志级别(loglevel)**:可设置为debug、notice、warning,以控制Redis的日志输出详细程度。 4. **持久化(persistence)**:包括RDB(定期保存数据库快照)和AOF(Append Only File,记录所有写操作)。通过...