Skip to main content

ELK Stack 分布式日志接入

接入 ELK Stack(Elasticsearch, Logstash, Kibana)并不意味着你不需要 zap。相反,zap 仍然可以在你的应用中扮演重要角色,用于高效地生成和格式化日志。你可以将 zap 生成的日志发送到 ELK Stack 进行集中管理和分析。

接入 ELK Stack 的步骤

  1. 配置 zap 生成 JSON 格式的日志

    • ELK Stack 通常处理 JSON 格式的日志,因此你可以配置 zap 生成 JSON 格式的日志。
  2. 使用 Filebeat 或 Logstash

    • 使用 Filebeat 或 Logstash 从你的应用日志文件中读取日志,并将其发送到 Elasticsearch。

示例代码

以下是一个使用 zap 生成 JSON 格式日志,并通过 Filebeat 发送到 Elasticsearch 的示例:

1. 配置 zap 生成 JSON 格式日志

package main

import (
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"gopkg.in/natefinch/lumberjack.v2"
)

func main() {
// 使用 lumberjack 实现日志切割
lumberjackLogger := &lumberjack.Logger{
Filename: "./logs/app.log",
MaxSize: 10, // 日志文件最大为 10 MB
MaxBackups: 3, // 保留最近的 3 个日志文件
MaxAge: 28, // 保留 28 天
Compress: true, // 是否压缩/归档旧日志文件
}

writeSyncer := zapcore.AddSync(lumberjackLogger)
encoderConfig := zap.NewProductionEncoderConfig()
encoderConfig.TimeKey = "timestamp"
encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
encoder := zapcore.NewJSONEncoder(encoderConfig)

core := zapcore.NewCore(encoder, writeSyncer, zap.InfoLevel)
logger := zap.New(core)
defer logger.Sync()

sugar := logger.Sugar()

// 记录日志
sugar.Infow("Info log example",
"key1", "value1",
"key2", 42,
)
sugar.Debugw("Debug log example",
"key1", "value1",
"key2", 42,
)
sugar.Warnw("Warn log example",
"key1", "value1",
"key2", 42,
)
sugar.Errorw("Error log example",
"key1", "value1",
"key2", 42,
)
}

2. 配置 Filebeat

创建一个 Filebeat 配置文件(例如 filebeat.yml),配置 Filebeat 从日志文件中读取日志并发送到 Elasticsearch:

filebeat.inputs:
- type: log
enabled: true
paths:
- ./logs/app.log

output.elasticsearch:
hosts: ['http://localhost:9200']
username: 'elastic'
password: 'changeme'

setup.kibana:
host: 'http://localhost:5601'

3. 启动 Filebeat

确保你已经安装了 Filebeat,然后启动它:

filebeat -e -c filebeat.yml

总结

即使你将日志发送到 ELK Stack,zap 仍然是一个非常有用的工具,用于高效地生成和格式化日志。通过结合使用 zap 和 Filebeat/Logstash,你可以实现高效的日志生成和集中化管理。

希望这些信息对你有帮助!如果你有其他问题,欢迎继续提问。