You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Zap日志中提取并仅打印所需指定字段信息?

从Zap日志中提取指定字段的解决方案

一、配置Zap直接输出目标字段(推荐)

如果能在日志生成阶段就控制输出内容,这是最高效的方式。可以通过自定义Zap的编码器,只保留你需要的字段,以下是Go语言中的实现示例:

自定义JSON编码器过滤字段

package main

import (
	"os"

	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
)

func main() {
	// 定义需要保留的字段集合
	allowedFields := map[string]bool{
		"time":            true,
		"prefix":          true,
		"error_message":   true,
		"function_name":   true,
		"controller_name": true,
	}

	// 基础编码器配置,先忽略不需要的默认字段
	baseEncoderConfig := zapcore.EncoderConfig{
		TimeKey:        "time",
		LevelKey:       zapcore.OmitKey,
		NameKey:        zapcore.OmitKey,
		CallerKey:      zapcore.OmitKey,
		MessageKey:     zapcore.OmitKey,
		StacktraceKey:  zapcore.OmitKey,
		LineEnding:     zapcore.DefaultLineEnding,
		EncodeTime:     zapcore.ISO8601TimeEncoder,
	}

	// 创建自定义编码器,过滤字段
	customEncoder := zapcore.NewJSONEncoder(baseEncoderConfig).Clone()
	customEncoder = zapcore.NewMapObjectEncoder().EncodeEntry(func(entry zapcore.Entry, fields []zapcore.Field) map[string]interface{} {
		fieldMap := make(map[string]interface{})
		encoder := zapcore.NewMapObjectEncoder()
		encoder.AddTime("time", entry.Time)
		// 将所有字段加载到临时map
		for _, field := range fields {
			field.AddTo(encoder)
		}
		// 只保留允许的字段
		for k, v := range encoder.Fields {
			if allowedFields[k] {
				fieldMap[k] = v
			}
		}
		return fieldMap
	})

	// 构建Zap核心并创建logger
	core := zapcore.NewCore(
		customEncoder,
		zapcore.Lock(os.Stdout),
		zapcore.ErrorLevel,
	)
	logger := zap.New(core)

	// 示例日志输出
	logger.Error("",
		zap.String("prefix", "auth"),
		zap.String("error_message", "str.toLowerCase1 is not a function"),
		zap.String("function_name", "signin"),
		zap.String("controller_name", "LoginController"),
	)
}

简化版:输出时仅传入目标字段

如果不需要全局过滤,也可以在输出日志时只传递需要的字段:

// 创建带固定前缀的logger
authLogger := logger.With(zap.String("prefix", "auth"))
// 输出时仅传入需要的字段
authLogger.Error("",
	zap.String("error_message", "str.toLowerCase1 is not a function"),
	zap.String("function_name", "signin"),
	zap.String("controller_name", "LoginController"),
)

二、处理已生成的Zap日志文件

如果日志已经生成并保存为文件,可以用jq工具(轻量级JSON处理命令行工具)提取指定字段:

提取指定字段并格式化输出

假设日志文件名为app.log,执行以下命令:

# 提取字段并以JSON格式输出
jq '{time, prefix, error_message, function_name, controller_name}' app.log

# 提取字段并以更易读的文本格式输出
jq -r '"Time: \(.time) | Service: \(.prefix) | Error: \(.error_message) | Function: \(.function_name) | Controller: \(.controller_name)"' app.log

筛选特定条件的日志

比如只提取prefix为auth的错误日志:

jq 'select(.prefix == "auth") | {time, error_message, function_name}' app.log

内容的提问来源于stack exchange,提问作者Mohamed Ibjas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 14:32:14