Просмотр исходного кода

log/io: rebuild: 优化 MultiLogger 类型的处理逻辑

* 当 `withMain == false` 时不再引入 `Console ()` 控制台日志,这会影响 `log.Part()` 函数
* 即使传入类型是 `MultiLogger`,但处理后如果只有1个 `*Log` 则返回 `*Log` 类型,而不是 `MultiLogger` 类型
Matt Evan 6 часов назад
Родитель
Сommit
1aef4656e0
1 измененных файлов с 15 добавлено и 5 удалено
  1. 15 5
      log/io.go

+ 15 - 5
log/io.go

@@ -57,22 +57,32 @@ func rebuild(l Logger, subPath, prefix string, withMain bool) Logger {
 				}
 			} else {
 				if w == os.Stdout {
-					pool = append(pool, Console())
+					if withMain {
+						pool = append(pool, Console())
+					}
 				} else {
 					pool = append(pool, w)
 				}
 			}
 		}
+		if len(pool) == 0 {
+			return nil
+		}
 		return NewLog(old.level, pool, prefix, old.depth, old.buf)
 	case MultiLogger:
-		part := make(MultiLogger, len(old))
-		for i, ol := range old {
+		part := make(MultiLogger, 0, len(old))
+		for _, ol := range old {
 			if lg, ok := ol.(*Log); ok {
-				part[i] = rebuild(lg, subPath, prefix, withMain)
+				if ng := rebuild(lg, subPath, prefix, withMain); ng != nil {
+					part = append(part, ng)
+				}
 			} else {
-				part[i] = ol
+				part = append(part, ol)
 			}
 		}
+		if len(part) == 1 {
+			return part[0]
+		}
 		return part
 	default:
 		return l