vis-config

lua scripts to configure vis editor

git clone https://9o.is/git/vis-config.git

log.lua

(2669B)


      1 --- Simple logging module for vis-lspc.
      2 -- @module log
      3 -- @author Florian Fischer
      4 -- @license GPL-3
      5 -- @copyright 2024 Florian Fischer
      6 local log = {}
      7 
      8 --- Logger class metatable.
      9 local Logger = {}
     10 function Logger:log(msg)
     11   self.log_fd:write(msg)
     12   self.log_fd:write('\n')
     13   self.log_fd:flush()
     14 end
     15 function Logger:close()
     16   self.log_fd:close()
     17 end
     18 
     19 --- Dummy logger class metatable using NOP log functions.
     20 local DummyLogger = {}
     21 function DummyLogger.log()
     22 end
     23 function DummyLogger.close()
     24 end
     25 
     26 --- Logger that initialises itself on first use
     27 local LazyInitLogger = {}
     28 function LazyInitLogger:log(first_msg)
     29   self.logger = log.new(self.name, self.conf.logging, self.conf.log_file)
     30   self.log = function(lazyLogger, msg)
     31     lazyLogger.logger:log(msg)
     32   end
     33   self.logger:log(first_msg)
     34 end
     35 function LazyInitLogger:close()
     36   self.logger:close()
     37 end
     38 
     39 --- Create a new lazily initializing logger
     40 --
     41 -- The created logger will initialize itself using log.new on first use.
     42 -- The logging and log_file fields of the conf table are passed to log.new.
     43 -- @param name The name of the logger
     44 -- @param conf Table containing logging and log_file members
     45 function log.lazyNew(name, conf)
     46   local logger = {name = name, conf = conf}
     47   setmetatable(logger, {__index = LazyInitLogger})
     48   return logger
     49 end
     50 
     51 --- Create a new named logger
     52 -- @param name The name of the logger
     53 -- @param logging Is logging enabled
     54 -- @param log_file File path to the log file to use
     55 function log.new(name, logging, log_file)
     56   local logger = {name = name, log_fd = nil}
     57 
     58   if not logging then
     59     setmetatable(logger, {__index = DummyLogger})
     60     return logger
     61   end
     62 
     63   setmetatable(logger, {__index = Logger})
     64 
     65   -- open the default log file in $XDG_DATA_HOME/vis-lspc
     66   if not log_file then
     67     local xdg_data = os.getenv('XDG_DATA_HOME') or os.getenv('HOME') .. '/.local/share'
     68     local log_dir = xdg_data .. '/vis-lspc'
     69 
     70     -- ensure the direcoty exists
     71     os.execute('mkdir -p ' .. log_dir)
     72 
     73     -- log file format: {timestamp}-{basename-cwd}.log
     74     local log_file_fmt = log_dir .. '/%s-%s.log'
     75     local timestamp = os.date('%Y-%m-%dT%H:%M:%S')
     76     local proc = assert(io.popen('basename "${PWD}"', 'r'))
     77     local basename_cwd = assert(proc:read('*a')):match('^%s*(.-)%s*$')
     78     local success, _, status = proc:close()
     79     if not success then
     80       local err = 'getting the basename of CWD failed with exit code: ' .. status
     81       vis:info('LSPC Error: ' .. err)
     82     end
     83     log_file = log_file_fmt:format(timestamp, basename_cwd)
     84 
     85   elseif type(log_file) == 'function' then
     86     log_file = log_file()
     87   end
     88 
     89   logger.log_fd = assert(io.open(log_file, 'w'))
     90   return logger
     91 end
     92 
     93 return log