logs

package module
v3.2.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 28, 2022 License: MIT Imports: 9 Imported by: 4

README

logs Go PkgGoDev

一个可配置的日志服务包。可以通过 XML 自定义日志输出:

<?xml version="1.0" encoding="utf-8" ?>
<logs>
    <debug>
        <buffer size="10">
            <rotate dir="/var/log/" size="5M" />
            <stmp username=".." password=".." />
        </buffer>
    </debug>
    <info>
        ....
    </info>
</logs>
import "github.com/issue9/logs/v3/config"
import "github.com/issue9/logs/v3"

cfg, _ := config.ParseFile("./logs.xml")
l,err := logs.New(cfg)
l.Debug("debug start...")
l.Debugf("%v start...", "debug")
l.DEBUG().Println("debug start...")

安装

go get github.com/issue9/logs/v3

版权

本项目采用 MIT 开源授权许可证,完整的授权说明可在 LICENSE 文件中找到。

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

View Source
const (
	LevelInfo = 1 << iota
	LevelTrace
	LevelDebug
	LevelWarn
	LevelError
	LevelCritical
	LevelAll = LevelInfo + LevelTrace + LevelDebug + LevelWarn + LevelError + LevelCritical
)

目前支持的日志类型

Variables

This section is empty.

Functions

func IsRegistered

func IsRegistered(name string) bool

IsRegistered 查询指定名称的 Writer 是否已经被注册

func Register

func Register(name string, init WriterInitializer) bool

Register 注册一个 WriterInitializer

writer 初始化函数原型可参考: WriterInitializer。 返回值反映是否注册成功。若已经存在相同名称的,则返回 false

func Registered

func Registered() []string

Registered 返回所有已注册的 writer 名称

Types

type Logs

type Logs struct {
	// contains filtered or unexported fields
}

Logs 日志输出

func New

func New(cfg *config.Config) (*Logs, error)

New 声明 Logs 变量

cfg 为配置项,可以为空,表示不输出任何信息,但是 Logs 实例是可用的状态。

func (*Logs) All

func (l *Logs) All(v ...interface{})

All 向所有的日志输出内容

func (*Logs) Allf

func (l *Logs) Allf(format string, v ...interface{})

Allf 向所有的日志输出内容

func (*Logs) CRITICAL

func (l *Logs) CRITICAL() *log.Logger

CRITICAL 获取 CRITICAL 级别的 log.Logger 实例

func (*Logs) Critical

func (l *Logs) Critical(v ...interface{})

Critical 相当于 CRITICAL().Println(v...)的简写方式

func (*Logs) Criticalf

func (l *Logs) Criticalf(format string, v ...interface{})

Criticalf 相当于 CRITICAL().Printf(format, v...) 的简写方式

func (*Logs) DEBUG

func (l *Logs) DEBUG() *log.Logger

DEBUG 获取 DEBUG 级别的 log.Logger 实例

func (*Logs) Debug

func (l *Logs) Debug(v ...interface{})

Debug 相当于 DEBUG().Println(v...) 的简写方式

func (*Logs) Debugf

func (l *Logs) Debugf(format string, v ...interface{})

Debugf 相当于 DEBUG().Printf(format, v...) 的简写方式

func (*Logs) ERROR

func (l *Logs) ERROR() *log.Logger

ERROR 获取 ERROR 级别的 log.Logger 实例

func (*Logs) Error

func (l *Logs) Error(v ...interface{})

Error 相当于 ERROR().Println(v...) 的简写方式

func (*Logs) Errorf

func (l *Logs) Errorf(format string, v ...interface{})

Errorf 相当于 ERROR().Printf(format, v...) 的简写方式

func (*Logs) Fatal

func (l *Logs) Fatal(level int, code int, v ...interface{})

Fatal 输出错误信息然后退出程序

func (*Logs) Fatalf

func (l *Logs) Fatalf(level int, code int, format string, v ...interface{})

Fatalf 输出错误信息然后退出程序

func (*Logs) Flush

func (l *Logs) Flush() error

Flush 输出所有的缓存内容

func (*Logs) INFO

func (l *Logs) INFO() *log.Logger

INFO 获取 INFO 级别的 log.Logger 实例

func (*Logs) Info

func (l *Logs) Info(v ...interface{})

Info 相当于 INFO().Println(v...) 的简写方式

Info 函数默认是带换行符的,若需要不带换行符的,请使用 DEBUG().Print() 函数代替。 其它相似函数也有类型功能。

func (*Logs) Infof

func (l *Logs) Infof(format string, v ...interface{})

Infof 相当于 INFO().Printf(format, v...) 的简写方式

func (*Logs) Logger

func (l *Logs) Logger(level int) *log.Logger

Logger 返回指定级别的日志操作实例

level 不能以组合的形式出现;

func (*Logs) Panic

func (l *Logs) Panic(level int, v ...interface{})

Panic 输出错误信息然后触发 panic

func (*Logs) Panicf

func (l *Logs) Panicf(level int, format string, v ...interface{})

Panicf 输出错误信息然后触发 panic

func (*Logs) Print

func (l *Logs) Print(level, deep int, v ...interface{})

Print 向指定的通道输出信息

level 表示需要设置的通道,可以是多个值组合,比如 LevelInfo | LevelDebug; deep 为 0 时,表示调用者;

func (*Logs) Printf

func (l *Logs) Printf(level, deep int, format string, v ...interface{})

Printf 向指定的通道输出信息

level 表示需要设置的通道,可以是多个值组合,比如 LevelInfo | LevelDebug; deep 为 0 时,表示调用者;

func (*Logs) SetFlags

func (l *Logs) SetFlags(level int, flag int)

SetFlags 为所有的日志对象调用 SetFlags

func (*Logs) SetOutput

func (l *Logs) SetOutput(level int, w io.Writer) error

SetOutput 设置某一个类型的输出通道

level 表示需要设置的通道,可以是多个值组合,比如 LevelInfo | LevelDebug 。 若将 w 设置为 nil 表示关闭此类型的输出。

NOTE: 如果直接调用诸如 ERROR().SetOutput() 设置输出通道, 那么 Logs 将失去对该对象的管控,之后再调用 Logs.SetOutput 不会再启作用。

func (*Logs) SetPrefix

func (l *Logs) SetPrefix(level int, p string)

SetPrefix 为所有的日志对象调用 SetPrefix

func (*Logs) TRACE

func (l *Logs) TRACE() *log.Logger

TRACE 获取 TRACE 级别的 log.Logger 实例

func (*Logs) Trace

func (l *Logs) Trace(v ...interface{})

Trace 相当于 TRACE().Println(v...) 的简写方式

func (*Logs) Tracef

func (l *Logs) Tracef(format string, v ...interface{})

Tracef 相当于 TRACE().Printf(format, v...) 的简写方式

func (*Logs) WARN

func (l *Logs) WARN() *log.Logger

WARN 获取 WARN 级别的 log.Logger 实例

func (*Logs) Warn

func (l *Logs) Warn(v ...interface{})

Warn 相当于 WARN().Println(v...) 的简写方式

func (*Logs) Warnf

func (l *Logs) Warnf(format string, v ...interface{})

Warnf 相当于 WARN().Printf(format, v...) 的简写方式

type WriterInitializer

type WriterInitializer func(cfg *config.Config) (io.Writer, error)

WriterInitializer io.Writer 实例的初始化函数

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 实例

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL