ELK Stack 分布式日志接入
接入 ELK Stack(Elasticsearch, Logstash, Kibana)并不意味着你不需要 zap。相反,zap 仍然可以在你的应用中扮演重要角色,用于高效地生成和格式化日志。你可以将 zap 生成的日志发送到 ELK Stack 进行集中管理和分析。
接入 ELK Stack 的步骤
-
配置
zap生成 JSON 格式的日志:- ELK Stack 通常处理 JSON 格式的日志,因此你可以配置
zap生成 JSON 格式的日志。
- ELK Stack 通常处理 JSON 格式的日志,因此你可以配置
-
使用 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,你可以实现高效的日志生成和集中化管理。
希望这些信息对你有帮助!如果你有其他问题,欢迎继续提问。