you still have to pay the cost of assembling the message and calling ngx.log before it’s filtered out by the log level.
For really verbose/expensive logging that is reserved for development or debugging, I used a macro system (really just sed and a makefile) in the past to avoid calling the log functions at all. Made on-the-fly changes a bit more challenging, but it improved hot path performance markedly.
https://github.com/p0pr0ck5/lua-resty-waf/blob/master/tools/debug-macro.sh
Sent from my iPhone
I am using this frequently for debugging:
ngx.log( ngx.DEBUG, message, var1, var2, var3 )
Is there a best practice for logging that avoids the cost of the concatenation?
something like:
if ( log_level == ngx.DEBUG ) then
....
I was thinking I could declare a global variable in the init blocks. Is there an API to check the most verbose log level the error_logs are using?
I understand there can be several error_log defined at different levels
Thanks!
ahvoldman
Hi, Thanks for your answer
Regarding this: "you still have to pay the cost of assembling the message and calling ngx.log before it’s filtered out by the log level. "
if the ngx.log is inside the if statement, there should not be any concatenation cost, just the cost of evaluating the variable
I found this:
local errlog = require "ngx.errlog"
log_level = errlog.get_sys_filter_level()
I don't know how expensive errlog.get_sys_filter_level() is. I guess it would be best to store the result in a global variable and use the variable
instead.
I will review your technique as well. Thanks again
PS: I just did a quick test with this
init_by_lua_block {
local errlog = require "ngx.errlog"
glog_level = errlog.get_sys_filter_level()
}
but didn't work. It's like the logs are configured after init_by_lua_block runs. get_sys_filter_level() works fine from within my application.
I will need to debug it a bit more
On Sunday, December 15, 2019 at 5:05:07 PM UTC-5, rpaprocki wrote:
you still have to pay the cost of assembling the message and calling ngx.log before it’s filtered out by the log level.
For really verbose/expensive logging that is reserved for development or debugging, I used a macro system (really just sed and a makefile) in the past to avoid calling the log functions at all. Made on-the-fly changes a bit more challenging, but it improved hot path performance markedly.
https://github.com/p0pr0ck5/
lua-resty-waf/blob/master/
tools/debug-macro.sh
Sent from my iPhone
I am using this frequently for debugging:
ngx.log( ngx.DEBUG, message, var1, var2, var3 )
Is there a best practice for logging that avoids the cost of the concatenation?
something like:
if ( log_level == ngx.DEBUG ) then
....
I was thinking I could declare a global variable in the init blocks. Is there an API to check the most verbose log level the error_logs are using?
I understand there can be several error_log defined at different levels
Thanks!
ahvoldman
I don't see how to edit my previous reply
looking briefly at code, it uses the request object
function _M.get_sys_filter_level()
local r = get_request()
return tonumber(ngx_lua_ffi_errlog_get_sys_filter_level(r))
end
so I guess I need to call "errlog.get_sys_filter_level()" at least once per request
On Monday, December 16, 2019 at 11:26:29 AM UTC-5, Andres Voldman wrote:
Hi, Thanks for your answer
Regarding this: "you still have to pay the cost of assembling the message and calling ngx.log before it’s filtered out by the log level. "
if the ngx.log is inside the if statement, there should not be any concatenation cost, just the cost of evaluating the variable
I found this:
local errlog = require "ngx.errlog"
log_level = errlog.get_sys_filter_level()
I don't know how expensive errlog.get_sys_filter_level() is. I guess it would be best to store the result in a global variable and use the variable
instead.
I will review your technique as well. Thanks again
PS: I just did a quick test with this
init_by_lua_block {
local errlog = require "ngx.errlog"
glog_level = errlog.get_sys_filter_level()
}
but didn't work. It's like the logs are configured after init_by_lua_block runs. get_sys_filter_level() works fine from within my application.
I will need to debug it a bit more
On Sunday, December 15, 2019 at 5:05:07 PM UTC-5, rpaprocki wrote:
you still have to pay the cost of assembling the message and calling ngx.log before it’s filtered out by the log level.
For really verbose/expensive logging that is reserved for development or debugging, I used a macro system (really just sed and a makefile) in the past to avoid calling the log functions at all. Made on-the-fly changes a bit more challenging, but it improved hot path performance markedly.
https://github.com/p0pr0ck5/
lua-resty-waf/blob/master/
tools/debug-macro.sh
Sent from my iPhone
I am using this frequently for debugging:
ngx.log( ngx.DEBUG, message, var1, var2, var3 )
Is there a best practice for logging that avoids the cost of the concatenation?
something like:
if ( log_level == ngx.DEBUG ) then
....
I was thinking I could declare a global variable in the init blocks. Is there an API to check the most verbose log level the error_logs are using?
I understand there can be several error_log defined at different levels
Thanks!
|