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