--- Logger module -- @module Logger Logger = {} --- Creates a new logger object.

-- In debug mode, the logger writes immediately. Otherwise the loggers buffers lines. -- The logger flushes after 60 seconds has elapsed since the last message. --

-- When loggers are created, a table of options may be specified. The valid options are: -- -- log_ticks -- whether to include the game tick timestamp in logs. Defaults to false. -- file_extension -- a string that overides the default 'log' file extension. -- force_append -- each time a logger is created, it will always append, instead of -- -- the default behavior, which is to write out a new file, then append -- -- -- @usage --LOGGER = Logger.new('cool_mod_name') --LOGGER.log("this msg will be logged!") -- -- @usage --LOGGER = Logger.new('cool_mod_name', 'test', true) --LOGGER.log("this msg will be logged and written immediately in test.log!") -- -- @usage --LOGGER = Logger.new('cool_mod_name', 'test', true, { file_extension = data }) --LOGGER.log("this msg will be logged and written immediately in test.data!") -- -- @param mod_name [required] the name of the mod to create the logger for -- @param log_name (optional, default: 'main') the name of the logger -- @param debug_mode (optional, default: false) toggles the debug state of logger. -- @param options (optional) table with optional arguments -- @return the logger instance function Logger.new(mod_name, log_name, debug_mode, options) if not mod_name then error("Logger must be given a mod_name as the first argument") end if not log_name then log_name = "main" end if not options then options = {} end local Logger = {mod_name = mod_name, log_name = log_name, debug_mode = debug_mode, buffer = {}, last_written = 0, ever_written = false} --- Logger options Logger.options = { log_ticks = options.log_ticks or false, -- whether to add the ticks in the timestamp, default false file_extension = options.file_extension or 'log', -- extension of the file, default: log force_append = options.force_append or false, -- append the file on first write, default: false } Logger.file_name = 'logs/' .. Logger.mod_name .. '/' .. Logger.log_name .. '.' .. Logger.options.file_extension Logger.ever_written = Logger.options.force_append --- Logs a message -- @param msg a string, the message to log -- @return true if the message was written, false if it was queued for a later write function Logger.log(msg) local format = string.format if _G.game then local tick = game.tick local floor = math.floor local time_s = floor(tick/60) local time_minutes = floor(time_s/60) local time_hours = floor(time_minutes/60) if Logger.options.log_ticks then table.insert(Logger.buffer, format("%02d:%02d:%02d.%02d: %s\n", time_hours, time_minutes % 60, time_s % 60, tick - time_s*60, msg)) else table.insert(Logger.buffer, format("%02d:%02d:%02d: %s\n", time_hours, time_minutes % 60, time_s % 60, msg)) end -- write the log every minute if (Logger.debug_mode or (tick - Logger.last_written) > 3600) then return Logger.write() end else table.insert(Logger.buffer, format("00:00:00: %s\n", msg)) end return false end --- Writes out all buffered messages immediately -- @return true if there any messages were written, false if not function Logger.write() if _G.game then Logger.last_written = game.tick game.write_file(Logger.file_name, table.concat(Logger.buffer), Logger.ever_written) Logger.buffer = {} Logger.ever_written = true return true end return false end return Logger end return Logger