Bark at the Moon: Better Lua Logging

In this micro-blog, I’ll showcase how we at Third Kind Games implemented better logging in our Lua scripts.


In order to log something to TTY from Lua you’ll typically do that following:

Debug.Log("Output to TTY please!")

Which is OK and will do what it says, however, in order to disable that particular piece of logging, you’ll have to REM it out.

-- Debug.Log("Output to TTY please!")

Again, this is fine and does what it says on the tin.  The problem you’ll reach, however, is when you start having lots of logs throughout your scripts, where you’ll end up having to fish through the scripts looking for ones to REM and un-REM.  This is not scalable.

Here at Third Kind, we do things a bit differently.  This is what our logging looks like:

TKGDebug.Set("MyDebugTTY", false) -- note the second parameter

function mycode:somefunction()
  TKGDebug.Log("MyDebugTTY", "Output to TTY please!");
end

The second parameter of the “Set” function is a bool that will turn on or off all logs within the script that are associated with the “MyDebugTTY” descriptor.  Much more useful!!

Better Logging

To help you all out, below is the source that you can use in your own projects to improve your logging.  Let us know what you think in the comments.

local luaext	= require"scripts.modules.luaext";

luaext.declareglobal("TKGDebug")

function TKGDebug.Set(debugName, enabled)
    _G.TKGDebug[debugName] = enabled;
end

function TKGDebug.Log(debugName, ...)
    if _G.TKGDebug[debugName] then 
        if select("#",...) > 1 then
            TKGDebug.Log(debugName, string.format(...))
        else
            if type(...) == "string" then
                message = ...
            else
                message = luaext.tostring( ... )
            end
            Debug.Log("[" .. debugName .. "] " .. message )
        end
    end
end

Enjoy!

Leave a Reply