@@ -20,13 +20,19 @@ local types = {
2020 [" feather:finish" ] = " info" ,
2121 [" feather:start" ] = " info" ,
2222}
23+ local LOGS_DIR = " logs"
24+ local SCREENSHOTS_DIR = LOGS_DIR .. " /" .. " screenshots"
2325
2426--- @class FeatherLogger : FeatherPlugin
2527--- @field debug boolean
2628--- @field wrapPrint boolean
2729--- @field captureScreenshot boolean
2830--- @field lastScreenshot any
2931--- @field outfile string
32+ --- @field last_screenshot_taken_at number
33+ --- @field screenshotIndex number
34+ --- @field screenshotRate number
35+ --- @field screenshotPoolSize number
3036--- @field last_log FeatherLine
3137--- @field maxTempLogs number
3238--- @field log fun ( self : FeatherLogger , line : FeatherLine , screenshot ?: boolean ) Logs a line
@@ -44,14 +50,23 @@ local FeatherLogger = Class({
4450 self .captureScreenshot = config .captureScreenshot
4551 self .lastScreenshot = nil
4652 self .last_log = nil
53+ self .last_screenshot_taken_at = nil
54+ self .screenshotIndex = 1
55+ self .screenshotRate = config .screenshotRate or 1
56+ self .screenshotPoolSize = config .screenshotPoolSize or 60
57+ self .lastId = 0
4758
4859 local cwd = love .filesystem .getSaveDirectory ()
4960
50- love .filesystem .createDirectory (" logs " )
61+ love .filesystem .createDirectory (LOGS_DIR )
5162
52- local logdir = cwd .. " /logs "
63+ love . filesystem . createDirectory ( SCREENSHOTS_DIR )
5364
54- local logfile = logdir .. " /" .. os.date (" %Y-%m-%d_%H:%M:%S" ) .. " _" .. config .outfile
65+ local logdir = cwd .. " /" .. LOGS_DIR
66+
67+ local logfile = logdir .. " /" .. os.date (" %Y-%m-%d_%H:%M:%S" ) .. " _" .. config .outfile .. " .featherlog"
68+
69+ log .info (" Saving logs to " .. logfile )
5570
5671 log .outfile = logfile
5772 log .usecolor = false
7590
7691function FeatherLogger :update ()
7792 if not self .captureScreenshot then
93+ self .lastScreenshot = nil
7894 return
7995 end
8096
81- self . lastScreenshot = nil
97+ local now = love . timer . getTime ()
8298
83- love .graphics .captureScreenshot (function (img )
84- self .lastScreenshot = img
85- end )
99+ if self .last_screenshot_taken_at and now - self .last_screenshot_taken_at < self .screenshotRate then
100+ return -- short throttle so spammy errors don't melt disk
101+ end
102+
103+ self .last_screenshot_taken_at = now
104+
105+ self .screenshotIndex = (self .screenshotIndex or 0 ) % self .screenshotPoolSize + 1
106+ self .lastScreenshot = SCREENSHOTS_DIR .. " /debug_" .. self .screenshotIndex .. " .png"
107+
108+ love .graphics .captureScreenshot (self .lastScreenshot )
86109end
87110
88111--- Manages the print function internally
@@ -126,25 +149,17 @@ function FeatherLogger:log(line, screenshot)
126149 end
127150
128151 if screenshot and self .captureScreenshot then
129- local takeScreenshot = function ()
130- if not self .lastScreenshot then
131- return
132- end
133-
134- local fileData = self .lastScreenshot :encode (" png" )
135- local pngBytes = fileData :getString ()
136-
137- local b64 = love .data .encode (" string" , " base64" , pngBytes )
138- line .screenshot = b64
152+ if not self .lastScreenshot then
153+ return
139154 end
140155
141- local result , err = pcall (takeScreenshot )
142- if not result then
143- print (" Error capturing screenshot: " .. tostring (err ))
144- end
156+ local cwd = love .filesystem .getSaveDirectory ()
157+
158+ line .screenshot = cwd .. " /" .. self .lastScreenshot
145159 end
146160
147- line .id = tostring (os.time ())
161+ self .lastId = self .lastId + 1
162+ line .id = tostring (self .lastId )
148163 line .time = os.time ()
149164 line .count = 1
150165 line .trace = debug.traceback ()
0 commit comments