Skip to content

常量与错误

DD 定义了丰富的常量和错误类型,用于日志级别控制、格式化和错误处理。

日志级别

go
type LogLevel int8 // 日志级别类型
常量说明
LevelDebug0调试级别
LevelInfo1信息级别(默认)
LevelWarn2警告级别
LevelError3错误级别
LevelFatal4致命级别

LogLevel 实现了 String() string 方法(返回 "DEBUG"/"INFO"/"WARN"/"ERROR"/"FATAL",未知值返回 "UNKNOWN")与 IsValid() bool 方法(判断级别是否在 LevelDebug~LevelFatal 有效范围内)。

日志格式

go
type LogFormat int8 // 输出格式类型
常量说明
FormatText0文本格式
FormatJSON1JSON 格式

LogFormat 实现了 String() string 方法(返回 "text"/"json",未知值返回 "unknown")。

字段验证模式

go
type FieldValidationMode int // 字段键验证模式
常量说明
FieldValidationNone0禁用验证(默认)
FieldValidationWarn1验证失败时警告但仍接受
FieldValidationStrict2严格模式,验证失败时记录错误

字段命名约定

go
type FieldNamingConvention int // 字段键命名约定
常量说明
NamingConventionAny0接受任何格式(默认)
NamingConventionSnakeCase1snake_case(如 user_id)
NamingConventionCamelCase2camelCase(如 userId)
NamingConventionPascalCase3PascalCase(如 UserId)
NamingConventionKebabCase4kebab-case(如 user-id)

哈希算法

go
type HashAlgorithm int // 完整性签名哈希算法
常量说明
HashAlgorithmSHA2560SHA-256 算法(用于完整性签名

默认值

常量说明
DefaultTimeFormat"2006-01-02T15:04:05Z07:00"ISO 8601 时间格式
DefaultLogPath"logs/app.log"默认日志文件路径
DefaultMaxSizeMB100默认文件大小限制(MB)
DefaultMaxBackups10默认备份数量
DefaultMaxAge30 * 24 * time.Hour默认保留天数(30 天)

上下文键

常量类型
ContextKeyTraceIDContextKey"trace_id"
ContextKeySpanIDContextKey"span_id"
ContextKeyRequestIDContextKey"request_id"

错误码

LoggerError.Code 字段包含机器可读的错误码字符串,用于精细匹配错误类型。错误码为内部实现细节,建议使用哨兵错误进行匹配。

哨兵错误

每个错误码对应一个哨兵错误变量:

go
var (
    ErrNilConfig          = errors.New("config cannot be nil")
    ErrNilWriter          = errors.New("writer cannot be nil")
    ErrNilFilter          = errors.New("filter cannot be nil")
    ErrNilHook            = errors.New("hook cannot be nil")
    ErrNilExtractor       = errors.New("context extractor cannot be nil")
    ErrLoggerClosed       = errors.New("logger is closed")
    ErrWriterNotFound     = errors.New("writer not found")
    ErrInvalidLevel       = errors.New("invalid log level")
    ErrInvalidFormat      = errors.New("invalid log format")
    ErrMaxWritersExceeded = errors.New("maximum writer count exceeded")
    ErrEmptyFilePath      = errors.New("file path cannot be empty")
    ErrPathTooLong        = errors.New("file path too long")
    ErrPathTraversal      = errors.New("path traversal detected")
    ErrNullByte           = errors.New("null byte in input")
    ErrInvalidPath        = errors.New("invalid file path")
    ErrSymlinkNotAllowed  = errors.New("symlinks not allowed")
    ErrHardlinkNotAllowed = errors.New("hardlinks not allowed")
    ErrOverlongEncoding   = errors.New("UTF-8 overlong encoding detected")
    ErrMaxSizeExceeded    = errors.New("maximum size exceeded")
    ErrMaxBackupsExceeded = errors.New("maximum backup count exceeded")
    ErrBufferSizeTooLarge = errors.New("buffer size too large")
    ErrInvalidPattern     = errors.New("invalid regex pattern")
    ErrEmptyPattern       = errors.New("pattern cannot be empty")
    ErrPatternTooLong     = errors.New("pattern length exceeds maximum")
    ErrReDoSPattern       = errors.New("pattern contains dangerous nested quantifiers that may cause ReDoS")
    ErrPatternFailed      = errors.New("failed to add pattern")
    ErrConfigValidation   = errors.New("configuration validation failed")
    ErrWriterAdd          = errors.New("failed to add writer")
    ErrMultipleConfigs    = errors.New("multiple configs provided, expected 0 or 1")
    ErrNilMultiWriter     = errors.New("multiwriter is nil")
)

错误检查

go
if errors.Is(err, dd.ErrLoggerClosed) {
    // 日志记录器已关闭
}

if errors.Is(err, dd.ErrPathTraversal) {
    // 检测到路径遍历攻击
}

错误类型

LoggerError

go
type LoggerError struct {
    Code    string
    Message string
    Cause   error
    Context map[string]any
}

方法:Error()Unwrap()Is(target)WithContext(key, value)WithField(key, value)

go
// LoggerError 包含错误码、消息、原因和上下文
// 通过 errors.Is 检查哨兵错误
if errors.Is(err, dd.ErrLoggerClosed) {
    // 日志记录器已关闭
}

WriterError

go
type WriterError struct {
    Index  int
    Writer io.Writer
    Err    error
}

方法:Error()Unwrap()

MultiWriterError

go
type MultiWriterError struct {
    Errors []WriterError
}

方法:Error()Unwrap()HasErrors()ErrorCount()FirstError()

下一步