diff --git a/docs/日志说明.xlsx b/docs/日志说明.xlsx new file mode 100644 index 0000000..67cb046 Binary files /dev/null and b/docs/日志说明.xlsx differ diff --git a/src/actions/EmailAction.lua b/src/actions/EmailAction.lua index 7d10887..53f85d1 100644 --- a/src/actions/EmailAction.lua +++ b/src/actions/EmailAction.lua @@ -53,7 +53,7 @@ function _M.listRpc(agent, data) content = email.content, attachments = email.attachments }) - --role:log("mail_actions", {desc = "get_global", s1 = email.title, s2 = email.attachments}) + role:log("mail_actions", {desc = "get_global", key1 = email.title, key2 = email.attachments}) end end end @@ -98,7 +98,7 @@ function _M.drawAllAttachRpc(agent, data) local items = role:award(attachments) ids[emailId] = 1 red:hset(string.format(R_EMAIL_ITEM, roleId, emailId), "status", 2) - -- role:log("mail_actions", {desc = "draw_attach", int1 = emailId, s1 = email:getProperty("title"), s2 = attachments}) + role:log("mail_actions", {desc = "draw_attach", int1 = emailId, key1 = email:getProperty("title"), key2 = attachments}) for key, v in pairs(items) do reward[key] = (reward[key] or 0) + v @@ -129,7 +129,7 @@ function _M.drawAttachRpc(agent, data) redisproxy:hset(rds, "status", 2) -- 领取标记 SendPacket(actionCodes.Email_drawAttachRpc, MsgPack.pack({reward = reward})) - -- role:log("mail_actions", {desc = "draw_attach", int1 = id, s1 = email:getProperty("title"), s2 = attachments, ucode = ucode}) + role:log("mail_actions", {desc = "draw_attach", int1 = id, key1 = email:getProperty("title"), key2 = attachments}) return true end @@ -144,7 +144,7 @@ function _M.checkRpc(agent, data) if not redisproxy:exists(rds) then return end redisproxy:hset(rds, "status", 1) - -- role:log("mail_actions", {desc = "check_mail", int1 = id}) + role:log("mail_actions", {desc = "check_mail", int1 = id}) SendPacket(actionCodes.Email_checkRpc, '') return true @@ -179,9 +179,9 @@ function _M.delRpc(agent, data) end end end) - -- for delId, _ in ipairs(result) do - -- role:log("mail_actions", {desc = "del_mail", int1 = delId}) - -- end + for delId, _ in ipairs(result) do + role:log("mail_actions", {desc = "del_mail", int1 = delId}) + end SendPacket(actionCodes.Email_delRpc, MsgPack.pack({result = result})) return true end diff --git a/src/actions/RoleAction.lua b/src/actions/RoleAction.lua index a95034e..1bea077 100644 --- a/src/actions/RoleAction.lua +++ b/src/actions/RoleAction.lua @@ -94,6 +94,8 @@ function _M.loginRpc( agent, data ) role = require("models.Role").new({key = roleKey}) role:load() role:loadAll() + role:startActionUcode() + role:setProperty("ltime", now) else role:reloadWhenLogin() end @@ -120,7 +122,6 @@ function _M.loginRpc( agent, data ) -- 跨天登陆事件 role:updateTimeReset(now) - role:setProperty("ltime", now) redisproxy:zadd(FRIEND_RECOMMEND, now, roleId) for _, name in ipairs({"dailyData", "dinerData"}) do @@ -291,7 +292,7 @@ function _M.createRpc(agent, data) SendPacket(actionCodes.Role_createRpc, MsgPack.pack(response)) return true end - + newRole:startActionUcode() newRole:award(globalCsv.birthItem) -- 欢迎邮件 redisproxy:insertEmail({roleId = roleId, emailId = 1}) @@ -394,8 +395,8 @@ function _M.saleItemRpc(agent, data) reward[sellEffect[1]] = (reward[sellEffect[1]] or 0) + sellEffect[2] * count end - role:costItems(backs) - local reward = role:award(reward) + role:costItems(backs, {log = {desc = "saleItem"}}) + local reward = role:award(reward, {log = {desc = "saleItem"}}) role:checkTaskEnter("DecoFrag", {count = fragCount}) SendPacket(actionCodes.Role_saleItemRpc, MsgPack.pack({reward = reward})) return true @@ -433,8 +434,8 @@ function _M.openItemRpc(agent, data) end reward[0] = nil - role:costItems({[itemId] = count}) - reward = role:award(reward) + role:costItems({[itemId] = count}, {log = {desc = "openItem"}}) + reward = role:award(reward, {log = {desc = "openItem", int1 = itemId, int2 = count}}) SendPacket(actionCodes.Role_openItemRpc, MsgPack.pack({reward = reward})) return true @@ -457,7 +458,7 @@ function _M.openTimeBoxRpc(agent, data) if not itemData or not randomData or randomData.openTime <= 0 then return end if boxL[slot] then return end - role:costItems({[itemId] = 1}) + role:costItems({[itemId] = 1}, {log = {desc = "openTimeBox"}}) boxL[slot] = {id = itemId, time = skynet.timex() + randomData.openTime} elseif oper == 2 then -- 领取 @@ -468,7 +469,7 @@ function _M.openTimeBoxRpc(agent, data) local cost_pre = globalCsv.box_timeOpen_diamond:toArray(true, "=") local costD = math.ceil((boxL[slot].time - skynet.timex()) / (cost_pre[1] * 60)) * cost_pre[2] if not role:checkItemEnough({[ItemId.BoxKey] = costD}) then return end - role:costItems({[ItemId.BoxKey] = costD}) + role:costItems({[ItemId.BoxKey] = costD}, {log = {desc = "openTimeBox"}}) end local boxId = boxL[slot].id local itemData = csvdb["itemCsv"][boxId] @@ -496,7 +497,7 @@ function _M.openTimeBoxRpc(agent, data) reward[0] = nil boxL[slot] = nil - reward = role:award(reward) + reward = role:award(reward, {log = {desc = "openTimeBox", int1 = boxId}}) role:checkTaskEnter("OpenBox", {id = boxId}) else return @@ -554,8 +555,8 @@ function _M.openSpeedUpBoxRpc(agent, data) return end - role:costItems({[id] = count}) - reward = role:award(reward) + role:costItems({[id] = count}, {log = {desc = "speedUpBox"}}) + reward = role:award(reward, {log = {desc = "speedUpBox"}, int1 = id, int2 = count}) SendPacket(actionCodes.Role_openSpeedUpBoxRpc, MsgPack.pack({reward = reward})) return true @@ -574,7 +575,7 @@ function _M.storyBookRewardRpc(agent, data) -- 获取奖励 storyStatus[storyId].s = -1 role:changeUpdates({{ type = "storyB", field = storyId, value = storyStatus[storyId] }}) - local reward = role:award(storyBookData.gift) + local reward = role:award(storyBookData.gift, {log = {desc = "storybookReward", int1 = storyId}}) SendPacket(actionCodes.Role_storyBookRewardRpc, MsgPack.pack({reward = reward})) return true end @@ -594,7 +595,7 @@ function _M.unLockStoryBookRpc(agent, data) if not cost or not next(cost) then return end if not role:checkItemEnough(cost) then return end -- 消耗品不足 - role:costItems(cost) + role:costItems(cost, {log = {desc = "unlockStory", int1 = storyId}}) -- 解锁 storyStatus[storyId] = storyStatus[storyId] or {} @@ -626,7 +627,7 @@ function _M.taskRpc(agent, data) return 3 end - local reward = role:award(taskData.reward) + local reward = role:award(taskData.reward, {log = {desc = "finishTask", int1 = taskType, int2 = taskId}}) local active = (taskStatus["a"] or 0) + taskData.active role:changeUpdates({ @@ -659,7 +660,7 @@ function _M.taskActiveRpc(agent, data) return end - local reward = role:award(taskData.reward) + local reward = role:award(taskData.reward, {log = {desc = "taskActive", int1 = taskType, int2 = taskId}}) role:changeUpdates({ { type = roleField[taskType], field = {"at", taskId}, value = -1 } }) @@ -690,7 +691,7 @@ function _M.achiveRpc(agent, data) return 3 end - local reward = role:award(achiveTask.reward) + local reward = role:award(achiveTask.reward, {log = {desc = "finishAchive", int1 = taskId}}) role:changeUpdates({ { type = "achiveV", field = taskId, value = skynet.timex() } }) @@ -869,6 +870,8 @@ function _M.changeSettingRpc(agent, data) setting[id] = status role:updateProperty({field = "setting", value = setting}) + role:log("role_action", {desc = "changeSetting", int1 = id, int2 = status}) + SendPacket(actionCodes.Role_changeSettingRpc, '') return true end @@ -897,7 +900,7 @@ function _M.drawCodeRpc(agent, data) if ret == 0 then local giftId = tonumber(result.giftId) role:setProperty("codeStr", codestr:setv(giftId, 1)) - local reward = role:award(result.gift) + local reward = role:award(result.gift, {desc = "drawCode", key1 = code, int1 = giftId}) SendPacket(actionCodes.Role_drawCodeRpc, MsgPack.pack({ result = ret, @@ -941,6 +944,8 @@ function _M.changeHeadRpc(agent, data) end role:updateProperty({field = "headId" ,value = id}) role:changeCrossServerPvpSelfInfo("headId") + role:log("role_action", {desc = "changeHead", int1 = id}) + SendPacket(actionCodes.Role_changeHeadRpc, "") return true end @@ -960,6 +965,7 @@ function _M.guideRpc(agent, data) if master < 0 or slave < 0 then return end newerGuide = string.format("%d=%d",master,slave) role:updateProperty({field = "newerGuide", value = newerGuide}) + role:log("guide", {int1 = master*1000+slave}) elseif cmdType == 2 then -- 系统引导 if not msg.skip then return end @@ -972,6 +978,7 @@ function _M.guideRpc(agent, data) if msg.funcType then funcGuide = funcGuide:setv(msg.funcType, 1) + role:log("guide_sys", {int1 = msg.funcType}) end role:updateProperty({field = "funcGuide", value = funcGuide}) elseif cmdType == 3 then @@ -979,6 +986,7 @@ function _M.guideRpc(agent, data) if msg.funcType then local value = msg.value or 1 for _, funcIdx in pairs(msg.funcType:toArray(true,"=")) do + role:log("guide_weak", {int1 = funcIdx}) funcGuide = funcGuide:setv(funcIdx, value) end role:updateProperty({field = "funcGuide", value = funcGuide}) diff --git a/src/agent.lua b/src/agent.lua index 2b34a8a..eb2e5e6 100644 --- a/src/agent.lua +++ b/src/agent.lua @@ -39,6 +39,7 @@ local function handle_timeout() end function start_agent_timer() + if agentInfo.open_timer then return end agentInfo.open_timer = true skynet.timeout(150, handle_timeout) end @@ -186,7 +187,18 @@ skynet.register_protocol { end if #data > 0 then data = xxtea.decrypt(data, XXTEA_KEY) end + + -- 一次操作是一个关联操作 记录 ucode 是一样的 + if agentInfo.role then + agentInfo.role:startActionUcode() + end + local result = method(agentInfo, data) + + if agentInfo.role then + agentInfo.role:endActionUcode() + end + if not result or type(result) == "number" then SendPacket(actionCodes.Sys_innerErrorMsg, MsgPack.pack({id = cmd * 100 + (result or 0)})) end diff --git a/src/models/RoleLog.lua b/src/models/RoleLog.lua index f3f85b4..c2055bc 100644 --- a/src/models/RoleLog.lua +++ b/src/models/RoleLog.lua @@ -5,6 +5,20 @@ local LogType = { login = "common", logout = "common", gm = "common", + mail_actions = "common", + in_item = "common", + out_item = "common", + in_diamond = "common", + out_diamond = "common", + in_hero = "common", + out_hero = "common", + in_equip = "common", + out_equip = "common", + in_rune = "common", + out_rune = "common", + player_exp = "common", + func_open = "common", + role_action = "common", } -- 如要修改 要提前修改 _template mapping -- 对应 mapping 为 gamelog-* @@ -23,6 +37,11 @@ local Mapping = { int2 = "integer", long1 = "long", float1 = "float", + + -- 底层使用的 一些参数 + cint1 = "integer", + cint2 = "integer", + cint3 = "integer", } } @@ -156,6 +175,9 @@ function RoleLog.bind(Role) end local mapping = Mapping[_logType] + if mapping["ucode"] and not contents["ucode"] then + contents["ucode"] = self:getActionUcode() + end for field, value in pairs(contents) do local ftype = mapping[field] @@ -168,5 +190,24 @@ function RoleLog.bind(Role) if not logd then return end pcall(skynet.send, logd, "lua", "log", logType, doc, _logType) end + + function Role:startActionUcode() + if not self._uniqueCount then + self._uniqueCount = 0 + end + local action = {self:getProperty("id"), skynet.timex(), self._uniqueCount} + self._uniqueCount = self._uniqueCount + 1 + + self._actionUcode = table.concat(action, "_") + end + + function Role:endActionUcode() + self._actionUcode = nil + end + + function Role:getActionUcode() + return self._actionUcode + end + end return RoleLog \ No newline at end of file diff --git a/src/models/RolePlugin.lua b/src/models/RolePlugin.lua index 8c90a01..cb569a7 100644 --- a/src/models/RolePlugin.lua +++ b/src/models/RolePlugin.lua @@ -59,7 +59,7 @@ function RolePlugin.bind(Role) local itemIdAward = { [ItemId.PlayerExp] = function() - self:addPlayExp(count) + self:addPlayExp(count, pms) end, } @@ -80,14 +80,14 @@ function RolePlugin.bind(Role) [ItemType.Rune] = function() local typ = math.floor((itemId-10000)/1000) for _= 1, count do - self:addRune({type = typ,id = itemId, pms.notNotify}) + self:addRune({type = typ,id = itemId, notNotify = pms.notNotify, log = pms.log}) end end, [ItemType.AdvItem] = function() --冒险道具不会进入 玩家仓库 count = 0 end, [ItemType.FuncOpen] = function() - self:funcOpen(itemId, count) + self:funcOpen(itemId, count, pms) end, } -- 对数量筛查 @@ -139,7 +139,7 @@ function RolePlugin.bind(Role) return reward, allChange --实际获得的奖励 和 最高级奖励转化过程 end - function Role:addPlayExp(addExp) + function Role:addPlayExp(addExp, params) local level = self:getProperty("level") if not csvdb["player_expCsv"][level + 1] then return @@ -155,6 +155,22 @@ function RolePlugin.bind(Role) newExp = csvdb["player_expCsv"][level].exp - 1 -- 没有下一级了 经验溢出太多 扣除 end end + + if params.log then + local log = clone(params.log) + if log["cint1"] or log["cint2"] then + print("addPlayExp error log have cint1 or cint2 or cint3", debug.traceback()) + end + + log["cint1"] = addExp + log["cint2"] = newExp + log["cint3"] = level + + self:log("player_exp", log) + else + print("addPlayExp no log ", debug.traceback()) + end + self:updateProperties({level = level, exp = newExp}) self:changeCrossServerPvpSelfInfo("level") end @@ -174,6 +190,23 @@ function RolePlugin.bind(Role) else items = items:incrv(params.itemId, params.count) end + + if params.log then + local log = clone(params.log) + if log["cint1"] or log["cint2"] then + print("addItem error log have cint1 or cint2 ", debug.traceback()) + end + log["cint1"] = params.itemId + log["cint2"] = math.abs(params.count) + if params.count <= 0 then + self:log("out_item", log) + else + self:log("in_item", log) + end + else + print("addItem no log ", debug.traceback()) + end + self:setProperty("items", items) if not params.notNotify then SendPacket(actionCodes.Role_updateItems, MsgPack.pack({[params.itemId] = nums})) @@ -241,6 +274,19 @@ function RolePlugin.bind(Role) else self:incrProperty("diamond", count) end + + if params.log then + local log = clone(params.log) + if log["cint1"] or log["cint2"] or log["cint3"] then + print("costDiamond error log have cint1 or cint2 or cint3 ", debug.traceback()) + end + log["cint1"] = origin + log["cint2"] = count + self:log("in_diamond", log) + else + print("gainDiamond no log ", debug.traceback()) + end + self:notifyUpdateProperty("diamond", self:getAllDiamond()) return true end @@ -277,6 +323,18 @@ function RolePlugin.bind(Role) self:incrProperty(costFirst[2], -last) end + if params.log then + local log = clone(params.log) + if log["cint1"] or log["cint2"] or log["cint3"] then + print("costDiamond error log have cint1 or cint2 or cint3 ", debug.traceback()) + end + log["cint1"] = origin + log["cint2"] = count + self:log("out_diamond", log) + else + print("costDiamond no log ", debug.traceback()) + end + self:notifyUpdateProperty("diamond", self:getAllDiamond()) return true end @@ -311,6 +369,17 @@ function RolePlugin.bind(Role) local bin = MsgPack.pack(heroResponse) SendPacket(actionCodes.Hero_loadInfos, bin) end + if params.log then + local log = clone(params.log) + if log["cint1"] or log["cint2"] or log["cint3"] then + print("addHero error log have cint1 or cint2 or cint3 ", debug.traceback()) + end + log["cint1"] = heroId + log["cint2"] = heroType + self:log("in_hero", log) + else + print("addHero no log ", debug.traceback()) + end return true, newHero end @@ -323,9 +392,11 @@ function RolePlugin.bind(Role) end end - function Role:delHero(heroId) + function Role:delHero(heroId, params) + params = params or {} local roleId = self:getProperty('id') local hero = self.heros[heroId] + local heroType = hero:getProperty("type") if not hero then return end self.heros[heroId] = nil @@ -333,6 +404,19 @@ function RolePlugin.bind(Role) red:del(string.format(R_HERO, roleId, heroId)) red:srem(string.format(R_HEROS, roleId), heroId) end) + + if params.log then + local log = clone(params.log) + if log["cint1"] or log["cint2"] or log["cint3"] then + print("delHero error log have cint1 or cint2 or cint3 ", debug.traceback()) + end + log["cint1"] = heroId + log["cint2"] = heroType + self:log("out_hero", log) + else + print("delHero no log ", debug.traceback()) + end + SendPacket(actionCodes.Hero_loadInfos, MsgPack.pack({{id = heroId, bDel = true}})) end @@ -406,6 +490,24 @@ function RolePlugin.bind(Role) end self:setProperty("equips", equips) + + if pms.log then + local log = clone(pms.log) + if log["cint1"] or log["cint2"] or log["cint3"] then + print("addEquip error log have cint1 or cint2 or cint3 ", debug.traceback()) + end + log["cint1"] = equipType + log["cint2"] = equipLv + log["cint3"] = math.abs(count) + if count < 0 then + self:log("out_equip", log) + else + self:log("in_equip", log) + end + else + print("addEquip no log ", debug.traceback()) + end + if not pms.notNotify then self:changeUpdates({{type = "equips", field = {equipType, equipLv}, value = curCount, isOnlyToC = true}}) -- 通知客户端 end @@ -463,18 +565,51 @@ function RolePlugin.bind(Role) SendPacket(actionCodes.Role_loadRunes, MsgPack.pack(response)) end self:checkTaskEnter("AddRune", {id = params.id, type = params.type, rarity = data.rarity}, params.notNotify) + + if params.log then + local log = clone(params.log) + if log["cint1"] or log["cint2"] or log["cint3"] then + print("addRune error log have cint1 or cint2 or cint3 ", debug.traceback()) + end + + log["cint1"] = runeUid + log["cint2"] = params.type + log["cint3"] = params.id + + self:log("in_rune", log) + else + print("addRune no log ", debug.traceback()) + end + return 0, newRune else return 1 end end - function Role:delRunes(runeIds) -- 批量删除 {id, } + function Role:delRunes(runeIds, params) -- 批量删除 {id, } + params = params or {} local roleId = self:getProperty('id') local bDel = {} for _, runeId in pairs(runeIds) do local rune = self.runeBag[runeId] if rune and rune:getProperty("refer") == 0 then + + if params.log then + local log = clone(params.log) + if log["cint1"] or log["cint2"] or log["cint3"] then + print("delRunes error log have cint1 or cint2 or cint3 ", debug.traceback()) + end + + log["cint1"] = runeId + log["cint2"] = rune:getProperty("type") + log["cint3"] = rune:getProperty("id") + + self:log("out_rune", log) + else + print("delRunes no log ", debug.traceback()) + end + self.runeBag[runeId] = nil table.insert(bDel, runeId) end @@ -528,9 +663,8 @@ function RolePlugin.bind(Role) heartWarning = heartWarning + 1 self:setProperty("heartWarning", heartWarning) if heartWarning == 50 then - self:setProperty("delete", 1) + self:setBan(30, 1) --封禁 30天 self:sendGmMsg("server_accountBanned_inGame_1") - self:log("gm",{desc = "ban"}) return end if heartWarning < 50 and heartWarning % 5 == 0 then @@ -687,8 +821,25 @@ function RolePlugin.bind(Role) return true end - function Role:funcOpen(func, count) + function Role:funcOpen(func, count, params) + params = params or {} + count = count or 1 + + if params.log then + local log = clone(params.log) + if log["cint1"] or log["cint2"] or log["cint3"] then + print("funcOpen error log have cint1 or cint2 or cint3 ", debug.traceback()) + end + + log["cint1"] = func + log["cint2"] = count + + self:log("func_open", log) + else + print("funcOpen no log ", debug.traceback()) + end + if csvdb["itemCsv"][func] and csvdb["itemCsv"][func].type == ItemType.FuncOpen then local unlockData = csvdb["unlockCsv"][func] if unlockData.type == 4 then -- 解锁神器 -- libgit2 0.21.2