Blame view

src/models/RoleLog.lua 4.92 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",
4c5d72ab   zhouhaihai   高级pvp
7
8
  }
  
df883a11   zhouhaihai   日志处理
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
  -- 如要修改 要提前修改 _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",
  	}
  }
4c5d72ab   zhouhaihai   高级pvp
27
  
df883a11   zhouhaihai   日志处理
28
29
30
31
32
33
34
35
36
37
38
  -- 所有的日志都包括的部分 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
39
40
  }
  
4c5d72ab   zhouhaihai   高级pvp
41
  
df883a11   zhouhaihai   日志处理
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
  local function checkType(logType, field, value, ctype)
  	local typecheckfunc = {
  		keyword = function()
  			--长度不超过256
  			if type(value) ~= "string" then
  				value = tostring(value)
  				print(string.format("LOG ERROR: logType [%s] field [%s] isn't [keyword]", logType, field))
  			else
  				if #value > 256 then
  					print(string.format("LOG ERROR: logType [%s] field [%s] [keyword] type to long.", logType, field))
  				end
  			end
  			return value
  		end,
  		text = function()
  			if type(value) ~= "string" then
  				value = tostring(value)
  				print(string.format("LOG ERROR: logType [%s] field [%s] isn't [text]", logType, field))
  			end
  			return value
  		end,
  		integer = function()
  			if type(value) ~= "number" then
  				value = tonumber(value)
  				print(string.format("LOG ERROR: logType [%s] field [%s] isn't [integer]", logType, field))
  			end
  			if value then
  				if math.type(value) ~= "integer" then
  					local oldValue = value
  					value = math.floor(value)
  					if value ~= oldValue then
  						print(string.format("LOG ERROR: logType [%s] field [%s] isn't [integer], is float", logType, field))
  					end
  				end
  				if -2147483648 > value or value > 2147483647 then
  					value = nil
  					print(string.format("LOG ERROR: logType [%s] field [%s] isn't [integer], too big", logType, field))
  				end
  			end 
  			return value
  		end,
  		short = function()
  			if type(value) ~= "number" then
  				value = tonumber(value)
  				print(string.format("LOG ERROR: logType [%s] field [%s] isn't [short]", logType, field))
  			end
  			if value then
  				if math.type(value) ~= "integer" then
  					local oldValue = value
  					value = math.floor(value)
  					if value ~= oldValue then
  						print(string.format("LOG ERROR: logType [%s] field [%s] isn't [short], is float", logType, field))
  					end
  				end
  
  				if -32768 > value or value > 32768 then
  					value = nil
  					print(string.format("LOG ERROR: logType [%s] field [%s] isn't [short], too big", logType, field))
  				end
  			end 
  			return value
  		end,
  		long = function()
  			if type(value) ~= "number" then
  				value = tonumber(value)
  				print(string.format("LOG ERROR: logType [%s] field [%s] isn't [long]", logType, field))
  			end
  			if value then
  				if math.type(value) ~= "integer" then
  					local oldValue = value
  					value = math.floor(value)
  					if type(value) ~= "integer" then
  						value = nil
  						print(string.format("LOG ERROR: logType [%s] field [%s] isn't [long], too big", logType, field))
  					elseif value ~= oldValue then
  						print(string.format("LOG ERROR: logType [%s] field [%s] isn't [long], is float", logType, field))
  					end
  				end
  			end 
  			return value
  		end,
  		float = function()
  			if type(value) ~= "number" then
  				value = tonumber(value)
  				print(string.format("LOG ERROR: logType [%s] field [%s] isn't [float]", logType, field))
  			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
139
  
df883a11   zhouhaihai   日志处理
140
141
  local RoleLog = {}
  function RoleLog.bind(Role)
4c5d72ab   zhouhaihai   高级pvp
142
  	function Role:log(logType, contents)
4c5d72ab   zhouhaihai   高级pvp
143
  		contents = contents or {}
df883a11   zhouhaihai   日志处理
144
145
146
147
148
  		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
149
  		local doc = {}
df883a11   zhouhaihai   日志处理
150
151
152
153
154
  		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
155
  		end
df883a11   zhouhaihai   日志处理
156
157
158
  
  		local mapping = Mapping[_logType]
  
4c5d72ab   zhouhaihai   高级pvp
159
  		for field, value in pairs(contents) do
df883a11   zhouhaihai   日志处理
160
161
162
  			local ftype = mapping[field]
  			if ftype then
  				doc[field] = checkType(logType, field, value, ftype)
4c5d72ab   zhouhaihai   高级pvp
163
  			else
df883a11   zhouhaihai   日志处理
164
  				print(string.format("LOG ERROR: logType [%s] have new field [%s] no type in mapping.", logType, field))
4c5d72ab   zhouhaihai   高级pvp
165
166
  			end
  		end
df883a11   zhouhaihai   日志处理
167
168
  		if not logd then return end
  		pcall(skynet.send, logd, "lua", "log", logType, doc, _logType)
4c5d72ab   zhouhaihai   高级pvp
169
  	end
4c5d72ab   zhouhaihai   高级pvp
170
  end
4c5d72ab   zhouhaihai   高级pvp
171
  return RoleLog