Documentation
¶
Overview ¶
Package logging 统一构造 slog 日志器。
Index ¶
- Constants
- func ListFiles(dir string) ([]string, error)
- func New(w io.Writer, opts Options) *slog.Logger
- func NewTee(console, file io.Writer, opts Options) *slog.Logger
- func ParseFileName(name string) (day string, seq int, ok bool)
- func ParseLevel(level string) slog.Level
- func SafeFileName(name string) (string, bool)
- type Options
- type RotateOptions
- type RotatingFile
Constants ¶
const FilePrefix = "lumo-"
FilePrefix 是日志文件名的固定前缀,读取端据此识别日志文件。
const FileSuffix = ".log"
FileSuffix 是日志文件的扩展名。
Variables ¶
This section is empty.
Functions ¶
func NewTee ¶ added in v0.1.2
NewTee 构造同时写控制台与文件的日志器。
两路各自成句:控制台跟随 opts.Format(站长习惯的 text 或 json), 文件一律 JSON —— 后台日志页要把每行解析成结构化字段,text 格式做不到这件事。
为什么保留控制台那一路:Docker 部署靠 docker logs、systemd 靠 journald, 两者都读 stdout。只写文件会让这两种部署方式的用户失去他们习惯的排障入口。
func ParseFileName ¶ added in v0.1.2
ParseFileName 从文件名解析日期与序号,不是日志文件时 ok 为 false。
供读取端复用:哪些文件算日志、怎么排序,只有一个答案。
func ParseLevel ¶
ParseLevel 把级别字符串转成 slog.Level,无法识别时回退 info。
func SafeFileName ¶ added in v0.1.2
SafeFileName 校验调用方给的文件名确实是本目录下的日志文件。
下载与读取接口都要用它:文件名来自请求,必须挡住 ../ 与任意路径。
Types ¶
type Options ¶
type Options struct {
// Level 取值 debug / info / warn / error,大小写不敏感。
Level string
// Format 取值 text / json,大小写不敏感。
Format string
}
Options 是日志器构造参数。
type RotateOptions ¶ added in v0.1.2
type RotateOptions struct {
// Dir 是日志目录。
Dir string
// RetainDays 是保留天数,按文件名里的日期判断;小于 1 时用 defaultRetainDays。
RetainDays int
// MaxSizeMB 是单文件大小上限,超过则在同一天内滚到下一个序号;
// 小于 1 时用 defaultMaxSizeMB。
MaxSizeMB int
}
RotateOptions 是滚动写入器的参数。
type RotatingFile ¶ added in v0.1.2
type RotatingFile struct {
// contains filtered or unexported fields
}
RotatingFile 是按天切割、按大小滚动的日志写入器。
自己实现而不是引第三方轮转库:需要的只是「按天切 + 超限换一个 + 删过期」这三件事, 而日志文件名的形态同时是读取端的契约(见 internal/logs),由本包定义最稳妥。
并发安全:slog 的 handler 会被多个请求并发调用,Write 必须串行化。
func NewRotatingFile ¶ added in v0.1.2
func NewRotatingFile(opts RotateOptions) (*RotatingFile, error)
NewRotatingFile 构造写入器并打开当天的文件。