65 lines
2.4 KiB
Lua
65 lines
2.4 KiB
Lua
|
-- Simple logger for LuaDist.
|
||
|
|
||
|
module ("dist.logger", package.seeall)
|
||
|
|
||
|
local cfg = require "dist.config"
|
||
|
local sys = require "dist.sys"
|
||
|
|
||
|
-- Open 'log_file' and return a log, or nil and error msg on error.
|
||
|
local function get_log(log_file)
|
||
|
log_file = log_file or cfg.log_file
|
||
|
assert(type(log_file) == "string", "log.get_log: Argument 'log_file' is not a string.")
|
||
|
log_file = sys.abs_path(log_file)
|
||
|
|
||
|
sys.make_dir(sys.parent_dir(log_file))
|
||
|
local log, err = io.open(log_file, "a")
|
||
|
if not log then
|
||
|
return nil, "Error: can't open a logfile '" .. log_file .. "': " .. err
|
||
|
else
|
||
|
return log
|
||
|
end
|
||
|
end
|
||
|
|
||
|
-- Set the default log.
|
||
|
local log_file = get_log(cfg.log_file)
|
||
|
|
||
|
-- Log levels used.
|
||
|
local log_levels = {
|
||
|
DEBUG = 0, -- Fine-grained informational events that are most useful to debug an application.
|
||
|
INFO = 1, -- Informational messages that highlight the progress of the application at coarse-grained level.
|
||
|
WARN = 2, -- Potentially harmful situations.
|
||
|
ERROR = 3, -- Error events that might still allow the application to continue running.
|
||
|
FATAL = 4, -- Very severe error events that would presumably lead the application to abort.
|
||
|
}
|
||
|
|
||
|
-- Write 'message' with 'level' to 'log'.
|
||
|
local function write(level, ...)
|
||
|
assert(type(level) == "string", "log.write: Argument 'level' is not a string.")
|
||
|
assert(#arg > 0, "log.write: No message arguments provided.")
|
||
|
assert(type(log_levels[level]) == "number", "log.write: Unknown log level used: '" .. level .. "'.")
|
||
|
|
||
|
level = level:upper()
|
||
|
local message = table.concat(arg, " ")
|
||
|
|
||
|
-- Check if writing for this log level is enabled.
|
||
|
if cfg.write_log_level and log_levels[level] >= log_levels[cfg.write_log_level] then
|
||
|
log_file:write(os.date("%Y-%m-%d %H:%M:%S") .. " [" .. level .. "]\t" .. message .. "\n")
|
||
|
log_file:flush()
|
||
|
end
|
||
|
|
||
|
-- Check if printing for this log level is enabled.
|
||
|
if cfg.print_log_level and log_levels[level] >= log_levels[cfg.print_log_level] then
|
||
|
print(message)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
-- Functions with defined log levels for simple use.
|
||
|
function debug(...) return write("DEBUG", ...) end
|
||
|
function info(...) return write("INFO", ...) end
|
||
|
function warn(...) return write("WARN", ...) end
|
||
|
function error(...) return write("ERROR", ...) end
|
||
|
function fatal(...) return write("FATAL", ...) end
|
||
|
|
||
|
-- Function with explicitly specified log level.
|
||
|
function log(level, ...) return write(level, ...) end
|