lib_logger.lua 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. local skynet = require "skynet"
  2. local skynet_core = require "skynet.core"
  3. local levels = {"DEBUG", "INFO", "WARN", "ERROR", "FATAL"}
  4. local root = {
  5. level = 0,
  6. logger = nil, -- c service logger handle
  7. date = nil, -- 2015-02-03
  8. file = "", --日志文件前缀
  9. filename = "", --当前打开日志文件名
  10. logger_mode = nil,
  11. logger_dir = nil
  12. }
  13. function root.get_logger(file)
  14. local o = {}
  15. setmetatable(o, root)
  16. root.__index = root
  17. o.file = file
  18. local logger = {}
  19. local function get_logger(name)
  20. return function(...)
  21. local f = o[name]
  22. f(o, ...)
  23. end
  24. end
  25. logger.debug = get_logger("debug")
  26. logger.info = get_logger("info")
  27. logger.warn = get_logger("warn")
  28. logger.error = get_logger("error")
  29. logger.fatal = get_logger("fatal")
  30. logger.raw_log = get_logger("raw_log")
  31. logger.set_level = function(level)
  32. o:set_level(level)
  33. end
  34. return logger
  35. end
  36. function root:new(file)
  37. local o = {}
  38. setmetatable(o, self)
  39. self.__index = self
  40. o.file = file
  41. return o
  42. end
  43. -- 获取日志级别 level is number
  44. function root:get_logger_level()
  45. local level = self.logger_mode
  46. for k, v in ipairs(levels) do
  47. if v == level then
  48. return k
  49. end
  50. end
  51. return 1
  52. end
  53. function root:open()
  54. local date = os.date("%Y-%m-%d", skynet_time())
  55. if not self.logger_mode then
  56. self.logger_mode = skynet.getenv("logmode") or "DEBUG"
  57. self.level = self:get_logger_level() -- 设置日志级别
  58. end
  59. self.logger_dir = skynet.getenv("logpath")
  60. local filename = self.logger_dir .. self.file .. "-" .. date .. ".log"
  61. local logger = skynet.call(".jmlogger", "lua", "open", filename)
  62. self.filename = filename
  63. self.logger = logger
  64. end
  65. function root:set_level(level)
  66. self.level = level
  67. end
  68. function root:log(level, fmt, ...)
  69. local now = skynet_time()
  70. local date = os.date("%Y-%m-%d", now)
  71. if not self.logger then --日志文件还没有打开
  72. self.date = date
  73. self:open()
  74. if self.level > level then
  75. return
  76. end
  77. end
  78. if os.date("%Y-%m-%d", now) ~= self.date then
  79. skynet.send(".jmlogger", "lua", "close", self.filename)
  80. self.date = date
  81. self:open()
  82. end
  83. --加入行号和文件名
  84. local info = debug.getinfo(4, "nSl")
  85. local s =
  86. string.format(
  87. "[%s] [%s] [::%s] [line:%-4d] " .. fmt,
  88. os.date("%H:%M:%S", now),
  89. levels[level],
  90. info.source,
  91. info.currentline,
  92. ...
  93. )
  94. if IS_DEBUG then
  95. print(s)
  96. end
  97. skynet_core.send(self.logger, 0, 0, s)
  98. if level >= 3 then
  99. s = string.format("[%s] [%s] [" .. self.filename .. "] " .. fmt, os.date("%H:%M:%S", now), levels[level], ...)
  100. skynet.error(s)
  101. end
  102. end
  103. -- 原始日志,不设级别,不打印时间,不换自动换行
  104. function root:raw_log(fmt, ...)
  105. local now = skynet_time()
  106. local date = os.date("%Y-%m-%d", now)
  107. if not self.logger then --日志文件还没有打开
  108. self.date = date
  109. self:open()
  110. end
  111. if os.date("%Y-%m-%d", now) ~= self.date then
  112. skynet.send(".jmlogger", "lua", "close", self.filename)
  113. self.date = date
  114. self:open()
  115. end
  116. local s = string.format(fmt, ...)
  117. skynet_core.send(self.logger, 1, 0, s)
  118. end
  119. function root:debug(...)
  120. if self.level > 1 then
  121. return
  122. end
  123. self:log(1, ...)
  124. end
  125. function root:info(...)
  126. if self.level > 2 then
  127. return
  128. end
  129. self:log(2, ...)
  130. end
  131. function root:warn(...)
  132. if self.level > 3 then
  133. return
  134. end
  135. self:log(3, ...)
  136. end
  137. function root:error(...)
  138. if self.level > 4 then
  139. return
  140. end
  141. self:log(4, ...)
  142. end
  143. function root:fatal(...)
  144. self:log(5, ...)
  145. end
  146. return root