aboutsummaryrefslogtreecommitdiff
path: root/src/libjin-lua/scripts/log.lua
blob: 02ba234b53cd3449f5627ebcc622ac2486309e9b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
------------------------------------------------------------------------------------------------------------------
-- https://github.com/rxi/log.lua
------------------------------------------------------------------------------------------------------------------

local log = { _version = "0.1.0" }

log.usecolor = false
log.outfile = nil
log.level = "trace"


local modes = {
    { name = "trace", color = "\27[34m", },
    { name = "debug", color = "\27[36m", },
    { name = "info",    color = "\27[32m", },
    { name = "warn",    color = "\27[33m", },
    { name = "error", color = "\27[31m", },
    { name = "fatal", color = "\27[35m", },
}


local levels = {}
for i, v in ipairs(modes) do
    levels[v.name] = i
end


local round = function(x, increment)
    increment = increment or 1
    x = x / increment
    return (x > 0 and math.floor(x + .5) or math.ceil(x - .5)) * increment
end


local _tostring = tostring

local tostring = function(...)
    local t = {}
    for i = 1, select('#', ...) do
        local x = select(i, ...)
        if type(x) == "number" then
            x = round(x, .01)
        end
        t[#t + 1] = _tostring(x)
    end
    return table.concat(t, " ")
end


for i, x in ipairs(modes) do
    local nameupper = x.name:upper()
    log[x.name] = function(...)
        
        -- Return early if we're below the log level
        if i < levels[log.level] then
            return
        end

        local msg = tostring(...)
        local info = debug.getinfo(2, "Sl")
        local lineinfo = info.short_src .. ":" .. info.currentline

        -- Output to console
        print(string.format("%s[%-6s%s]%s %s: %s",
                                                log.usecolor and x.color or "",
                                                nameupper,
                                                os.date("%H:%M:%S"),
                                                log.usecolor and "\27[0m" or "",
                                                lineinfo,
                                                msg))

        -- Output to log file
        if log.outfile then
            local fp = io.open(log.outfile, "a")
            local str = string.format("[%-6s%s] %s: %s\n",
                                                                nameupper, os.date(), lineinfo, msg)
            fp:write(str)
            fp:close()
        end

    end
end

------------------------------------------------------------------------------------------------------------------
-- Export to Jin. 
------------------------------------------------------------------------------------------------------------------

jin.log = log