Blame view

src/models/RoleLog.lua 6.55 KB
4c5d72ab   zhouhaihai   高级pvp
1
  
df883a11   zhouhaihai   日志处理
2
  -- logType
4c5d72ab   zhouhaihai   高级pvp
3
  local LogType = {
df883a11   zhouhaihai   日志处理
4
5
6
  	create = "common",
  	login = "common",
  	logout = "common",
3133cb76   zhouhaihai   日志
7
8
  	guide = "common",
  	
44c6e479   zhouhaihai   增加部分日志
9
10
11
12
13
14
15
16
17
18
19
20
  	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",
3133cb76   zhouhaihai   日志
21
22
23
24
25
  	in_adv = "common",
  	out_adv = "common",
  	in_artifact = "common",
  
  	mail_action = "common",
44c6e479   zhouhaihai   增加部分日志
26
  	role_action = "common",
3133cb76   zhouhaihai   日志
27
28
29
30
31
32
33
34
  	hang_action = "common",
  	hero_action = "common",
  	adv_action = "common",
  	rune_action = "common",
  	pvp_action = "common",
  	diner_action = "common",
  	tower_action = "common",
  	gm_action = "common",
4c5d72ab   zhouhaihai   高级pvp
35
36
  }
  
df883a11   zhouhaihai   日志处理
37
38
  -- 如要修改 要提前修改 _template mapping -- 对应 mapping 为 gamelog-*
  local Mapping = {
cbc6973f   zhouhaihai   天赋bug 日志调整
39
  	-- 预留一些数据格式  担心integer 范围不够用 将 通用的int* 全部换为long
df883a11   zhouhaihai   日志处理
40
41
42
43
44
45
46
47
48
  	common = {
  		desc = "keyword",--索引的短字符串
  		ucode = "keyword",--关联日志对应ucode
  		key1 = "keyword", --可索引的短字符串
  		key2 = "keyword", --可索引的短字符串
  		-- 几乎不用的长文本 
  		text1 = "text",  --长字符串不索引的类型
  		-- 五个不同类型的数字 基本上满足数量要求 尽量从低到高用
  		short1 = "short", 
cbc6973f   zhouhaihai   天赋bug 日志调整
49
50
  		int1 = "long",
  		int2 = "long",
df883a11   zhouhaihai   日志处理
51
52
  		long1 = "long",
  		float1 = "float",
44c6e479   zhouhaihai   增加部分日志
53
54
  
  		-- 底层使用的 一些参数
cbc6973f   zhouhaihai   天赋bug 日志调整
55
56
57
  		cint1 = "long",
  		cint2 = "long",
  		cint3 = "long",
df883a11   zhouhaihai   日志处理
58
59
  	}
  }
4c5d72ab   zhouhaihai   高级pvp
60
  
df883a11   zhouhaihai   日志处理
61
62
63
64
65
66
67
68
69
70
71
  -- 所有的日志都包括的部分 role 里面的信息  -- mapping 信息在 gamelog-role
  local commonRoleField = {
  	name = "keyword",
  	id = "integer",
  	uid = "keyword",
  	sid = "short",
  	device = "keyword",
  	ctime = "integer",
  	ltime = "integer",
  	level = "short",
  	rmbC = "integer",
4c5d72ab   zhouhaihai   高级pvp
72
73
  }
  
b216676d   zhouhaihai   log
74
75
76
77
  local function printError(info)
  	print(info)
  	print(debug.traceback())
  end
4c5d72ab   zhouhaihai   高级pvp
78
  
df883a11   zhouhaihai   日志处理
79
80
81
82
83
84
  local function checkType(logType, field, value, ctype)
  	local typecheckfunc = {
  		keyword = function()
  			--长度不超过256
  			if type(value) ~= "string" then
  				value = tostring(value)
b216676d   zhouhaihai   log
85
  				printError(string.format("LOG ERROR: logType [%s] field [%s] isn't [keyword], value : %s", logType, field, value))
df883a11   zhouhaihai   日志处理
86
87
  			else
  				if #value > 256 then
b216676d   zhouhaihai   log
88
  					printError(string.format("LOG ERROR: logType [%s] field [%s] [keyword] type to long. value : %s", logType, field, value))
df883a11   zhouhaihai   日志处理
89
90
91
92
93
94
95
  				end
  			end
  			return value
  		end,
  		text = function()
  			if type(value) ~= "string" then
  				value = tostring(value)
b216676d   zhouhaihai   log
96
  				printError(string.format("LOG ERROR: logType [%s] field [%s] isn't [text], value : %s", logType, field, value))
df883a11   zhouhaihai   日志处理
97
98
99
100
101
102
  			end
  			return value
  		end,
  		integer = function()
  			if type(value) ~= "number" then
  				value = tonumber(value)
b216676d   zhouhaihai   log
103
  				printError(string.format("LOG ERROR: logType [%s] field [%s] isn't [integer], value : %s", logType, field, value))
df883a11   zhouhaihai   日志处理
104
105
106
107
108
109
  			end
  			if value then
  				if math.type(value) ~= "integer" then
  					local oldValue = value
  					value = math.floor(value)
  					if value ~= oldValue then
b216676d   zhouhaihai   log
110
  						printError(string.format("LOG ERROR: logType [%s] field [%s] isn't [integer], is float, value : %s", logType, field, value))
df883a11   zhouhaihai   日志处理
111
112
113
  					end
  				end
  				if -2147483648 > value or value > 2147483647 then
b216676d   zhouhaihai   log
114
  					printError(string.format("LOG ERROR: logType [%s] field [%s] isn't [integer], too big, value : %s", logType, field, value))
df883a11   zhouhaihai   日志处理
115
  					value = nil
df883a11   zhouhaihai   日志处理
116
117
118
119
120
121
122
  				end
  			end 
  			return value
  		end,
  		short = function()
  			if type(value) ~= "number" then
  				value = tonumber(value)
b216676d   zhouhaihai   log
123
  				printError(string.format("LOG ERROR: logType [%s] field [%s] isn't [short], value : %s", logType, field, value))
df883a11   zhouhaihai   日志处理
124
125
126
127
128
129
  			end
  			if value then
  				if math.type(value) ~= "integer" then
  					local oldValue = value
  					value = math.floor(value)
  					if value ~= oldValue then
b216676d   zhouhaihai   log
130
  						printError(string.format("LOG ERROR: logType [%s] field [%s] isn't [short], is float, value : %s", logType, field, value))
df883a11   zhouhaihai   日志处理
131
132
133
134
  					end
  				end
  
  				if -32768 > value or value > 32768 then
b216676d   zhouhaihai   log
135
  					printError(string.format("LOG ERROR: logType [%s] field [%s] isn't [short], too big, value : %s", logType, field, value))
df883a11   zhouhaihai   日志处理
136
  					value = nil
df883a11   zhouhaihai   日志处理
137
138
139
140
141
142
143
  				end
  			end 
  			return value
  		end,
  		long = function()
  			if type(value) ~= "number" then
  				value = tonumber(value)
b216676d   zhouhaihai   log
144
  				printError(string.format("LOG ERROR: logType [%s] field [%s] isn't [long], value : %s", logType, field, value))
df883a11   zhouhaihai   日志处理
145
146
147
148
149
150
  			end
  			if value then
  				if math.type(value) ~= "integer" then
  					local oldValue = value
  					value = math.floor(value)
  					if type(value) ~= "integer" then
b216676d   zhouhaihai   log
151
  						printError(string.format("LOG ERROR: logType [%s] field [%s] isn't [long], too big, value : %s", logType, field, value))
df883a11   zhouhaihai   日志处理
152
  						value = nil
df883a11   zhouhaihai   日志处理
153
  					elseif value ~= oldValue then
b216676d   zhouhaihai   log
154
  						printError(string.format("LOG ERROR: logType [%s] field [%s] isn't [long], is float, value : %s", logType, field, value))
df883a11   zhouhaihai   日志处理
155
156
157
158
159
160
161
162
  					end
  				end
  			end 
  			return value
  		end,
  		float = function()
  			if type(value) ~= "number" then
  				value = tonumber(value)
b216676d   zhouhaihai   log
163
  				printError(string.format("LOG ERROR: logType [%s] field [%s] isn't [float], value : %s", logType, field, value))
df883a11   zhouhaihai   日志处理
164
165
166
167
168
169
170
171
  			end
  			return value
  		end,
  	}
  
  	if typecheckfunc[ctype] then
  		return typecheckfunc[ctype]()
  	else
b216676d   zhouhaihai   log
172
  		printError(string.format("LOG ERROR: logType [%s] field [%s] have a new type [%s] need add check.", logType, field, ctype))
df883a11   zhouhaihai   日志处理
173
174
175
  		return nil
  	end
  end
4c5d72ab   zhouhaihai   高级pvp
176
  
df883a11   zhouhaihai   日志处理
177
178
  local RoleLog = {}
  function RoleLog.bind(Role)
4c5d72ab   zhouhaihai   高级pvp
179
  	function Role:log(logType, contents)
4c5d72ab   zhouhaihai   高级pvp
180
  		contents = contents or {}
df883a11   zhouhaihai   日志处理
181
182
  		local _logType = LogType[logType]
  		if not _logType then 
b216676d   zhouhaihai   log
183
  			printError(string.format("LOG ERROR: new logType [%s] need Add Maping.", logType))
df883a11   zhouhaihai   日志处理
184
185
  			return 
  		end
4c5d72ab   zhouhaihai   高级pvp
186
  		local doc = {}
df883a11   zhouhaihai   日志处理
187
188
  		for field, ctype in pairs(commonRoleField) do
  			if contents[field] then
b216676d   zhouhaihai   log
189
  				printError(string.format("LOG ERROR: logType [%s] had field [%s] overwrite default.", logType, field))
df883a11   zhouhaihai   日志处理
190
191
  			end
  			doc[field] = checkType("commonRoleField", field, self:getProperty(field), ctype)
4c5d72ab   zhouhaihai   高级pvp
192
  		end
df883a11   zhouhaihai   日志处理
193
194
  
  		local mapping = Mapping[_logType]
44c6e479   zhouhaihai   增加部分日志
195
196
197
  		if mapping["ucode"] and not contents["ucode"] then
  			contents["ucode"] = self:getActionUcode()
  		end
df883a11   zhouhaihai   日志处理
198
  
4c5d72ab   zhouhaihai   高级pvp
199
  		for field, value in pairs(contents) do
df883a11   zhouhaihai   日志处理
200
201
202
  			local ftype = mapping[field]
  			if ftype then
  				doc[field] = checkType(logType, field, value, ftype)
4c5d72ab   zhouhaihai   高级pvp
203
  			else
b216676d   zhouhaihai   log
204
  				printError(string.format("LOG ERROR: logType [%s] have new field [%s] no type in mapping.", logType, field))
4c5d72ab   zhouhaihai   高级pvp
205
206
  			end
  		end
df883a11   zhouhaihai   日志处理
207
208
  		if not logd then return end
  		pcall(skynet.send, logd, "lua", "log", logType, doc, _logType)
4c5d72ab   zhouhaihai   高级pvp
209
  	end
44c6e479   zhouhaihai   增加部分日志
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
  
  	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
  
4c5d72ab   zhouhaihai   高级pvp
229
  end
4c5d72ab   zhouhaihai   高级pvp
230
  return RoleLog