Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 11737ff

Browse files
author
ns2020
committed
add htfile lib for cutting by hour/day or month.
1 parent 6e4f9d4 commit 11737ff

File tree

5 files changed

+237
-4
lines changed

5 files changed

+237
-4
lines changed

‎README.md

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,18 +22,33 @@ go get github.com/hottaro/golang_tiny_lib/htevent
2222

2323
## htlog
2424

25+
tiny logging models
26+
2527
1. get pkg
2628

2729
```shell
2830
go get github.com/hottaro/golang_tiny_lib/htlog
2931
```
3032

3133
2. See htlog/example.go
34+
35+
36+
## htfile
3237

33-
38+
tiny file handler, auto cut by hours, days or month.
3439

3540
## htdb
3641

42+
middleware for PostgreSQL, MySQL, SQLite and MongoDB, handling...
43+
44+
## htcache
45+
46+
middleware for cache, handling...
47+
48+
## htlb
49+
50+
Load Balance, handling...
51+
3752
## LICENSE
3853
[MIT](https://opensource.org/licenses/MIT "MIT")
3954

‎example.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,28 @@ package main
33
import (
44
"github.com/hottaro/golang_tiny_lib/htevent"
55
"github.com/hottaro/golang_tiny_lib/htlog"
6+
"github.com/hottaro/golang_tiny_lib/htfile"
67
"fmt"
78
// "./htevent"
89
// "./htlog"
10+
// "./htfile"
911
)
1012

1113
func main() {
1214

13-
14-
fmt.Println(">>>>>>>>>>> event example ...")
1515
// event test
16+
fmt.Println(">>>>>>>>>>> event example ...")
1617
htevent.HTEvent_test()
1718
fmt.Println(">>>>>>>>>>> event example ... end")
1819

19-
fmt.Println(">>>>>>>>>>> log example ...")
2020
// log test
21+
fmt.Println(">>>>>>>>>>> log example ...")
2122
htlog.HTLog_test()
2223
fmt.Println(">>>>>>>>>>> example ... end")
24+
25+
// file test
26+
fmt.Println(">>>>>>>>>>> log example ...")
27+
htfile.HTFile_test()
28+
fmt.Println(">>>>>>>>>>> example ... end")
2329
}
2430

‎htfile/README.md

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# htfile
2+
3+
## Example
4+
5+
```go
6+
7+
func HTFile_test() {
8+
file := Open("./test_cut.log")
9+
defer file.Close()
10+
11+
file.SetFormat(CutTypeDay)
12+
_, err := file.Writef("first format %v string\n", 0)
13+
if err != nil {
14+
fmt.Println("error ", err)
15+
}
16+
17+
file.ResetFile()
18+
19+
_, err = file.Writeln("file reset string")
20+
if err != nil {
21+
fmt.Println("error ", err)
22+
}
23+
24+
nowFunc = func() time.Time {
25+
return time.Now().Add(time.Hour * 25)
26+
}
27+
28+
_, err = file.Writeln("new file now")
29+
if err != nil {
30+
fmt.Println("error ", err)
31+
}
32+
}
33+
```
34+

‎htfile/example.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package htfile
2+
3+
import (
4+
"time"
5+
"fmt"
6+
)
7+
8+
func HTFile_test() {
9+
file := Open("./test_cut.log")
10+
defer file.Close()
11+
12+
file.SetFormat(CutTypeDay)
13+
_, err := file.Writef("first format %v string\n", 0)
14+
if err != nil {
15+
fmt.Println("error ", err)
16+
}
17+
18+
file.ResetFile()
19+
20+
_, err = file.Writeln("file reset string")
21+
if err != nil {
22+
fmt.Println("error ", err)
23+
}
24+
25+
nowFunc = func() time.Time {
26+
return time.Now().Add(time.Hour * 25)
27+
}
28+
29+
_, err = file.Writeln("new file now")
30+
if err != nil {
31+
fmt.Println("error ", err)
32+
}
33+
}
34+

‎htfile/htfile.go

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
package htfile
2+
3+
import (
4+
"os"
5+
"sync"
6+
"time"
7+
"fmt"
8+
"strings"
9+
)
10+
11+
type TCut string
12+
13+
const (
14+
CutTypeHour TCut = "06010215"
15+
CutTypeDay TCut = "060102"
16+
CutTypeMonth TCut = "0601"
17+
18+
LogFlag = os.O_WRONLY | os.O_CREATE | os.O_APPEND
19+
20+
LogMode = 0666
21+
)
22+
23+
type HTFile struct {
24+
file *os.File
25+
cutType string
26+
orgFilename string
27+
28+
flag int
29+
mode os.FileMode
30+
31+
filenameMu sync.Mutex
32+
destFilename string
33+
destKey string
34+
}
35+
36+
func Open(filename string) *HTFile {
37+
return &HTFile{
38+
flag: LogFlag,
39+
mode: LogMode,
40+
41+
orgFilename: filename,
42+
cutType: string(CutTypeHour), // 默认按小时
43+
}
44+
}
45+
46+
var nowFunc = time.Now
47+
48+
func (f *HTFile) SetFormat(cutType TCut) {
49+
f.cutType = string(cutType)
50+
}
51+
52+
func (f *HTFile) SetFlag(flag int) {
53+
f.flag = flag
54+
}
55+
56+
func (f *HTFile) SetMode(mode os.FileMode) {
57+
f.mode = mode
58+
}
59+
60+
func (f *HTFile) ResetFile() error {
61+
now := nowFunc()
62+
f.filenameMu.Lock()
63+
defer f.filenameMu.Unlock()
64+
65+
key := now.Format(f.cutType)
66+
name := f.orgFilename + "." + key
67+
68+
file, err := os.OpenFile(name, f.flag, f.mode)
69+
if err != nil {
70+
f.filenameMu.Unlock()
71+
return err
72+
}
73+
74+
if f.file != nil {
75+
f.file.Close()
76+
}
77+
78+
f.file, f.destFilename, f.destKey = file, name, key
79+
return nil
80+
}
81+
82+
func (f *HTFile) Writeb(b []byte) (n int, err error) {
83+
now := nowFunc()
84+
f.filenameMu.Lock()
85+
key := now.Format(f.cutType)
86+
if key != f.destKey {
87+
if f.file != nil {
88+
f.file.Close()
89+
}
90+
91+
name := f.orgFilename + "." + key
92+
93+
f.file, err = os.OpenFile(name, f.flag, f.mode)
94+
if err != nil {
95+
f.filenameMu.Unlock()
96+
return n, err
97+
}
98+
99+
f.destFilename, f.destKey = name, key
100+
}
101+
f.filenameMu.Unlock()
102+
103+
return f.file.Write(b)
104+
}
105+
106+
func (f *HTFile) Write(s string) (n int, err error) {
107+
return f.Writeb([]byte(s))
108+
}
109+
110+
func (f *HTFile) Writeln(s string) (n int, err error) {
111+
return f.Write(s + "\n")
112+
}
113+
114+
func (f *HTFile) Writef(format interface{}, v ...interface{}) (n int, err error) {
115+
return f.Write(formatLog(format, v...))
116+
}
117+
118+
func (f *HTFile) Close() error {
119+
return f.file.Close()
120+
}
121+
122+
func formatLog(f interface{}, v ...interface{}) string {
123+
var msg string
124+
switch f.(type) {
125+
case string:
126+
msg = f.(string)
127+
if len(v) == 0 {
128+
return msg
129+
}
130+
if strings.Contains(msg, "%") && !strings.Contains(msg, "%%") {
131+
//format string
132+
} else {
133+
//do not contain format char
134+
msg += strings.Repeat(" %v", len(v))
135+
}
136+
default:
137+
msg = fmt.Sprint(f)
138+
if len(v) == 0 {
139+
return msg
140+
}
141+
msg += strings.Repeat(" %v", len(v))
142+
}
143+
return fmt.Sprintf(msg, v...)
144+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /