1ba991379Sopenharmony_ci/*
2ba991379Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
3ba991379Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4ba991379Sopenharmony_ci * you may not use this file except in compliance with the License.
5ba991379Sopenharmony_ci * You may obtain a copy of the License at
6ba991379Sopenharmony_ci *
7ba991379Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8ba991379Sopenharmony_ci *
9ba991379Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10ba991379Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11ba991379Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12ba991379Sopenharmony_ci * See the License for the specific language governing permissions and
13ba991379Sopenharmony_ci * limitations under the License.
14ba991379Sopenharmony_ci */
15ba991379Sopenharmony_ci
16ba991379Sopenharmony_cipackage utils
17ba991379Sopenharmony_ci
18ba991379Sopenharmony_ciimport (
19ba991379Sopenharmony_ci	"fmt"
20ba991379Sopenharmony_ci	"github.com/sirupsen/logrus"
21ba991379Sopenharmony_ci	"os"
22ba991379Sopenharmony_ci	"path/filepath"
23ba991379Sopenharmony_ci	"runtime"
24ba991379Sopenharmony_ci	"strings"
25ba991379Sopenharmony_ci)
26ba991379Sopenharmony_ci
27ba991379Sopenharmony_civar LogFile *os.File
28ba991379Sopenharmony_civar StdoutFile *os.File
29ba991379Sopenharmony_civar osStdout, osStderr = os.Stdout, os.Stderr
30ba991379Sopenharmony_ci
31ba991379Sopenharmony_cifunc init() {
32ba991379Sopenharmony_ci	if err := os.MkdirAll("logs", 0750); err != nil {
33ba991379Sopenharmony_ci		logrus.Errorf("can not make logs dir: %v", err)
34ba991379Sopenharmony_ci		return
35ba991379Sopenharmony_ci	}
36ba991379Sopenharmony_ci	logrus.SetOutput(os.Stdout)
37ba991379Sopenharmony_ci	logrus.SetReportCaller(true)
38ba991379Sopenharmony_ci	logrus.SetFormatter(&logrus.TextFormatter{
39ba991379Sopenharmony_ci		ForceColors:     true,
40ba991379Sopenharmony_ci		FullTimestamp:   true,
41ba991379Sopenharmony_ci		TimestampFormat: "2006-01-02 15:04:05",
42ba991379Sopenharmony_ci		CallerPrettyfier: func(f *runtime.Frame) (function string, file string) {
43ba991379Sopenharmony_ci			funcName := strings.Split(f.Function, ".")
44ba991379Sopenharmony_ci			fn := funcName[len(funcName)-1]
45ba991379Sopenharmony_ci			_, filename := filepath.Split(f.File)
46ba991379Sopenharmony_ci			return fmt.Sprintf("%s()", fn), fmt.Sprintf("%s:%d", filename, f.Line)
47ba991379Sopenharmony_ci		},
48ba991379Sopenharmony_ci	})
49ba991379Sopenharmony_ci}
50ba991379Sopenharmony_ci
51ba991379Sopenharmony_cifunc ResetLogOutput() {
52ba991379Sopenharmony_ci	logrus.Info("now log to os stdout...")
53ba991379Sopenharmony_ci	logrus.SetOutput(osStdout)
54ba991379Sopenharmony_ci	if LogFile != nil {
55ba991379Sopenharmony_ci		LogFile.Close()
56ba991379Sopenharmony_ci	}
57ba991379Sopenharmony_ci	if StdoutFile != nil {
58ba991379Sopenharmony_ci		StdoutFile.Close()
59ba991379Sopenharmony_ci	}
60ba991379Sopenharmony_ci	LogFile, StdoutFile, os.Stdout, os.Stderr = nil, nil, osStdout, osStderr
61ba991379Sopenharmony_ci}
62ba991379Sopenharmony_ci
63ba991379Sopenharmony_cifunc SetLogOutput(pkg string) {
64ba991379Sopenharmony_ci	file := filepath.Join("logs", pkg+".log")
65ba991379Sopenharmony_ci	var f *os.File
66ba991379Sopenharmony_ci	var err error
67ba991379Sopenharmony_ci	if _, err = os.Stat(file); err == nil {
68ba991379Sopenharmony_ci		f, err = os.OpenFile(file, os.O_RDWR|os.O_APPEND, 0666)
69ba991379Sopenharmony_ci	} else {
70ba991379Sopenharmony_ci		f, err = os.Create(file)
71ba991379Sopenharmony_ci	}
72ba991379Sopenharmony_ci	if err != nil {
73ba991379Sopenharmony_ci		logrus.Errorf("failed to open new log file %s: %v", file, err)
74ba991379Sopenharmony_ci		return
75ba991379Sopenharmony_ci	}
76ba991379Sopenharmony_ci	logrus.Infof("now log to %s", file)
77ba991379Sopenharmony_ci	logrus.SetOutput(f)
78ba991379Sopenharmony_ci	if LogFile != nil {
79ba991379Sopenharmony_ci		LogFile.Close()
80ba991379Sopenharmony_ci	}
81ba991379Sopenharmony_ci	LogFile = f
82ba991379Sopenharmony_ci	stdout := filepath.Join("logs", fmt.Sprintf("%s_stdout.log", pkg))
83ba991379Sopenharmony_ci	if _, err = os.Stat(stdout); err == nil {
84ba991379Sopenharmony_ci		f, err = os.OpenFile(stdout, os.O_RDWR|os.O_APPEND, 0666)
85ba991379Sopenharmony_ci	} else {
86ba991379Sopenharmony_ci		f, err = os.Create(stdout)
87ba991379Sopenharmony_ci	}
88ba991379Sopenharmony_ci	if err != nil {
89ba991379Sopenharmony_ci		logrus.Errorf("failed to open new stdout log file %s: %v", stdout, err)
90ba991379Sopenharmony_ci		return
91ba991379Sopenharmony_ci	}
92ba991379Sopenharmony_ci	if StdoutFile != nil {
93ba991379Sopenharmony_ci		StdoutFile.Close()
94ba991379Sopenharmony_ci	}
95ba991379Sopenharmony_ci	StdoutFile, os.Stdout, os.Stderr = f, f, f
96ba991379Sopenharmony_ci	logrus.Infof("re-directing stdout and stderr to %s...", stdout)
97ba991379Sopenharmony_ci}
98