HomeServer/lualib-src/Server-main/Lib/Log/Logger.lua

191 lines
4.5 KiB
Lua
Raw Permalink Normal View History

2024-11-20 15:41:09 +08:00
local skynet = require "skynet"
require "skynet.manager"
local serverId = tonumber(skynet.getenv "serverId")
local MAIN_LOG_NAME = "skynet"
local ZERO_MOVE_TIME = 0 --second
local DEFAULT_FILE_MODE = "a"
local init = false
local log_service = {}
local service_file = {}
local fileName = ""
local log_service_no_change = {}
local dir_path = {}
local file_mode = {}
local is_daemon = skynet.getenv("daemon") ~= nil
is_daemon = true
local log_path = skynet.getenv("logpath")
local serverId = tonumber(skynet.getenv "serverId")
local function check_exists(path)
if not os.rename(path, path) then
os.execute("mkdir " .. path)
end
end
local function time_dir()
local now = math.floor(skynet.time())
local curr_time = {}
curr_time.year = os.date("%Y", now)
curr_time.month = os.date("%m", now)
curr_time.day = os.date("%d", now)
log_path = skynet.getenv("logpath")
check_exists(log_path)
for _, path in pairs(dir_path) do
check_exists(log_path..path)
end
log_path = string.format("log/Server_%d/%d-%d-%d/", serverId,curr_time.year,curr_time.month,curr_time.day)
check_exists(log_path)
for _, path in pairs(dir_path) do
check_exists(log_path..path)
end
for source, file in pairs(service_file) do
if not log_service_no_change[source] then
service_file[source] = nil
io.close(file)
end
end
local tomorrow_zore_time = os.time({year=curr_time.year, month=curr_time.month, day=curr_time.day, hour=0,min=0,sec=0}) + 86400 + ZERO_MOVE_TIME
skynet.timeout((tomorrow_zore_time-now)*100, function()
time_dir()
end )
end
local function file_path(path_file)
return log_path .. path_file .. ".log"
end
local function try_open_file(source)
local now = math.floor(skynet.time())
local year = os.date("%Y", now)
local month = os.date("%m", now)
local day = os.date("%d", now)
local hour = os.date("%H", now)
local path_file = string.format("%d-%d-%d-%d-%d",serverId,year,month,day,hour)
local opend_file = service_file[0]
if log_service[source] then
path_file = log_service[source]
opend_file = service_file[source]
end
if opend_file and path_file == fileName then
return opend_file
end
local args = DEFAULT_FILE_MODE
if file_mode[source] then
args = file_mode[source]
end
local f, e = io.open(file_path(path_file), args)
if not f then
print("error", path_file)
return
end
fileName = path_file
if log_service[source] then
service_file[source] = f
else
service_file[0] = f
end
return f
end
local function log_time()
local now = math.floor(skynet.time())
return string.format("%02d:%02d:%02d", tonumber(os.date("%H", now)), tonumber(os.date("%M", now)), tonumber(os.date("%S", now)))
end
local CMD = {}
local logging_fun = function(str)
print(str)
end
if is_daemon then
logging_fun = function(str, source)
local opend_file = try_open_file(source)
opend_file:write(str .. '\n')
opend_file:flush()
end
end
function CMD.logging(source, type, str)
str = string.format("[:%08x][%s][%s] %s", source, log_time(), type, str)
print(str)
logging_fun(str, source)
end
function CMD.separate(source, path, file, no_change_dir, mode)
if is_daemon then
file_mode[source] = mode or DEFAULT_FILE_MODE
check_exists(log_path..path)
dir_path[source] = path
log_service[source] = path.."/"..file
if no_change_dir then
log_service_no_change[source] = true
end
end
end
function CMD.close(source)
if is_daemon and log_service[source] and service_file[source] then
io.close(service_file[source])
log_service[source] = nil
service_file[source] = nil
file_mode[source] = nil
end
end
function CMD.forward(source, path, file, no_change_dir, mode)
if is_daemon then
if not path then
CMD.close(source)
else
CMD.close(source)
CMD.separate(source, path, file, no_change_dir)
file_mode[source] = mode or DEFAULT_FILE_MODE
end
end
end
skynet.register_protocol {
name = "text",
id = skynet.PTYPE_TEXT,
unpack = skynet.tostring,
dispatch = function(session, source, msg)
CMD.logging(source, "SKYNET", msg)
end
}
skynet.register_protocol {
name = "SYSTEM",
id = skynet.PTYPE_SYSTEM,
unpack = function(...) return ... end,
dispatch = function(_, source)
CMD.reopen(source, "SIGHUP", "SIGHUP")
end
}
time_dir()
skynet.start(function()
skynet.register(".logger")
skynet.dispatch("lua", function(session, source, cmd, ...)
local f = assert(CMD[cmd], cmd .. " not found")
if session > 0 then
skynet.ret(skynet.pack(f(source, ...)))
else
f(source, ...)
end
end)
end)