如何使用Golang log设置日志输出格式_Golang log日志格式示例
技术百科
P粉602998670
发布时间:2026-01-01
浏览: 次 Go标准库log仅支持前缀开关和输出重定向,不支持结构化日志;需用zap等专用库实现JSON、level等字段化功能。
Go log.SetFlags() 控制日志前缀和格式
Go 标准库 log 包本身不支持自定义字段(如 JSON、level 字段),但能通过 log.SetFlags() 控制时间、文件名、行号等前缀开关。默认只输出内容,没时间戳——这是新手最常忽略的“日志看起来没格式”的原因。
-
log.Ldate | log.Ltime:输出类似2025/05/12 14:23:56 message -
log.Lshortfile:显示main.go:23;log.Llongfile显示完整路径 - 多个标志用按位或组合:
log.SetFlags(log.Lda
te | log.Ltime | log.Lshortfile) - 设为
0可完全禁用所有前缀,只留原始字符串
Go log.SetOutput() 重定向日志到文件或 stderr
默认输出到 os.Stderr,但容易和错误流混在一起。生产环境通常要写入文件,或区分 info/warn/error 流。注意:直接传 *os.File 是安全的,但别传已关闭的文件句柄,否则后续 log.Print() 会 panic 并报 write /dev/stderr: bad file descriptor。
- 写入文件:
log.SetOutput(newFile),记得用os.OpenFile(..., os.O_CREATE|os.O_APPEND|os.O_WRONLY) - 同时输出到控制台和文件?需封装
io.MultiWriter - 避免在 goroutine 中反复调用
SetOutput—— 它不是并发安全的,且会覆盖全局实例
为什么不要直接用标准 log 做结构化日志
当你需要 {"level":"info","msg":"user login","uid":1001} 这种格式时,log 包无能为力。它不解析内容,只拼接字符串前缀 + fmt.Sprint() 结果。强行用 log.Printf("{\"level\":\"info\",...}") 会导致转义混乱、无法统一字段顺序、缺失堆栈上下文。
- 推荐替代方案:
zap(高性能)、zerolog(零分配)、logrus(易上手) - 如果必须用标准库,可封装一个函数生成 JSON 字符串再交给
log.Print(),但无法享受结构化解析优势 - 注意:
log.SetPrefix()只加固定前缀(如[INFO]),不能动态插入变量
package main
import (
"log"
"os"
)
func main() {
// 启用日期、时间、短文件名
log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)
// 写入文件而非 stderr
f, _ := os.OpenFile("app.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
log.SetOutput(f)
defer f.Close()
log.Println("server started")
log.Printf("listening on %s", ":8080")
}
标准库 log 的格式能力仅限于前缀开关和输出目标,真要字段化、分级、采样、Hook,得换专用日志库——这点在项目初期就该明确,别等到日志查不出问题才回头重构。
# ai
# 这是
# 多个
# 当你
# 结构化
# 不出
# app
# 重定向
# 设为
# 不支持
# js
# json
# go
# golang
# Error
# 并发
# 堆
# 标准库
# 字符串
# 重构
# 为什么
# 栈
# printf
# 行号
# 封装
# 句柄
# print
# sprint
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- 如何在 Go 中正确初始化结构体中的 map 字段
- Win11如何设置环境变量 Win11添加和修改系
- PHP的FastAdmin架构适合二次开发吗_特点
- php修改数据怎么改富文本_update更新htm
- Win11怎么设置按流量计费_Win11限制后台流
- 如何使用Golang实现路由参数绑定_使用Mux和
- php后缀怎么变mp4能播放_让php伪装mp4正
- c++中explicit(bool)的用法 c++
- 如何在Windows中创建新的用户账户?(标准与管
- 如何在Golang中实现基础配置管理功能_Gola
- Win11怎么设置单手模式_Win11触控键盘布局
- 如何在Golang中操作嵌套切片指针_Golang
- PhpStorm怎么调试PHP代码_PhpStor
- Windows10系统服务优化指南_Win10禁用
- windows系统找不到无线网络怎么办_windo
- Windows10系统怎么查看防火墙状态_Win1
- 如何用::实现工具类方法调用_php静态工具类设计
- 如何在JavaScript中动态拼接PHP的bas
- Mac如何与安卓手机传文件_Mac和Android
- php接口返回数据乱码怎么办_php接口调试编码问
- Win11输入法选字框不见了怎么办_Win11输入
- Python装饰器设计思路_功能增强机制说明【指导
- 如何使用Golang反射创建map对象_动态生成键
- Win11资源管理器卡顿怎么办 Win11文件资源
- VSC怎样用终端运行PHP_命令行执行脚本的步骤【
- Linux如何使用Curl发送请求_Linux下A
- 如何使用Golang捕获并记录协程panic_保证
- Win10如何更改用户账户控制_Windows10
- 如何更改Windows资源管理器的默认启动位置?(
- Win11怎么关闭透明效果_Windows11个性
- Win11怎么关闭触控板_Win11笔记本禁用触摸
- Laravel 查询 JSON 列:高效筛选包含数
- Python列表推导式与字典推导式教程_简化代码高
- Win11怎么硬盘分区 Win11新建磁盘分区详细
- php内存溢出怎么排查_php内存限制调试与优化方
- Mac如何修复应用程序权限问题_Mac磁盘工具修复
- Win10如何卸载预装Edge扩展_Win10卸载
- Win11怎么设置开机密码_Windows11账户
- 小程序里php怎么变mp4_小程序调用php生成m
- Linux怎么实现内网穿透_Linux安装Frp客
- Win11怎么更改默认打开方式_Win11关联文件
- Win10如何设置双wan路由器 Win10双wa
- Mac如何调整Dock栏大小和位置_Mac程序坞个
- Go 语言标准库为何不提供泛型 Contains
- php485在php5.6下能用吗_php485旧
- Win11怎么禁用键盘自带键盘_Win11笔记本禁
- c++怎么使用std::filesystem遍历文
- Win10怎样清理C盘Steam游戏缓存_Win1
- Drupal 中 HTML 链接被重复转义导致渲染
- php能控制zigbee模块吗_php通过串口与c

te | log.Ltime | log.Lshortfile)
QQ客服