Golang把所有包括底层类库,输出到stderr的内容, 重新定向到一个日志文件里面?
来源:互联网 发布:制作mod的软件 编辑:程序博客网 时间:2024/05/16 05:34
下面代码转载自:http://studygolang.com/articles/2343
不论应用是如何部署的,我们都期望能扑捉到应用的错误日志,
解决思路:
- 自己写代码处理异常拦截,甚至直接在main函数中写异常拦截。
- stderr重定向到某个文件里
- 使用 syscall.Dup2
第一种方法比较简单, 我们这里主要看后两种:
使用 stderr替换的代码:
package main
import (
"fmt"
"os"
)
func main() {
f, _ := os.OpenFile("C:\\tmp\\11.txt", os.O_WRONLY|os.O_CREATE|os.O_SYNC,
0755)
os.Stdout = f
os.Stderr = f
fmt.Println("fmt")
fmt.Print(make(map[int]int)[0])
}
这里的 Stdout 、Stderr 的含义如下, 同样也适用win:
在通常情况下,UNIX每个程序在开始运行的时刻,都会有3个已经打开的stream. 分别用来输入,输出,打印诊断和错误信息。通常他们会被连接到用户终端. 但也可以改变到其它文件或设备。
Linux内核启动的时候默认打开的这三个I/O设备文件:标准输入文件stdin,标准输出文件stdout,标准错误输出文件stderr,分别得到文件描述符 0, 1, 2。
stdin是标准输入,stdout是标准输出,stderr是标准错误输出。大多数的命令行程序从stdin输入,输出到stdout或stderr。
上面方法,可能会拦截不到一些系统级别的崩溃信息,这时候就需要走下面的方案了。
使用 syscall.Dup2 的例子如下, 注意 windows 下会编译直接报错: undefined: syscall.Dup2, 只有 linux 下才可以用。
syscall.Dup2 is a linux/OSX only thing. there's no windows equivalent。
参考: https://github.com/golang/go/issues/325
package main
import (
"fmt"
"os"
"syscall"
)
func main() {
logFile, _ := os.OpenFile("/tmp/x", os.O_WRONLY|os.O_CREATE|os.O_SYNC, 0755)
syscall.Dup2(int(logFile.Fd()), 1)
syscall.Dup2(int(logFile.Fd()), 2)
fmt.Printf("Hello from fmt\n")
panic("Hello from panic\n")
}
这两个区别,我看到有下面描述文字:
https://github.com/golang/go/issues/325
- Golang把所有包括底层类库,输出到stderr的内容, 重新定向到一个日志文件里面?
- 怎样把sqlplus执行的查询结果重定向输出到一个文件里面去?
- Linux重定向:将标准输出stdout和标准错误stderr重定向到一个文件
- golang语言实现读取csv文件内容,把相同的内容提取到另外一个文件
- 流合并(把多个文件里面的内容写到一个文件里面)
- Linux命令执行的屏幕输出内容重定向到日志文件
- python输出重定向到stderr
- Linux 技巧:重定向 stderr 和 stdout 输出到 gdb 窗口 挺不错 特别是里面的call调用
- 【Log】一个功能强大的Log封装库包括控制日志输出,保存Log到文件,过滤输出等级。。
- awk把所有日期下的内容输出到同一个文件中
- stdin,stdout,stderr,生定向到文件
- 如何重定向stdout,stderr到文件
- C++ stderr/stdout 重定向到文件
- eclispe控制台输出太多前面的被掩盖,设置输出定向到一个文件,但是文件有时候内容不全问题解决
- 把GCC的编译信息重定向到一个文件
- 将一个文件的内容添加到另一个文件里面
- 程序日志中自动记录所在函数名、文件名、行号,并定向输出到一个日志文件
- python 的重定向输出到一个文件
- (一)C++语言中类对象的本质
- 51nod 1022 石子归并 环形+四边形优化
- arm9+linux fl2440 GPRS SIM卡 模块 ppp拨号上网
- RESTFUL API 安全设计指南
- Codeforces 525C. Ilya and Sticks
- Golang把所有包括底层类库,输出到stderr的内容, 重新定向到一个日志文件里面?
- java--ArrayList去除集合中字符串的重复值
- 链队列的实现
- JavaScript ECMAScript5
- Quartz时间配置规则
- 特殊的算术操作指令详解
- 面试算法题
- 构建之法学习心得3:源代码的合作
- hdoj-1042-N!