[Snippet] [devHelper] Logger

stable
By pshai in Miscellaneous Published May 2021 👁 1,316 views 💬 0 comments

Description

Here it is; the humble hunchback of the debugger: LOGGER. Logger is a simple class object, which brings depth to debugging. You can follow execution paths and trace bugs with precision. Installation: Simply copy and paste the snippet to your project! Just make sure Logger and its functions are defined before they are used. Functions: * Logger:log() - Normal log, as long as logger level is set to [All]. * Logger:warn() - Warning log, as long as logger level is set to [All] or [Errors & Warnings]. * Logger:error() - Error log. * Logger:enter() - Enter new scope. Will be added to the scope-path when logging messages. * Logger:exit() - Exit the current scope. Will remove the latest entry from the scope-path. Rest of the functions are for Logger's internal use only. Usage:

-- normal log msg
Logger:log('we are in Main, and this only shows when we log All')

-- normal log msg with color
Logger:log('logger supports colors as well', Green)

function doSomething()
     -- enter new scope
    Logger:enter('doSomething')

    -- log a warning
    Logger:warn('this time we warn something at Main::doSomething')

    -- exit current scope
    Logger:exit()
end

doSomething()

-- log an error
Logger:error('execution stops here')
HaasScript
--===================================================================
-- == Logger
    local LoggerLevels = {
        ErrorsOnly = 'Errors Only',
        ErrorsAndWarnings = 'Erorrs & Warnings',
        All = 'All'
    }

    local Logger = {
        _level = InputOptions('DEBUG Level',
                LoggerLevels.All,
                LoggerLevels,
                {group = '     DEBUG'}),
        _in = 'Main',
        _prevIn = {},
        _log = Log,
        _warn = LogWarning,
        _error = LogError
    }

    function Logger:level()
        if Logger._level == LoggerLevels.ErrorsOnly then
            return 0
        elseif Logger._level == LoggerLevels.ErrorsAndWarnings then
            return 1
        elseif Logger._level == LoggerLevels.All then
            return 2
        end

        LogError('Logger level undefined: "' .. Logger._level .. '"')
    end

    function Logger:where()
        local ret = ''
        local prevs = self._prevIn
        if #prevs > 0 then
            for i = 1, #prevs do
                if prevs[i] != '' and #prevs[i] > 0 then
                    ret = ret .. prevs[i] .. '::'
                end
            end
        end
        return ret .. self._in
    end

    function Logger:enter(to)
        self._prevIn = ArrayAdd(self._prevIn, self._in)
        self._in = to
    end

    function Logger:exit()
        self._in = ArrayLast(self._prevIn)
        self._prevIn = ArrayPop(self._prevIn)
    end

    function Logger:log(msg, color)
        if self:level() >= 2 then
            if not color then
                color = ''
            end

            local _in = Logger:where()
            self._log('['.._in..'] '..msg, color)
        end
    end

    function Logger:warn(msg)
        if self:level() >= 1 then
            local _in = Logger:where()
            self._warn('['.._in..'] '..msg)
        end
    end

    function Logger:error(msg)
        local _in = Logger:where()
        self._error('['.._in..'] '..msg)
    end

--===================================================================
--===================================================================

0 Comments

Sign in to leave a comment.

No comments yet. Be the first!