我有代码
if config.Process.TraceLog != "" {
f, err := os.OpenFile(config.Process.TraceLog, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
fmt.Println("error opening log file: %v", err)
os.Exit(1)
}
Trace.SetOutput(f)
}
if config.Process.InfoLog != "" {
f, err := os.OpenFile(config.Process.InfoLog, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
fmt.Println("error opening log file: %v", err)
os.Exit(1)
}
Info.SetOutput(f)
}
if config.Process.WarningLog != "" {
f, err := os.OpenFile(config.Process.WarningLog, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
fmt.Println("error opening log file: %v", err)
os.Exit(1)
}
Warning.SetOutput(f)
}
if config.Process.ErrorLog != "" {
f, err := os.OpenFile(config.Process.ErrorLog, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
fmt.Println("error opening log file: %v", err)
os.Exit(1)
}
Error.SetOutput(f)
}
缩短它的好方法是什么?我不想重复4次非常类似的阻止。
如何在循环中制作它?我尝试使用文件名和记录器对象创建地图,但不知道如何正确发布参考
答案 0 :(得分:1)
这就是我最终做到的方式
m := map[string]*log.Logger{
config.Process.TraceLog: Trace,
config.Process.InfoLog: Info,
config.Process.WarningLog: Warning,
config.Process.ErrorLog: Error,
}
for filepath, l := range m {
if filepath != "" {
f, err := os.OpenFile(filepath, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
fmt.Println("error opening log file: %v", err)
os.Exit(1)
}
l.SetOutput(f)
}
}
答案 1 :(得分:0)
这样的东西可以工作(您可能需要调整界面中的函数类型或完全删除界面):
setLogIfNotEmpty(config.Process.TraceLog, Trace)
setLogIfNotEmpty(config.Process.InfoLog, Info)
setLogIfNotEmpty(config.Process.WarningLog, Warning)
setLogIfNotEmpty(config.Process.ErrorLog, Error)
interface SetOutputer {
SetOutput(*os.File)
}
func setLogIfNotEmpty(file string, log SetOutputer) {
if file != "" {
f, err := os.OpenFile(file, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
fmt.Println("error opening log file: %v", err)
os.Exit(1)
}
log.SetOutput(f)
}
}