Golang把所有包括底层类库,输出到stderr的内容, 重新定向到一个日志文件里面?
不论应用是如何部署的,我们都期望能扑捉到应用的错误日志,
解决思路:
- 自己写代码处理异常拦截,甚至直接在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
比较变态的是,我看到下面的写法,确保记录异常日志。
if crashFile, err := os.OpenFile(fmt.Sprintf("%v--crash.log", path), os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0664); err == nil {
crashFile.WriteString(fmt.Sprintf("%v Opened crashfile at %v", os.Getpid(), time.Now()))
os.Stderr = crashFile
syscall.Dup2(int(crashFile.Fd()), 2)
}
参考资料:
怎么把所有包括底层类库,输出到stderr的内容, 重新定向到一个日志文件里面?
https://groups.google.com/forum/#!topic/golang-china/qUtCQSq6_S8
Replacing os.Stdout/os.Stderr should redirect panic #325
https://github.com/golang/go/issues/325
runtime: support for daemonize
https://github.com/golang/go/issues/227
stdin, stdout, stderr以及重定向
http://my.oschina.net/qihh/blog/55308
Windows管道(Pipe)重定向stdout,stderr,stdin
http://blog.csdn.net/c80486/article/details/6589292
stdin, stdout, stderr 详解
http://www.cnblogs.com/puputu/archive/2010/06/02/1749769.html
golang中os/exec包用法
http://blog.csdn.net/chenbaoke/article/details/42556949
12.3 应用部署
https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/12.3.md
Go到目前还没有解决成为守护进程(Daemonize)的问题吧?各位是怎么解决的?
http://segmentfault.com/q/1010000000699471
Golang把所有包括底层类库,输出到stderr的内容, 重新定向到一个日志文件里面?的更多相关文章
- tail -f 实时跟踪一个日志文件的输出内容
tail -f 实时跟踪一个日志文件的输出内容 http://hittyt.iteye.com/blog/1927026 https://blog.csdn.net/mengxianhua/arti ...
- Linux下Shell命令的输出信息同时显示在屏幕和保存到日志文件中
#直接覆盖日志文件 ls -l | tee ./t.log #将输出内容附加到日志文件 ls -l | tee -a ./t.log 使用的是tee命令
- flipt 一个基于golang 的特性工具开发类库
以前介绍过一个Flagr 的基于golang 的特性功能开发类库(技术雷达推荐),今天看到一个类似也很不错的方案flipt 参考架构 包含的特性 快速,使用golang 编写,同时进行了性能优化 运行 ...
- log4j.properties配置与将异常输出到Log日志文件实例
将异常输出到 log日志文件 实际项目中的使用: <dependencies> <dependency> <groupId>org.slf4j</groupI ...
- log4j配置输出到多个日志文件
通常我们项目里,有一些重要的日志想单独的输出到指定的文件,而不是全总输出到系统的日志文件中.那么我们log4j为我们提供了这种功能,以下我们来一步一步看是怎么做的.这里以property的配置方式写. ...
- log4j配置输出到多个日志文件(转)
參考资料:http://logging.apache.org/log4j/1.2/manual.html 通常我们项目里,有一些重要的日志想单独的输出到指定的文件,而不是全总输出到系统的日志文件中.那 ...
- log4j输出多个自定义日志文件,动态配置路径
Log4J的配置文件(Configuration File)就是用来设置记录器的级别.存放器和布局的,它可接key=value格式的设置或xml格式的设置信息.通过配置,可以创建出Log4J的运行环境 ...
- 记一次log4j日志文件输出错误的解决
log4j错误信息:log4j:ERROR Failed to rename [D:/logs/wmts_] to [D:/logs/wmts_2015-12-21.log ]. 起因:部门网站使用B ...
- log4j日志输出到日志文件中和控制台中 +log4j配置详解
1.引入log4j的jar包 https://mvnrepository.com/,可以找到log4j的jar和依赖. 2.创建log4j.properties,并配置log4j #设置日志的级别 , ...
随机推荐
- 【timeisprecious】【JavaScript 】JavaScript对象
JavaScript 对象 var a=[];console.log(new Boolean(a)); VM1319: Boolean {true} undefined var a=[];consol ...
- LOJ#2076. 「JSOI2016」炸弹攻击(模拟退火)
题面 传送门 题解 退火就好了 记得因为答案比较小,但是温度比较高,所以在算\(\exp\)的时候最好把相差的点数乘上一个常数来让选取更劣解的概率降低 话虽如此然而我自己打的退火答案永远是\(0\)- ...
- var在PHP和JS中的使用
一,var在PHP中的使用 var在PHP中使用很少,只在类中声明成员变量时候,可以使用var,其相当于public,而且以后逐渐用public替代var,所以在PHP中尽量不使用var声明变量. 二 ...
- 部署LVS-DR群集
一.LVS-DR原理剖析 (一)LVS-DR数据包流向分析 1.Client向目标VIP发出请求,Director(负载均衡器)接收.此时IP包头及数据帧头信息为: 2.Director根据负载均衡算 ...
- jscover使用说明-总体说明
1.总体说明 这个文档现在是完善和准确的,不管怎样,尽量去参考JSCoverage documentation. 1.1.介绍 JSCove是一个用来显示JavaScript项目代码覆盖率的工具,它是 ...
- js及Java中对于两个时间日期的判断脚本
JS脚本: function checkDateIsEdited(createDate) { var compareDate = createDate.replace("-",&q ...
- windows 域的安装方法
前面的博客中我们知道了 Windows AD域的升级,下面我谈谈Windows域的安装和卸载. 卸载AD域 配置备份AD域 安装子域 删除子域(必须在根域管理员模式下删除,否则无法删除) 删除命令 导 ...
- PlistBuddy简单使用
PlistBuddy简单使用 由于PlistBuddy并不在Mac默认的Path里,所以我们得通过绝对路径来引用这个工具: 查看帮助 /usr/libexec/PlistBuddy --help 下面 ...
- gettimeofday
作用: 需要打印代码执行到某处的时间,或者需要计算程序执行的时间差(精确到微妙级).这时会用到gettimeofday函数,它可以返回自1970-01-01 00:00:00到现在经历的秒数. 原型: ...
- mysq5.7
1.mv mysql-5.7.22-linux-glibc2.12-x86_64 mysql 2. chown -R work:work /home/work/mysql 3.su - work 4. ...