本文主要演示如何给 skynet 设置一个自定义的日志服务,并添加一些额外的功能。
- 每天切割日志文件
- 扩展 kill -1 信号,支持安全关服,重新打开日志文件等
- 日志等级划分
参考示例
首先参考示例 examples/userlog.lua
,使用 skynet.register_protocol
注册 skynet.PTYPE_TEXT
文本消息,用于输出日志。注册 skynet.PTYPE_SYSTEM
系统消息,用于接收系统信号。
实现日志等级功能
代码位置 lualib/log.lua
,这里逻辑比较简单,就是根据配置的日志等级和接口对比,决定是否输出日志,分为 debug
, info
, warn
, error
四个等级。其中 error
增加了调用堆栈输出,方便排查错误。
实现日志服务
- 每天切割一次文件采用的是
skynet.timeout
接口设置循环定时器,每天把日志文件备份处理。 - 信号处理采用读取 sighup 文件的第一行,根据文件内容来决定信号内容。
配置
修改 examples/config.userlog
配置文件。
- logger 是配置服务文件的,我们的服务文件是
service/log.lua
所以这里只配置log
即可。 - logservice 配置如果日志服务是 Lua 实现的,需要配置为
snlua
- logpath 是默认日志服务使用到的,这里我们不需要了,所以可以删除
- logfile 是新增的配置,用于配置日志输出文件的
- loglevel 配置输出日志等级
- logcut 用于配置是否每天切割一个日志文件
- sighupfile 用于配置接收 sighup 信号时,读取信号数据的文件
其他
- 代码分支: https://github.com/hanxi/skynet/tree/log
- 代码提交记录: hanxi/skynet@15117a4