summaryrefslogtreecommitdiff
path: root/tex/context/base/mkiv/trac-log.lua
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/mkiv/trac-log.lua')
-rw-r--r--tex/context/base/mkiv/trac-log.lua227
1 files changed, 167 insertions, 60 deletions
diff --git a/tex/context/base/mkiv/trac-log.lua b/tex/context/base/mkiv/trac-log.lua
index b6bb123cf..c7b6f6d2d 100644
--- a/tex/context/base/mkiv/trac-log.lua
+++ b/tex/context/base/mkiv/trac-log.lua
@@ -20,8 +20,8 @@ local openfile = io.open
local setmetatableindex = table.setmetatableindex
local formatters = string.formatters
-
-local texgetcount = tex and tex.getcount
+local settings_to_hash = utilities.parsers.settings_to_hash
+local sortedkeys = table.sortedkeys
-- variant is set now
@@ -575,15 +575,15 @@ logs.newline = newline
-- todo: renew (un) locks when a new one is added and wildcard
-local data, states = { }, nil
+local data = { }
+local states = nil
+local force = false
function logs.reporter(category,subcategory)
local logger = data[category]
if not logger then
- local state = false
- if states == true then
- state = true
- elseif type(states) == "table" then
+ local state = states == true
+ if not state and type(states) == "table" then
for c, _ in next, states do
if find(category,c) then
state = true
@@ -593,7 +593,7 @@ function logs.reporter(category,subcategory)
end
logger = {
reporters = { },
- state = state,
+ state = state,
}
data[category] = logger
end
@@ -601,7 +601,7 @@ function logs.reporter(category,subcategory)
if not reporter then
if subcategory then
reporter = function(...)
- if not logger.state then
+ if force or not logger.state then
subreport(category,subcategory,...)
end
end
@@ -609,7 +609,7 @@ function logs.reporter(category,subcategory)
else
local tag = category
reporter = function(...)
- if not logger.state then
+ if force or not logger.state then
report(category,...)
end
end
@@ -645,7 +645,7 @@ end
-- so far
local function setblocked(category,value) -- v.state == value == true : disable
- if category == true then
+ if category == true or category == "all" then
-- lock all
category, value = "*", true
elseif category == false then
@@ -661,7 +661,8 @@ local function setblocked(category,value) -- v.state == value == true : disable
v.state = value
end
else
- states = utilities.parsers.settings_to_hash(category,type(states)=="table" and states or nil)
+ alllocked = false
+ states = settings_to_hash(category,type(states)=="table" and states or nil)
for c in next, states do
local v = data[c]
if v then
@@ -687,7 +688,7 @@ function logs.enable(category)
end
function logs.categories()
- return table.sortedkeys(data)
+ return sortedkeys(data)
end
function logs.show()
@@ -710,7 +711,7 @@ function logs.show()
max = m
end
end
- local subcategories = concat(table.sortedkeys(reporters),", ")
+ local subcategories = concat(sortedkeys(reporters),", ")
if state == true then
state = "disabled"
elseif state == false then
@@ -746,59 +747,64 @@ end)
-- tex specific loggers (might move elsewhere)
-local report_pages = logs.reporter("pages") -- not needed but saves checking when we grep for it
-
-local real, user, sub
+if tex then
-function logs.start_page_number()
- real = texgetcount("realpageno")
- user = texgetcount("userpageno")
- sub = texgetcount("subpageno")
-end
+ local report = logs.reporter("pages") -- not needed but saves checking when we grep for it
+ local texgetcount = tex and tex.getcount
-local timing = false
-local starttime = nil
-local lasttime = nil
+ local real, user, sub
-trackers.register("pages.timing", function(v) -- only for myself (diagnostics)
- starttime = os.clock()
- timing = true
-end)
+ function logs.start_page_number()
+ real = texgetcount("realpageno")
+ user = texgetcount("userpageno")
+ sub = texgetcount("subpageno")
+ end
-function logs.stop_page_number() -- the first page can includes the initialization so we omit this in average
- if timing then
- local elapsed, average
- local stoptime = os.clock()
- if not lasttime or real < 2 then
- elapsed = stoptime
- average = stoptime
- starttime = stoptime
- else
- elapsed = stoptime - lasttime
- average = (stoptime - starttime) / (real - 1)
- end
- lasttime = stoptime
- if real <= 0 then
- report_pages("flushing page, time %0.04f / %0.04f",elapsed,average)
- elseif user <= 0 then
- report_pages("flushing realpage %s, time %0.04f / %0.04f",real,elapsed,average)
- elseif sub <= 0 then
- report_pages("flushing realpage %s, userpage %s, time %0.04f / %0.04f",real,user,elapsed,average)
- else
- report_pages("flushing realpage %s, userpage %s, subpage %s, time %0.04f / %0.04f",real,user,sub,elapsed,average)
- end
- else
- if real <= 0 then
- report_pages("flushing page")
- elseif user <= 0 then
- report_pages("flushing realpage %s",real)
- elseif sub <= 0 then
- report_pages("flushing realpage %s, userpage %s",real,user)
+ local timing = false
+ local starttime = nil
+ local lasttime = nil
+
+ trackers.register("pages.timing", function(v) -- only for myself (diagnostics)
+ starttime = os.clock() -- todo: use other timer
+ timing = true
+ end)
+
+ function logs.stop_page_number() -- the first page can includes the initialization so we omit this in average
+ if timing then
+ local elapsed, average
+ local stoptime = os.clock()
+ if not lasttime or real < 2 then
+ elapsed = stoptime
+ average = stoptime
+ starttime = stoptime
+ else
+ elapsed = stoptime - lasttime
+ average = (stoptime - starttime) / (real - 1)
+ end
+ lasttime = stoptime
+ if real <= 0 then
+ report("flushing page, time %0.04f / %0.04f",elapsed,average)
+ elseif user <= 0 then
+ report("flushing realpage %s, time %0.04f / %0.04f",real,elapsed,average)
+ elseif sub <= 0 then
+ report("flushing realpage %s, userpage %s, time %0.04f / %0.04f",real,user,elapsed,average)
+ else
+ report("flushing realpage %s, userpage %s, subpage %s, time %0.04f / %0.04f",real,user,sub,elapsed,average)
+ end
else
- report_pages("flushing realpage %s, userpage %s, subpage %s",real,user,sub)
+ if real <= 0 then
+ report("flushing page")
+ elseif user <= 0 then
+ report("flushing realpage %s",real)
+ elseif sub <= 0 then
+ report("flushing realpage %s, userpage %s",real,user)
+ else
+ report("flushing realpage %s, userpage %s, subpage %s",real,user,sub)
+ end
end
+ logs.flush()
end
- logs.flush()
+
end
-- we don't have show_open and show_close callbacks yet
@@ -1039,3 +1045,104 @@ io.stderr:setvbuf('no')
if package.helpers.report then
package.helpers.report = logs.reporter("package loader") -- when used outside mtxrun
end
+
+if tex then
+
+ local finalactions = { }
+ local fatalerrors = { }
+ local possiblefatal = { }
+ local loggingerrors = false
+
+ function logs.loggingerrors()
+ return loggingerrors
+ end
+
+ directives.register("logs.errors",function(v)
+ loggingerrors = v
+ if type(v) == "string" then
+ fatalerrors = settings_to_hash(v)
+ else
+ fatalerrors = { }
+ end
+ end)
+
+ function logs.registerfinalactions(...)
+ insert(finalactions,...) -- so we can force an order if needed
+ end
+
+ local what = nil
+ local report = nil
+ local state = nil
+ local target = nil
+
+ local function startlogging(t,r,w,s)
+ target = t
+ state = force
+ force = true
+ report = type(r) == "function" and r or logs.reporter(r)
+ what = w
+ pushtarget(target)
+ newline()
+ if s then
+ report("start %s: %s",what,s)
+ else
+ report("start %s",what)
+ end
+ if target == "logfile" then
+ newline()
+ end
+ return report
+ end
+
+ local function stoplogging()
+ if target == "logfile" then
+ newline()
+ end
+ report("stop %s",what)
+ if target == "logfile" then
+ newline()
+ end
+ poptarget()
+ state = oldstate
+ end
+
+ function logs.startfilelogging(...)
+ return startlogging("logfile", ...)
+ end
+
+ logs.stopfilelogging = stoplogging
+
+ local done = false
+
+ function logs.starterrorlogging(r,w,...)
+ if not done then
+ pushtarget("terminal")
+ newline()
+ logs.report("error logging","start possible issues")
+ poptarget()
+ done = true
+ end
+ if fatalerrors[w] then
+ possiblefatal[w] = true
+ end
+ return startlogging("terminal",r,w,...)
+ end
+
+ logs.stoperrorlogging = stoplogging
+
+ function logs.finalactions()
+ if #finalactions > 0 then
+ for i=1,#finalactions do
+ finalactions[i]()
+ end
+ if done then
+ pushtarget("terminal")
+ newline()
+ logs.report("error logging","stop possible issues")
+ poptarget()
+ end
+ return next(possiblefatal) and sortedkeys(possiblefatal) or false
+ end
+ end
+
+end