From 1be371743429dae51e797a67ef1621e98cdcd88a Mon Sep 17 00:00:00 2001 From: zhouhaihai Date: Thu, 10 Sep 2020 19:42:26 +0800 Subject: [PATCH] error --- src/services/errorlog.lua | 145 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+), 0 deletions(-) create mode 100644 src/services/errorlog.lua diff --git a/src/services/errorlog.lua b/src/services/errorlog.lua new file mode 100644 index 0000000..eecc91c --- /dev/null +++ b/src/services/errorlog.lua @@ -0,0 +1,145 @@ + +local skynet = require "skynet" +local socketdriver = require "skynet.socketdriver" +local serverId = tonumber(skynet.getenv("servId")) + +require "shared.init" +require "skynet.manager" + +local table_insert = table.insert +local pairs = pairs +local ipairs = ipairs +local string_format = string.format + +local logHandle = { + log = { + host = "127.0.0.1", + port = 13003, + handle = function(doc, address, msg) + -- 注入字段 + local now = skynet.timex() + doc["time"] = now + doc["timestamp"] = now + doc["instance_id"] = serverId + doc["game_name"] = "wasteland" + doc["env"] = "cb" + doc["app_name"] = "gs" + doc["app_id"] = "game.wasteland.gs" + --FATAL、ERROR、WARN、INFO、DEBUG + doc["level"] = "ERROR" + doc["log"] = msg + doc["address"] = string_format(":%08x", address) + end + }, +} + +local connect_relation = {} +local function getConInfo(fd) + return logHandle[connect_relation[fd] or ""] +end + + + +local socket_message = {} +-- read skynet_socket.h for these macro +-- SKYNET_SOCKET_TYPE_DATA = 1 +socket_message[1] = function(id, size, data) + skynet.error(string.format("LOG SOCKET: data: ", skynet.tostring(data, size))) + socketdriver.drop(data, size) +end + +-- SKYNET_SOCKET_TYPE_CONNECT = 2 +socket_message[2] = function(id, _ , addr) + local cur = getConInfo(id) + skynet.error("LOG SOCKET: connect: ", addr) + cur.connected = true + cur.connecting = false +end + +-- SKYNET_SOCKET_TYPE_CLOSE = 3 +socket_message[3] = function(id) + skynet.error("LOG SOCKET: closed") + local cur = getConInfo(id) + if not cur then return end + cur.connected = false + cur.connecting = false + connect_relation[id] = nil +end + +-- SKYNET_SOCKET_TYPE_ERROR = 5 +socket_message[5] = function(id, _, err) + skynet.error("LOG SOCKET: error: ", err) + local cur = getConInfo(id) + if not cur then return end + cur.connected = false + cur.connecting = false + connect_relation[id] = nil +end + + + +local function open() + for logTo, data in pairs(logHandle) do + if not data.connecting and not data.connected then + data.connecting = true + data.fd = socketdriver.connect(data.host, data.port) + connect_relation[data.fd] = logTo + end + end +end + +local function log(address, msg, logTo) + logTo = logTo or "log" + -- print(string.format(":%08x(%.2f): %s", address, skynet.time(), msg)) + local cur = logHandle[logTo] + if not cur then + print("error log to ", logTo) + end + local doc = {} + if cur.handle then + cur.handle(doc, address, msg) + end + if cur.connected and cur.fd then + socketdriver.send(cur.fd, json.encode(doc) .. "\n") + else + -- 断线会丢失一部分日志 + if not cur.connecting then + open() -- 连一下 + end + end +end + + +skynet.register_protocol { + name = "socket", + id = skynet.PTYPE_SOCKET, -- PTYPE_SOCKET = 6 + unpack = socketdriver.unpack, + dispatch = function (_, _, t, ...) + if socket_message[t] then + socket_message[t](...) + end + end +} + +-- register protocol text before skynet.start would be better. +skynet.register_protocol { + name = "text", + id = skynet.PTYPE_TEXT, + unpack = skynet.tostring, + dispatch = function(_, address, msg) + log(address, msg) + end +} + +skynet.register_protocol { + name = "SYSTEM", + id = skynet.PTYPE_SYSTEM, + unpack = function(...) return ... end, + dispatch = function() + -- reopen signal + print("SIGHUP") + end +} + +open() +skynet.start(function()end) -- libgit2 0.21.2