script, caller, line number, msg were printed for all log
levels, but changed to return less info except in log.debug
log.error, and log.critical messages. All messages print
the script name except for log.screen.
310 lines
9.7 KiB
Lua
310 lines
9.7 KiB
Lua
|
|
local dtutils_log = {}
|
|
|
|
dtutils_log.libdoc = {
|
|
Name = [[dtutils.log]],
|
|
Synopsis = [[darktable lua logging library]],
|
|
Usage = [[local log = require "lib/dtutils.log"]],
|
|
Description = [[log provides a multi-level logging solution for use with
|
|
the darktable lua scripts. With this library you can leave log messages
|
|
scattered through out your code and only turn them on as necessary.]],
|
|
Return_Value = [[log - library - the darktable lua logging functions]],
|
|
Limitations = [[]],
|
|
Example = [[local log = require "lib/dtutils.log"
|
|
|
|
local cur_level = log.log_level()
|
|
log.log_level(log.warn)
|
|
|
|
print out warning, error and success messages as code is running
|
|
|
|
log.log_level(debug)
|
|
|
|
print out debugging messages too because this isnt working
|
|
|
|
log.log_level(info)
|
|
|
|
I want to make sure this is working ok
|
|
|
|
log.log_level(cur_level)
|
|
|
|
reset the logging level back to normal]],
|
|
See_Also = [[]],
|
|
Reference = [[]],
|
|
License = [[This program is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.]],
|
|
Copyright = [[Copyright (C) 2016 Bill Ferguson <wpferguson@gmail.com>.]],
|
|
functions = {}
|
|
}
|
|
|
|
local dt = require "darktable"
|
|
local dt_print_error = dt.print_error
|
|
local dt_print_log = dt.print_log
|
|
local dt_print = dt.print
|
|
|
|
|
|
-- set the default log levels
|
|
|
|
dtutils_log.debug = {
|
|
label = "DEBUG: ",
|
|
enabled = false,
|
|
engine = dt_print_log,
|
|
caller_info = 3,
|
|
level = 1,
|
|
}
|
|
dtutils_log.info = {
|
|
label = "INFO: ",
|
|
enable = false,
|
|
engine = dt_print_log,
|
|
caller_info = 1,
|
|
level = 2,
|
|
}
|
|
dtutils_log.warn = {
|
|
label = "WARN: ",
|
|
enabled = false,
|
|
engine = dt_print_log,
|
|
caller_info = 2,
|
|
level = 3,
|
|
}
|
|
dtutils_log.error = {
|
|
label = "ERROR: ",
|
|
enabled = true,
|
|
engine = dt_print_log,
|
|
caller_info = 3,
|
|
level = 4,
|
|
}
|
|
dtutils_log.success = {
|
|
label = "SUCCESS: ",
|
|
enabled = true,
|
|
engine = dt_print_log,
|
|
caller_info = 2,
|
|
level = 5,
|
|
}
|
|
dtutils_log.screen = {
|
|
label = "",
|
|
enabled = true,
|
|
engine = dt_print,
|
|
caller_info = 0,
|
|
level = 9,
|
|
}
|
|
dtutils_log.always = {
|
|
label = "",
|
|
enabled = true,
|
|
engine = dt_print_log,
|
|
caller_info = 3,
|
|
level = 9,
|
|
}
|
|
dtutils_log.critical = {
|
|
label = "CRITICAL: ",
|
|
enabled = true,
|
|
engine = print,
|
|
caller_info = 3,
|
|
level = 9,
|
|
}
|
|
|
|
dtutils_log.libdoc.functions["caller"] = {
|
|
Name = [[caller]],
|
|
Synopsis = [[get the name and line number of the calling routine]],
|
|
Usage = [[local log = require "lib/dtutils.log"
|
|
|
|
result = log.caller(level)
|
|
level - number - the number of stack levels to go down to retrieve the caller routine information]],
|
|
Description = [[caller gets the name and line number of the calling routine and returns it]],
|
|
Return_Value = [[result - string - the name and line number of the calling function or 'callback: ' if the attempt to get the
|
|
caller returns nil]],
|
|
Limitations = [[]],
|
|
Example = [[]],
|
|
See_Also = [[]],
|
|
Reference = [[]],
|
|
License = [[]],
|
|
Copyright = [[]],
|
|
}
|
|
|
|
function dtutils_log.caller(level, info)
|
|
local name = debug.getinfo(level).name
|
|
local lineno = nil
|
|
local source = nil
|
|
if name then
|
|
lineno = debug.getinfo(level).currentline
|
|
-- returns the path to the file prefixed with @
|
|
source = debug.getinfo(level).source
|
|
-- we just need the filename, so grab it from the string
|
|
-- Thanks, Tobias Jakobs :-)
|
|
source = string.match(source, "@.-([^\\/]-%.?[^%.\\/]*)$")
|
|
|
|
if info == 0 then
|
|
return ""
|
|
elseif info == 1 then
|
|
return source .. ": "
|
|
elseif info == 2 then
|
|
return source .. ": " .. name .. ": "
|
|
else
|
|
return source .. ": " .. name .. ": " .. lineno .. ":"
|
|
end
|
|
else
|
|
return "callback:"
|
|
end
|
|
end
|
|
|
|
dtutils_log.libdoc.functions["msg"] = {
|
|
Name = [[msg]],
|
|
Synopsis = [[print a log message]],
|
|
Usage = [[local log = require "lib/log"
|
|
|
|
log.msg(level, ...)
|
|
level - table - the type of message, one of:
|
|
log.debug - debugging messages
|
|
log.info - informational messages
|
|
log.warn - warning messages
|
|
log.error - error messages
|
|
log.success - success messages
|
|
log.always - an internal message for debugging
|
|
log.screen - output 1 line of text to the screen
|
|
log.critical - print a critical message to the console
|
|
|
|
... - string(s) - the message to print, which could be a comma separated set of strings]],
|
|
Description = [[msg checks the level to see if it is enabled, then prints the level type and message if it is.
|
|
Messages are output using the engine configured in each log level.]],
|
|
Return_Value = [[]],
|
|
Limitations = [[If you use log.msg in a callback, the name of the calling routine can't be determined. A solution
|
|
is to include some means of reference such as the name of the callback as an argument, i.e.
|
|
|
|
log.msg(log.debug, "libPlugin.format_combobox:", "value is " .. self.value)
|
|
|
|
which would result in
|
|
|
|
DEBUG: callback: libPlugin.format_combobox: value is JPEG]],
|
|
Example = [[]],
|
|
See_Also = [[]],
|
|
Reference = [[]],
|
|
License = [[]],
|
|
Copyright = [[]],
|
|
}
|
|
|
|
function dtutils_log.msg(level, ...)
|
|
if level.enabled then
|
|
local args = {...}
|
|
local call_level = 3
|
|
if level == dtutils_log.always then
|
|
call_level = args[1]
|
|
table.remove(args, 1)
|
|
end
|
|
local log_msg = level.label
|
|
if level.engine ~= dt_screen and call_level ~= 0 then
|
|
log_msg = log_msg .. dtutils_log.caller(call_level, level.caller_info) .. " "
|
|
elseif log_msg:len() > 2 then
|
|
log_msg = log_msg .. " "
|
|
end
|
|
for i = 1,#args do
|
|
log_msg = log_msg .. tostring(args[i]) .. " "
|
|
end
|
|
level.engine(log_msg)
|
|
end
|
|
end
|
|
|
|
dtutils_log.libdoc.functions["log_level"] = {
|
|
Name = [[log_level]],
|
|
Synopsis = [[get or set the log level]],
|
|
Usage = [[local log = require "lib/log"
|
|
|
|
local result = log.log_level(...)
|
|
... - arguments - if none is supplied, then the current log level is returned as one of:
|
|
log.debug, log.info, log.warn, log.error, log.success. If one of log.debug, log.info, log.warn,
|
|
log.error, or log.success is supplied as the argument then the log level is set to that value. All
|
|
log levels greater than or equal in value will be enabled. Any levels of lesser value will be disabled.]],
|
|
Description = [[log_level gets and sets the logging level. When called with no arguments the current log level
|
|
is returned as one of log.debug, log.info, log.warn, log.error, or log.success. When called with one of log.debug,
|
|
log.info, log.warn, log.error or log.success then the log level is set. When setting the log level all levels
|
|
equal or greater are enabled and any of lesser value are disabled. See the example.]],
|
|
Return_Value = [[result - the log level, one of log.debug, log.info, log.warn, log.error or log.success]],
|
|
Limitations = [[]],
|
|
Example = [[Assume that the current log level is log.error. Calling log.log_level() will return log.error.
|
|
Calling log.log_level(log.info) will leave log.debug disabled, and enable log.info, log.warn, log.error and
|
|
log.success. log.info will be returned as the log_level.]],
|
|
See_Also = [[]],
|
|
Reference = [[]],
|
|
License = [[]],
|
|
Copyright = [[]],
|
|
}
|
|
|
|
function dtutils_log.log_level(...)
|
|
local levels = {"debug", "info", "warn", "error", "success"}
|
|
local args = {...}
|
|
local log_level = nil
|
|
if #args > 0 then
|
|
log_level = args[1]
|
|
if log_level == dtutils_log.critical or
|
|
log_level == dtutils_log.screen or
|
|
log_level == dtutils_log.always then
|
|
-- these aren't valid for setting levels
|
|
return nil
|
|
else
|
|
for _,v in ipairs(levels) do
|
|
if dtutils_log[v].level >= log_level.level then
|
|
dtutils_log[v].enabled = true
|
|
else
|
|
dtutils_log[v].enabled = false
|
|
end
|
|
end
|
|
end
|
|
else
|
|
for _,v in ipairs(levels) do
|
|
if dtutils_log[v].enabled == true then
|
|
log_level = dtutils_log[v]
|
|
break
|
|
end
|
|
end
|
|
end
|
|
return log_level
|
|
end
|
|
|
|
dtutils_log.libdoc.functions["engine"] = {
|
|
Name = [[engine]],
|
|
Synopsis = [[get and set the output engine]],
|
|
Usage = [[local log = require "lib/dtutils.log"
|
|
|
|
result = log.engine(level, ...)
|
|
level - table - the log level to get or set the engine for, one of log.debug, log.info, log.warn, log.error
|
|
log.success, log.always, log.screen, log.critical
|
|
... - function - the output function, one of dt.print, dt.print_error, dt.print_log, print
|
|
if not function is included, the current engine is returned for the specified log level]],
|
|
Description = [[engine returns the output engine for the specified log level if a second argument is not
|
|
supplied. If a function is supplied as the second argment, then the output engine for the specified log level
|
|
is set to that.]],
|
|
Return_Value = [[result - function - the current output engine]],
|
|
Limitations = [[]],
|
|
Example = [[]],
|
|
See_Also = [[]],
|
|
Reference = [[]],
|
|
License = [[]],
|
|
Copyright = [[]],
|
|
}
|
|
|
|
function dtutils_log.print_engine(level, ...)
|
|
local engines = {"dt_print", "dt_print_error", "dt_print_log", "print"}
|
|
local args = {...}
|
|
local cur_engine = ""
|
|
if #args == 0 then
|
|
cur_engine = level.engine
|
|
else
|
|
for _,v in ipairs(engines) do
|
|
if args[1] == v then
|
|
level.engine = args[1]
|
|
cur_engine = level.engine
|
|
end
|
|
end
|
|
end
|
|
return cur_engine
|
|
end
|
|
|
|
return dtutils_log
|