This topic contains 4 replies, has 2 voices, and was last updated by  roho 2 years, 7 months ago.

Get logging level in Lua script?

  • Hi guys,

    is there a way to get the logging level of the channel in the Lua code?

    I’d like to spread a lot of logDebug statements all over the Lua code, but I’m worrying that many statements

    
    iguana.logDebug(<a href="https://github.com/kikito/inspect.lua">inspect</a>.inspect(result))
    

    will slow me down by creating the output even if logDebug is switched off.

    The only thing I found was:

    
       local xml = xml.parse{data=iguana.channelConfig{name='ChannelName'}}
       local loggingLevel = xml.channel.logging_level)
    

    but

    • that doesn’t seem to change when I change the logging level in the control panel of the channel… it only reads the setting from IguanaConfiguration.xml?
    • parsing the XML might be even slower…

    So what I need is either a way to quickly get whether debug logging is enabled, or a logDebug function which accepts a lambda expression, i.e. a function which is then only evaluated if debug log is on.

    Is there any possibility for this?

    Oh that is funny – I saw a notification for your question and implemented this function:

    function LoggingLevel()
    if (not Level) then
    local X = xml.parse{data=iguana.channelConfig{guid=iguana.channelGuid()}}
    Level = tonumber(tostring(X.channel.logging_level))
    end
    return Level
    end

    Which is the same type of solution – although it does some caching of the result. The API doesn’t actually hit the disk – it constructs the XML fragment you see from memory so the only impact of this is a little bit of extra CPU usage. On the whole most of the time Iguana tends not to max out CPU – IO (input/output) tends to be where the overhead occurs so I would suspect it won’t make much practical difference if you hit this API every time.

    Although I doubt it matters all that much here is a slightly more sophisticated caching scheme. It keeps the API value for 5 seconds:

    -- 2 means debug level. 1 is normal and 0 is no logging. This function caches the
    -- logging level if found for the last 5 seconds
    local LastTime =0
    local LogLevel

    function LoggingLevel()
    if os.ts.time() - 5 > LastTime then -- Check to see last time we looked this up
    LastTime = os.ts.time()
    local X = xml.parse{data=iguana.channelConfig{guid=iguana.channelGuid()}}
    LogLevel = tonumber(tostring(X.channel.logging_level))
    end
    return LogLevel
    end

    It’s a reasonable general solution for looking anything up that doesn’t change often but has some overhead in fetching.

    I have tested the speed of any of these in production – be curious to see what you find if you have time to try it…

    Incidentally it’s a similar optimization we use for some of Iguana’s own internal tracing…enjoy!

    Happy Holidays if I don’t hear from you before the season 🙂

    Hi Eliot,
    OK, so maybe this is indeed the way to go. I think the first solution is good enough, the 5 seconds caching is really really fancy 🙂

    Thanks a lot for your help!

You must be logged in to reply to this topic.