讲师中心 微信公众号
AI工具推荐 视频效率加速

如何在 Go 中写入日志文件

陌强同学_2225

陌强同学_2225

发布时间:2024-09-15 08:03:05

|

827人浏览过

|

来源于dev.to

转载

如何在 go 中写入日志文件

登录 unix 系统

unix 有自己的日志文件来写入来自服务器和正在运行的程序的信息。在大多数 unix 系统上,这些文件可以在 /var/log 目录中找到。然而,一些流行服务的日志文件,例如 apache 或 nginx 可以在任何地方找到,具体取决于您的配置。

在文件中记录和存储日志信息是异步检查软件中的数据和信息的便捷方法,可以在本地、中央日志服务器上,或使用其他软件(例如 elasticsearch、beats 和 grafana loki)。

unix 日志服务支持两个属性,称为日志级别 和日志记录工具。 日志记录级别 是指定日志记录条目的严重性的值。有几个级别,包括 debug、info、notice、warning、err、crit、alert 和 emerg,按照严重程度的顺序排列。

go 标准库日志记录包不支持使用 日志级别。

日志记录工具就像一个用于记录信息的类别。 日志记录工具部分的值可以是 auth、authpriv、cron、daemon、kern、lpr、mail、mark、news、syslog、user、
uucp、local0、local1、local2、local3、local4、local5、local6 或 local7,在 /etc/syslog.conf、/etc/rsyslog.conf 或其他适当的文件中定义,具体取决于用于记录系统的服务器进程。你的 unix 机器。这意味着如果日志记录工具未正确定义,则不会对其进行处理;因此,您发送给它的日志消息可能会被忽略并因此丢失。

在 go 中工作时记录日志

日志包将日志消息发送到系统的标准错误输出。日志包的一部分是 log/syslog 包,它允许您将日志消息发送到计算机的 syslog 服务器。尽管默认情况下日志会写入标准错误输出,但使用 log.setoutput() 会修改该行为。发送日志数据的函数列表包括log.printf()、log.print()、log.println()、log.fatalf()、log.fatalln()、log.panic()、log.panicln()和 log.panicf().

日志记录适用于应用程序代码,而不是库代码。如果您正在开发库,请不要登录它们。

写入主系统日志文件就像使用 syslog.log_syslog 选项调用 syslog.new() 一样简单。之后,您必须告诉您的 go 程序,所有日志信息都将转到新的记录器;这是通过调用 log.setoutput() 函数来实现的。下面的代码说明了该过程。

package main

import (
  "log"
  "log/syslog"
)

func main() {
syslog, err := syslog.new(syslog.log_syslog, "systemlog.go")

  if err != nil {
    log.println(err)
    return
  } else {
    log.setoutput(syslog)
    log.print("everything is fine!")
  }
}

执行此代码不会生成任何结果。但是,如果您在 linux 计算机上运行journalctl -xe,您将看到如下所示的条目:

jun 08 20:46:05 thinkpad systemlog.go[4412]: 2023/06/08 20:46:05
everything is fine!
jun 08 20:46:51 thinkpad systemlog.go[4822]: 2023/06/08 20:46:51
everything is fine!

log.fatal() 和 log.panic() 函数

当发生错误并且您只想在报告错误情况后尽快退出程序时,将使用 log.fatal() 函数。调用 log.fatal() 在打印错误消息后调用 log.fatal() 的地方结束 go 程序。

在某些情况下,程序即将永久失败,而您希望获得尽可能多的有关失败的信息; log.panic() 意味着确实发生了意外和未知的事情,例如无法找到文件。与 log.fatal() 函数类似,log.panic() 打印一条自定义消息并立即终止 go 程序。

让我们看一下这两个函数的使用示例。

Linuxdo Application
Linuxdo Application

为 Linux.do 注册撰写高通过率、去 AI 化的中文小作文。进行自适应调查以了解申请人的真实背景,...

下载
package main

import (
  "log"
  "os"
)

func main() {
  if len(os.args) != 1 {
    log.fatal("fatal: hello world!")
  }
  log.panic("panic: hello world!")
}

不带参数执行上述代码会产生以下输出:

$ go run logs.go
2023/06/08 20:48:42 panic: hello world!
panic: panic: hello world!
goroutine 1 [running]:
log.panic({0xc000104f60?, 0x0?, 0x0?})
/usr/lib/go/src/log/log.go:384 +0x65
main.main()
/home/mtsouk/code/mgo4th/ch01/logs.go:12 +0x85
exit status 2

写入自定义文件

大多数时候,尤其是在部署到生产环境的应用程序和服务中,有必要将日志数据写入文件。

让我们看一个例子。

package main

import (
  "fmt"
  "log"
  "os"
  "path"
)

func main() {
  logfile := path.join(os.tempdir(), "mgo.log")
  fmt.println(logfile)
  f, err := os.openfile(logfile, os.o_append|os.o_create|os.o_wronly, 0644)
  if err != nil {
    fmt.println(err)
    return
  }
  defer f.close()

  ilog := log.new(f, "ilog ", log.lstdflags)
  ilog.println("hello there!")
  ilog.println("mastering go 4th edition!")
}

调用 os.openfile() 会创建用于写入的日志文件(如果该日志文件尚不存在),或者通过在末尾附加新数据 (os.o_append) 将其打开以进行写入。

最后三个语句基于打开的文件 (f) 创建一个新的日志文件,并使用 println() 向其中写入两条消息。

将行号添加到日志条目

所需的功能是通过在 log.new() 或 setflags() 参数中使用 log.lshortfile 来实现的。 log.lshortfile 标志将文件名以及打印日志条目的 go 语句的行号添加到日志条目本身。如果您使用 log.llongfile 而不是 log.lshortfile,您将获得 go 源文件的完整路径。

让我们看一个例子。

package main

import (
  "fmt"
  "log"
  "os"
  "path"
)

func main() {
  logfile := path.join(os.tempdir(), "mgo.log")
  fmt.println(logfile)
  f, err := os.openfile(logfile, os.o_append|os.o_create|os.o_wronly, 0644)
  if err != nil {
    fmt.println(err)
    return
  }
  defer f.close()

  lstdflags := log.ldate | log.lshortfile
  ilog := log.new(f, "lnum ", lstdflags)
  ilog.println("mastering go, 4th edition!")
  ilog.setflags(log.lshortfile | log.lstdflags)
  ilog.println("another log entry!")
}

写入多个日志输出

io.multiwriter() 函数允许我们写入多个目的地,在本例中是一个名为 mylog.log 的文件和标准错误输出。

package main

import (
  "fmt"
  "io"
  "log"
  "os"
)

func main() {
  flag := os.O_APPEND | os.O_CREATE | os.O_WRONLY
  file, err := os.OpenFile("myLog.log", flag, 0644)
  if err != nil {
    fmt.Println(err)
    os.Exit(0)
  }
  defer file.Close()

  w := io.MultiWriter(file, os.Stderr)
  logger := log.New(w, "myApp: ", log.LstdFlags)
  logger.Printf("BOOK %d", os.Getpid())
}

结论

尽管有各种额外功能的社区包来丰富我们的注册表、远程存储条目等;标准库的日志包非常有趣,很多时候它就是我们 go 开发所需要的。

热门AI工具

更多
墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

相关专题

更多
nginx 重启
nginx 重启

nginx重启对于网站的运维来说是非常重要的,根据不同的需求,可以选择简单重启、平滑重启或定时重启等方式。本专题为大家提供nginx重启的相关的文章、下载、课程内容,供大家免费下载体验。

423

2023.07.27

nginx 配置详解
nginx 配置详解

Nginx的配置是指设置和调整Nginx服务器的行为和功能的过程。通过配置文件,可以定义虚拟主机、HTTP请求处理、反向代理、缓存和负载均衡等功能。Nginx的配置语法简洁而强大,允许管理员根据自己的需要进行灵活的调整。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

4067

2023.08.04

nginx配置详解
nginx配置详解

NGINX与其他服务类似,因为它具有以特定格式编写的基于文本的配置文件。本专题为大家提供nginx配置相关的文章,大家可以免费学习。

6925

2023.08.04

tomcat和nginx有哪些区别
tomcat和nginx有哪些区别

tomcat和nginx的区别:1、应用领域;2、性能;3、功能;4、配置;5、安全性;6、扩展性;7、部署复杂性;8、社区支持;9、成本;10、日志管理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

601

2024.02.23

nginx报404怎么解决
nginx报404怎么解决

当访问 nginx 网页服务器时遇到 404 错误,表明服务器无法找到请求资源,可以通过以下步骤解决:1. 检查文件是否存在且路径正确;2. 检查文件权限并更改为 644 或 755;3. 检查 nginx 配置,确保根目录设置正确、没有冲突配置等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1516

2024.07.09

Nginx报404错误解决方法
Nginx报404错误解决方法

解决方法:只需要加上这段配置:try_files $uri $uri/ /index.html;即可。想了解更多Nginx的相关内容,可以阅读本专题下面的文章。

3998

2024.08.07

nginx部署php项目教程汇总
nginx部署php项目教程汇总

本专题整合了nginx部署php项目教程汇总,阅读专题下面的文章了解更多详细内容。

122

2026.01.13

nginx配置文件详细教程
nginx配置文件详细教程

本专题整合了nginx配置文件相关教程详细汇总,阅读专题下面的文章了解更多详细内容。

557

2026.01.13

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

0

2026.11.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn