kratos日志打印文件名和调用位置

博客展示了Go语言中日志记录器的相关代码。通过log.NewStdLogger创建标准日志记录器,使用log.With添加调用者信息,最后用log.NewHelper创建辅助日志记录器,体现了Go语言在日志处理方面的操作。

logger := log.NewStdLogger(os.Stdout)
    logger = log.With(logger, “caller”, GetFileAndPath)
    l := log.NewHelper(logger)

// ExportTaskDetailToExcel 将 TaskDetail 结果导出为 Excel 并返回文件流(可用于 HTTP 下载) func (impl *nearStatServiceImpl) ExportTaskDetailToExcel(param *req.NearInstanceTaskDetailReq) (io.ReadSeeker, string, error) { // 先获取原始数据 result, svcErr := impl.TaskDetail(param) if svcErr != nil { return nil, "", fmt.Errorf("failed to load task detail: %v", svcErr) } // 创建 Excel 文件 f := excelize.NewFile() defer f.Close() // 创建工作表 sheetName := "SQL指纹统计" index, _ := f.NewSheet(sheetName) f.SetActiveSheet(index) // 设置标题行(可根据 res.NearSqlFpStat 字段调整) headers := []string{ "SQL指纹", "总执行次数", "总执行时间(μs)", "平均执行时间(μs)", "最大执行时间(μs)", "最小执行时间(μs)", } headerCols := []string{"A", "B", "C", "D", "E", "F"} for i, col := range headerCols { cell := fmt.Sprintf("%s1", col) f.SetCellValue(sheetName, cell, headers[i]) } // 填充数据 for i, item := range result.SqlFpStatList { row := i + 2 // 第二行开始写入 f.SetCellValue(sheetName, fmt.Sprintf("A%d", row), item.SqlFp) f.SetCellValue(sheetName, fmt.Sprintf("B%d", row), item.TotalNum) f.SetCellValue(sheetName, fmt.Sprintf("C%d", row), item.TotalExeTime) f.SetCellValue(sheetName, fmt.Sprintf("D%d", row), item.AvgExeTime) f.SetCellValue(sheetName, fmt.Sprintf("E%d", row), item.MaxExeTime) f.SetCellValue(sheetName, fmt.Sprintf("F%d", row), item.MinExeTime) } // 可选:自动列宽(Excelize 不直接支持,需估算) _ = f.SetColWidth(sheetName, "A", "A", 50) // SQL指纹列宽一些 _ = f.SetColWidth(sheetName, "B", "F", 15) // 创建加粗样式的 Style ID boldStyle, err := f.NewStyle(&excelize.Style{ Font: &excelize.Font{Bold: true}, }) if err != nil { logger.Errorf("创建加粗样式失败: %v", err) return nil, "", err } // 使用 style ID 设置单元格样式 err = f.SetCellStyle(sheetName, "A1", fmt.Sprintf("%s1", headerCols[len(headerCols)-1]), boldStyle) if err != nil { logger.Errorf("设置标题行加粗失败: %v", err) return nil, "", err } // 创建一个 buffer 来接收 Excel 数据 var buf bytes.Buffer // 使用 Write(io.Writer) 方式写入 buffer err = f.Write(&buf) if err != nil { return nil, "", fmt.Errorf("failed to write excel data: %v", err) } // 从 buffer 获取字节流 fileBytes := buf.Bytes() // 使用 bytes.NewReader 实现 io.ReadSeeker reader := bytes.NewReader(fileBytes) // 构造文件名(可包含参数信息) fileName := fmt.Sprintf("延时分析任务_%s_慢日志统计_%d.xlsx", param.Id, time.Now().Unix()) return reader, fileName, nil }
最新发布
11-14
Kratos 中,为了实现将日志同时打印到文件控制台,可按以下步骤操作: ### 1. 导入 Kratos 日志包 首先要导入 Kratos 日志包,若导入失败,需先获取该包: ```go import "github.com/go-kratos/kratos/v2/log" // 若导入失败,则需先获取包 // go get github.com/go-kratos/kratos/v2/log ``` 此步骤依据官方文档,是后续操作的基础 [^2]。 ### 2. 创建文件写入器 要把日志写入文件,得创建一个文件写入器。以下是示例代码: ```go package main import ( "os" "github.com/go-kratos/kratos/v2/log" ) func main() { // 打开日志文件 file, err := os.OpenFile("app.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0666) if err != nil { log.Fatalf("Failed to open log file: %v", err) } defer file.Close() } ``` ### 3. 创建多输出日志器 借助 `log.NewMultiLogger` 函数创建一个能同时向文件控制台输出日志日志器: ```go package main import ( "os" "github.com/go-kratos/kratos/v2/log" ) func main() { // 打开日志文件 file, err := os.OpenFile("app.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0666) if err != nil { log.Fatalf("Failed to open log file: %v", err) } defer file.Close() // 创建文件日志器 fileLogger := log.NewStdLogger(file) // 创建控制台日志器 consoleLogger := log.NewStdLogger(os.Stdout) // 创建多输出日志器 multiLogger := log.NewMultiLogger(fileLogger, consoleLogger) // 使用多输出日志器 logger := log.With(multiLogger, "ts", log.DefaultTimestamp, "caller", log.DefaultCaller) // 记录日志 logger.Log(log.LevelInfo, "msg", "This is a test log message") } ``` 上述代码里,先创建了文件写入器控制台写入器,再使用 `log.NewMultiLogger` 函数把它们组合成一个多输出日志器。之后,使用这个多输出日志器记录日志日志就会同时输出到文件控制台。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值