Documentation ¶
Overview ¶
Package logs 可配置的日志系统
logs 定义了 6 个级别的日志:ERROR、INFO、TRACE、DEBUG、CRITICAL 和 WARN。 用户可以根据自己的需求,通过 XML 配置文件自定义每个日志输出行为。 以下为一个简短的 XML 配置示例,具体的可参考目录下的 config.xml。
<?xml version="1.0" encoding="utf-8" ?> <logs> <debug> <buffer size="10"> <rotate dir="/var/log/" size="5M" /> <smtp username=".." password=".." /> </buffer> </debug> <info> <console output="stderr" color="yellow" /> </info> <!-- 除了 debug 和 info,其它 4 个依然输出到 io.Discard --> </logs>
然后就可以调用 Go 代码输出日志内容:
logs.Debug(...) logs.Debugf("format", v...) logs.DEBUG.Println(...) // error 并未作任何配置,所以内容将不作实际输出 logs.ERROR().Print(...) // 向所有级别的日志输出内容。 logs.All(...)
上面的配置文件表示 DEBUG 级别的内容输出前都进被缓存,当量达到 10 条时, 一次性向 rotate 和 smtp 输出。 其中 buffer、rotate、smtp、debug 和 info 都是实现了 io.Writer 接口的结 构。通过 Register() 注册成功之后,即可以使用。
配置文件:
- 只支持 utf-8 编码的 XML、JSON 和 YAML 格式文件。
- 节点名称和节点属性区分大小写,但是属性值不区分大小写。
- 顶级元素必须为 logs,且不需要带任何属性;
- 二级元素实际上就是一个 log.Logger 实例, 只能为 info、debug、trace、warn、error 和 critical, 分别对应 INFO、DEBUG、TRACE、WARN、ERROR 和 CRITICAL 等日志通道。 可以带上 prefix 和 flag 属性,分别对应 log.New() 中的相应参数。
- 三级及以下元素可以自己根据需求组合,logs 自带以下 writer, 用户也可以自己向 logs 注册自己的实现。
1. buffer:
缓存工具,当数量达到指定值时,一起向所有的子元素输出。 比如上面的示例中,所有向 debug 输出的内容,都会被 buffer 缓存, 直到数量达到 10 条,才会一起向 rotate 和 smtp 输出内容。 仅有 size 一个参数:
size: 用于指定缓存的数量,必填参数。
2. rotate:
这是一个按文件大写自动分割日志的实例,以第一条记录的产生时间作为文件名。 拥有以下三个参数:
filename:表示日志文件的格式; dir: 表示的是日志存放的目录; size: 表示的是每个日志的大概大小,默认单位为 byte,可以带字符单位, 如 5M、10G 等(支持 k、m 和 g 三个后缀,不区分大小写)。
3. smtp:
将日志内容发送给指定邮件,可定义的属性为:
username: 发送邮件的账号; password: 账号对应的密码; host: smtp 的主机; subject: 邮件的主题; sendTo: 接收人地址,多个收件地址使用分号分隔。
4. console:
向控制台输出内容。可定义的属性为:
output: 只能为 "stderr", "stdout" 两个值,表示输出的具体方向,默认值为 "stderr"; foreground: 表示输出时的前景色,其值在 github.com/issue9/term/colors 中定义。 background: 表示输出时的背景色,其值在 github.com/issue9/term/colors 中定义。
自定义
除了以上定义的元素,用户也可以自行实现 io.Writer 接口,以实现自定义的输出方向。 要添加新的元素,只需要向 Register() 函数注册一个元素的初始化函数即可, 其中注册的名称将作为配置节点的元素名称,需要唯一,不能与现有的名称相同; 函数则作为节点转换成实例时的转换功能,需要负责解析节点传递过来的属性列表(args 参数), 若是一个容器节点(如 buffer,可以包含子节点)则返回的实例必须要实现 WriteFlushAdder 接口, 该函数的原型为:
WriterInitializer
NOTE: 不能对 logs.Error() 等函数进行再次封闭,否则会造成输出的错误信息定位不准确。 若非要这样做的话, 建议使用 logs.ERROR().Output()。
Index ¶
- Constants
- func IsRegistered(name string) bool
- func Register(name string, init WriterInitializer) bool
- func Registered() []string
- type Logs
- func (l *Logs) All(v ...interface{})
- func (l *Logs) Allf(format string, v ...interface{})
- func (l *Logs) CRITICAL() *log.Logger
- func (l *Logs) Critical(v ...interface{})
- func (l *Logs) Criticalf(format string, v ...interface{})
- func (l *Logs) DEBUG() *log.Logger
- func (l *Logs) Debug(v ...interface{})
- func (l *Logs) Debugf(format string, v ...interface{})
- func (l *Logs) ERROR() *log.Logger
- func (l *Logs) Error(v ...interface{})
- func (l *Logs) Errorf(format string, v ...interface{})
- func (l *Logs) Fatal(level int, code int, v ...interface{})
- func (l *Logs) Fatalf(level int, code int, format string, v ...interface{})
- func (l *Logs) Flush() error
- func (l *Logs) INFO() *log.Logger
- func (l *Logs) Info(v ...interface{})
- func (l *Logs) Infof(format string, v ...interface{})
- func (l *Logs) Logger(level int) *log.Logger
- func (l *Logs) Panic(level int, v ...interface{})
- func (l *Logs) Panicf(level int, format string, v ...interface{})
- func (l *Logs) Print(level, deep int, v ...interface{})
- func (l *Logs) Printf(level, deep int, format string, v ...interface{})
- func (l *Logs) SetFlags(level int, flag int)
- func (l *Logs) SetOutput(level int, w io.Writer) error
- func (l *Logs) SetPrefix(level int, p string)
- func (l *Logs) TRACE() *log.Logger
- func (l *Logs) Trace(v ...interface{})
- func (l *Logs) Tracef(format string, v ...interface{})
- func (l *Logs) WARN() *log.Logger
- func (l *Logs) Warn(v ...interface{})
- func (l *Logs) Warnf(format string, v ...interface{})
- type WriterInitializer
Constants ¶
const ( LevelInfo = 1 << iota LevelTrace LevelDebug LevelWarn LevelError LevelCritical LevelAll = LevelInfo + LevelTrace + LevelDebug + LevelWarn + LevelError + LevelCritical )
目前支持的日志类型
Variables ¶
This section is empty.
Functions ¶
func Register ¶
func Register(name string, init WriterInitializer) bool
Register 注册一个 WriterInitializer
writer 初始化函数原型可参考: WriterInitializer。 返回值反映是否注册成功。若已经存在相同名称的,则返回 false
Types ¶
type Logs ¶
type Logs struct {
// contains filtered or unexported fields
}
Logs 日志输出
func (*Logs) Critical ¶
func (l *Logs) Critical(v ...interface{})
Critical 相当于 CRITICAL().Println(v...)的简写方式
func (*Logs) Info ¶
func (l *Logs) Info(v ...interface{})
Info 相当于 INFO().Println(v...) 的简写方式
Info 函数默认是带换行符的,若需要不带换行符的,请使用 DEBUG().Print() 函数代替。 其它相似函数也有类型功能。
func (*Logs) Print ¶
Print 向指定的通道输出信息
level 表示需要设置的通道,可以是多个值组合,比如 LevelInfo | LevelDebug; deep 为 0 时,表示调用者;
func (*Logs) Printf ¶
Printf 向指定的通道输出信息
level 表示需要设置的通道,可以是多个值组合,比如 LevelInfo | LevelDebug; deep 为 0 时,表示调用者;
func (*Logs) SetOutput ¶
SetOutput 设置某一个类型的输出通道
level 表示需要设置的通道,可以是多个值组合,比如 LevelInfo | LevelDebug 。 若将 w 设置为 nil 表示关闭此类型的输出。
NOTE: 如果直接调用诸如 ERROR().SetOutput() 设置输出通道, 那么 Logs 将失去对该对象的管控,之后再调用 Logs.SetOutput 不会再启作用。
Directories ¶
Path | Synopsis |
---|---|
Package config 处理配置文件
|
Package config 处理配置文件 |
internal
|
|
initfunc
Package initfunc 实现了 github.com/issue9/writers 下的 WriterInitializer 接口
|
Package initfunc 实现了 github.com/issue9/writers 下的 WriterInitializer 接口 |
Package writers 提供了一组实现 io.Writer 接口的结构
|
Package writers 提供了一组实现 io.Writer 接口的结构 |
rotate
Package rotate 提供一个可以按文件大小进行分割的 io.Writer 实例
|
Package rotate 提供一个可以按文件大小进行分割的 io.Writer 实例 |