go - 为什么使用自定义 log.Logger 记录到文件失败?
问题描述
我无法让我的程序从 main() 之外的函数写入日志文件,我确实看到了类似的https://stackoverflow.com/a/19966217/4374801,但没有解决我的确切问题。
这是我正在做的重要部分:
var (
Info *log.Logger
Error *log.Logger
)
func init() {
// set up log file
fileHandle, err := os.OpenFile("/var/log/checkcert", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644)
if err != nil {
log.Fatal(err)
}
//defer to close when you're done with it
defer fileHandle.Close()
//set output of logs to fileHandle
log.SetOutput(fileHandle)
Info = log.New(fileHandle,
"Log: ",
log.Ldate|log.Ltime|log.Lshortfile)
Error = log.New(fileHandle,
"Error: ",
log.Ldate|log.Ltime|log.Lshortfile)
}
// The function below is called from main()
// The version here is truncated to the pertinent bit
func checkDomain(){
Info.Println("test inside checkDomain")
}
以上创建了日志文件,但没有将测试写入其中。如果我在 init() 中放置一个测试 Println,那就可以了。
解决方案
defer 将在函数结束时执行,这意味着您的文件将在 init 函数结束时关闭,甚至在您运行 main 之前。在 main 结束之前你不应该关闭你的文件,所以也许考虑将你的 loggers 和文件的初始化移动到 main 而不是 init 的开头。
推荐阅读
- javascript - 如何在javascript中将图像(svg)转换为渲染的svg?
- java - NFA/DFA 正则表达式之间的模式差异
- sql - 编写嵌套 SQL 查询
- gnuplot - 在gnuplot中读取赤经/赤纬坐标
- csv - 如何使用 Apache Calcite 对 CSV 文件执行 UPSERT?
- elasticsearch - Confluent 5.4.0 ElasticSearch Sink Connector 中没有连接器类型错误
- c# - 无法找到元数据 DLL VS 2019 Xamarin
- c - Gtk3 - 未解决的包含
- unity3d - 使用 MRTK 交互时设置螺旋运动
- sql-server - jdbc模板和分页