Blame view

src/models/RoleLog.lua 6.35 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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
  -- 如要修改 要提前修改 _template mapping -- 对应 mapping 为 gamelog-*
  local Mapping = {
  	-- 预留一些数据格式
  	common = {
  		desc = "keyword",--索引的短字符串
  		ucode = "keyword",--关联日志对应ucode
  		key1 = "keyword", --可索引的短字符串
  		key2 = "keyword", --可索引的短字符串
  		-- 几乎不用的长文本 
  		text1 = "text",  --长字符串不索引的类型
  		-- 五个不同类型的数字 基本上满足数量要求 尽量从低到高用
  		short1 = "short", 
  		int1 = "integer",
  		int2 = "integer",
  		long1 = "long",
  		float1 = "float",
44c6e479   zhouhaihai   增加部分日志
53
54
55
56
57
  
  		-- 底层使用的 一些参数
  		cint1 = "integer",
  		cint2 = "integer",
  		cint3 = "integer",
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
  }
  
4c5d72ab   zhouhaihai   高级pvp
74
  
df883a11   zhouhaihai   日志处理
75
76
77
78
79
80
  local function checkType(logType, field, value, ctype)
  	local typecheckfunc = {
  		keyword = function()
  			--长度不超过256
  			if type(value) ~= "string" then
  				value = tostring(value)
e3c5cc5e   zhouhaihai   跨服竞技场over
81
  				print(string.format("LOG ERROR: logType [%s] field [%s] isn't [keyword], value : %s", logType, field, value))
df883a11   zhouhaihai   日志处理
82
83
  			else
  				if #value > 256 then
e3c5cc5e   zhouhaihai   跨服竞技场over
84
  					print(string.format("LOG ERROR: logType [%s] field [%s] [keyword] type to long. value : %s", logType, field, value))
df883a11   zhouhaihai   日志处理
85
86
87
88
89
90
91
  				end
  			end
  			return value
  		end,
  		text = function()
  			if type(value) ~= "string" then
  				value = tostring(value)
e3c5cc5e   zhouhaihai   跨服竞技场over
92
  				print(string.format("LOG ERROR: logType [%s] field [%s] isn't [text], value : %s", logType, field, value))
df883a11   zhouhaihai   日志处理
93
94
95
96
97
98
  			end
  			return value
  		end,
  		integer = function()
  			if type(value) ~= "number" then
  				value = tonumber(value)
e3c5cc5e   zhouhaihai   跨服竞技场over
99
  				print(string.format("LOG ERROR: logType [%s] field [%s] isn't [integer], value : %s", logType, field, value))
df883a11   zhouhaihai   日志处理
100
101
102
103
104
105
  			end
  			if value then
  				if math.type(value) ~= "integer" then
  					local oldValue = value
  					value = math.floor(value)
  					if value ~= oldValue then
e3c5cc5e   zhouhaihai   跨服竞技场over
106
  						print(string.format("LOG ERROR: logType [%s] field [%s] isn't [integer], is float, value : %s", logType, field, value))
df883a11   zhouhaihai   日志处理
107
108
109
110
  					end
  				end
  				if -2147483648 > value or value > 2147483647 then
  					value = nil
e3c5cc5e   zhouhaihai   跨服竞技场over
111
  					print(string.format("LOG ERROR: logType [%s] field [%s] isn't [integer], too big, value : %s", logType, field, value))
df883a11   zhouhaihai   日志处理
112
113
114
115
116
117
118
  				end
  			end 
  			return value
  		end,
  		short = function()
  			if type(value) ~= "number" then
  				value = tonumber(value)
e3c5cc5e   zhouhaihai   跨服竞技场over
119
  				print(string.format("LOG ERROR: logType [%s] field [%s] isn't [short], value : %s", logType, field, value))
df883a11   zhouhaihai   日志处理
120
121
122
123
124
125
  			end
  			if value then
  				if math.type(value) ~= "integer" then
  					local oldValue = value
  					value = math.floor(value)
  					if value ~= oldValue then
e3c5cc5e   zhouhaihai   跨服竞技场over
126
  						print(string.format("LOG ERROR: logType [%s] field [%s] isn't [short], is float, value : %s", logType, field, value))
df883a11   zhouhaihai   日志处理
127
128
129
130
131
  					end
  				end
  
  				if -32768 > value or value > 32768 then
  					value = nil
e3c5cc5e   zhouhaihai   跨服竞技场over
132
  					print(string.format("LOG ERROR: logType [%s] field [%s] isn't [short], too big, value : %s", logType, field, value))
df883a11   zhouhaihai   日志处理
133
134
135
136
137
138
139
  				end
  			end 
  			return value
  		end,
  		long = function()
  			if type(value) ~= "number" then
  				value = tonumber(value)
e3c5cc5e   zhouhaihai   跨服竞技场over
140
  				print(string.format("LOG ERROR: logType [%s] field [%s] isn't [long], value : %s", logType, field, value))
df883a11   zhouhaihai   日志处理
141
142
143
144
145
146
147
  			end
  			if value then
  				if math.type(value) ~= "integer" then
  					local oldValue = value
  					value = math.floor(value)
  					if type(value) ~= "integer" then
  						value = nil
e3c5cc5e   zhouhaihai   跨服竞技场over
148
  						print(string.format("LOG ERROR: logType [%s] field [%s] isn't [long], too big, value : %s", logType, field, value))
df883a11   zhouhaihai   日志处理
149
  					elseif value ~= oldValue then
e3c5cc5e   zhouhaihai   跨服竞技场over
150
  						print(string.format("LOG ERROR: logType [%s] field [%s] isn't [long], is float, value : %s", logType, field, value))
df883a11   zhouhaihai   日志处理
151
152
153
154
155
156
157
158
  					end
  				end
  			end 
  			return value
  		end,
  		float = function()
  			if type(value) ~= "number" then
  				value = tonumber(value)
e3c5cc5e   zhouhaihai   跨服竞技场over
159
  				print(string.format("LOG ERROR: logType [%s] field [%s] isn't [float], value : %s", logType, field, value))
df883a11   zhouhaihai   日志处理
160
161
162
163
164
165
166
167
168
169
170
171
  			end
  			return value
  		end,
  	}
  
  	if typecheckfunc[ctype] then
  		return typecheckfunc[ctype]()
  	else
  		print(string.format("LOG ERROR: logType [%s] field [%s] have a new type [%s] need add check.", logType, field, ctype))
  		return nil
  	end
  end
4c5d72ab   zhouhaihai   高级pvp
172
  
df883a11   zhouhaihai   日志处理
173
174
  local RoleLog = {}
  function RoleLog.bind(Role)
4c5d72ab   zhouhaihai   高级pvp
175
  	function Role:log(logType, contents)
4c5d72ab   zhouhaihai   高级pvp
176
  		contents = contents or {}
df883a11   zhouhaihai   日志处理
177
178
179
180
181
  		local _logType = LogType[logType]
  		if not _logType then 
  			print(string.format("LOG ERROR: new logType [%s] need Add Maping.", logType))
  			return 
  		end
4c5d72ab   zhouhaihai   高级pvp
182
  		local doc = {}
df883a11   zhouhaihai   日志处理
183
184
185
186
187
  		for field, ctype in pairs(commonRoleField) do
  			if contents[field] then
  				print(string.format("LOG ERROR: logType [%s] had field [%s] overwrite default.", logType, field))
  			end
  			doc[field] = checkType("commonRoleField", field, self:getProperty(field), ctype)
4c5d72ab   zhouhaihai   高级pvp
188
  		end
df883a11   zhouhaihai   日志处理
189
190
  
  		local mapping = Mapping[_logType]
44c6e479   zhouhaihai   增加部分日志
191
192
193
  		if mapping["ucode"] and not contents["ucode"] then
  			contents["ucode"] = self:getActionUcode()
  		end
df883a11   zhouhaihai   日志处理
194
  
4c5d72ab   zhouhaihai   高级pvp
195
  		for field, value in pairs(contents) do
df883a11   zhouhaihai   日志处理
196
197
198
  			local ftype = mapping[field]
  			if ftype then
  				doc[field] = checkType(logType, field, value, ftype)
4c5d72ab   zhouhaihai   高级pvp
199
  			else
df883a11   zhouhaihai   日志处理
200
  				print(string.format("LOG ERROR: logType [%s] have new field [%s] no type in mapping.", logType, field))
4c5d72ab   zhouhaihai   高级pvp
201
202
  			end
  		end
df883a11   zhouhaihai   日志处理
203
204
  		if not logd then return end
  		pcall(skynet.send, logd, "lua", "log", logType, doc, _logType)
4c5d72ab   zhouhaihai   高级pvp
205
  	end
44c6e479   zhouhaihai   增加部分日志
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
  
  	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
225
  end
4c5d72ab   zhouhaihai   高级pvp
226
  return RoleLog