-
Notifications
You must be signed in to change notification settings - Fork 0
/
log.go
executable file
·85 lines (70 loc) · 2.39 KB
/
log.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package log
import (
"fmt"
"os"
"strings"
"time"
)
// TODO: Включена или нет отладка берем из файла настроек
//
type Log struct {
ServiceName string
DebugMode bool
StartTime time.Time
}
// Error - запись в [service]_err.log - критичные для выполнения ошибки
func (l *Log) Error(msg string) {
fmt.Println("error", msg)
l.write("error", msg)
}
// Info - запись в [service]_info.log - протокол работы (+ некритичные worning)
func (l *Log) Info(msg string) {
fmt.Println(msg)
l.write("info", msg)
}
// Debug - запись в [service]_debug.log - все что нужно на этапе отладки
func (l *Log) Debug(msg string) {
if l.DebugMode {
fmt.Println(msg)
l.write("debug", msg)
}
}
//Start - initialize ServiceName and start timer
func (l *Log) Start(serviceName string) {
l.ServiceName = serviceName
l.write("info", "Zzz")
l.StartTime = time.Now()
}
// End add log run duration
func (l *Log) End() {
duration := time.Since(l.StartTime)
l.Info(duration.String())
}
//to do: сделать для многопоточной работы через каналы
// Error, Info, Debug - пишут в свои каналы
// обрботчики каналов их слушают и в отдельных горутинах пишут в файлы
// go Write - слушает канал и записывает в файлы
func (l *Log) write(logType string, msg string) {
fileName := l.ServiceName + "_" + logType + ".log"
//fileName := "C:\\" + l.ServiceName + "_" + logType + ".log"
file, err := os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0600)
if err != nil {
fmt.Println(err)
}
defer file.Close()
curTime := time.Now()
const formatDate = "2006-01-02 15:04:05"
msg = curTime.Format(formatDate) + ";" + sToCSV(msg) + ";" + "\n"
if _, err = file.WriteString(msg); err != nil {
fmt.Println(err)
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// сделать CSV-валидным
func sToCSV(st string) string {
st = strings.Replace(st, "\"", "\"\"", -1)
if strings.ContainsAny(st, "\"") || strings.ContainsAny(st, ";") || strings.ContainsAny(st, "\n") {
st = "\"" + st + "\""
}
return st
}