0

0

如何在 Go 中写入日志文件

DDD

DDD

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

|

687人浏览过

|

来源于dev.to

转载

如何在 go 中写入日志文件

登录 unix 系统

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

在文件中记录和存储日志信息是异步检查软件中的数据和信息的便捷方法,可以在本地、中央日志服务器上,或使用其他软件(例如 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 程序。

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

通吃客零食网整站 for Shopex
通吃客零食网整站 for Shopex

第一步】:将安装包中所有的文件夹和文件用ftp工具以二进制方式上传至服务器空间;(如果您不知如何设置ftp工具的二进制方式,可以查看:(http://www.shopex.cn/support/qa/setup.help.717.html)【第二步】:在浏览器中输入 http://您的商店域名/install 进行安装界面进行安装即可。【第二步】:登录后台,工具箱里恢复数据管理后台是url/sho

下载
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工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
nginx 重启
nginx 重启

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

235

2023.07.27

nginx 配置详解
nginx 配置详解

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

512

2023.08.04

nginx配置详解
nginx配置详解

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

543

2023.08.04

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

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

237

2024.02.23

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

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

431

2024.07.09

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

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

3585

2024.08.07

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

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

44

2026.01.13

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

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

60

2026.01.13

Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

132

2026.02.06

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 8.8万人学习

Git 教程
Git 教程

共21课时 | 3.5万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号