Skip to content

Commit befcaf4

Browse files
committed
refactor(serverLog): split file manager and writer manager
1 parent 7eff6df commit befcaf4

File tree

8 files changed

+211
-83
lines changed

8 files changed

+211
-83
lines changed

src/app/main.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ import (
1414
)
1515

1616
type App struct {
17-
vhostSvc *goVirtualHost.Service
18-
logFileMan *serverLog.FileMan
17+
vhostSvc *goVirtualHost.Service
18+
logMan *serverLog.Man
1919
}
2020

2121
func (app *App) Open() []error {
@@ -31,17 +31,17 @@ func (app *App) Open() []error {
3131

3232
func (app *App) Close() {
3333
app.vhostSvc.Close()
34-
app.logFileMan.Close()
34+
app.logMan.CloseFiles()
3535
}
3636

3737
func (app *App) Shutdown() {
3838
ctx, _ := context.WithTimeout(context.Background(), time.Millisecond*100)
3939
app.vhostSvc.Shutdown(ctx)
40-
app.logFileMan.Close()
40+
app.logMan.CloseFiles()
4141
}
4242

4343
func (app *App) ReOpenLog() []error {
44-
return app.logFileMan.Reopen()
44+
return app.logMan.ReOpenFiles()
4545
}
4646

4747
func (app *App) ReLoadCertificates() []error {
@@ -61,12 +61,12 @@ func NewApp(params param.Params, settings *setting.Setting) (*App, []error) {
6161
}
6262

6363
vhSvc := goVirtualHost.NewService()
64-
logFileMan := serverLog.NewFileMan()
64+
logMan := serverLog.NewMan()
6565
themePool := make(map[string]theme.Theme)
6666

6767
for _, p := range params {
6868
// logger
69-
logger, errs := logFileMan.NewLogger(p.AccessLog, p.ErrorLog)
69+
logger, errs := logMan.NewLogger(p.AccessLog, p.ErrorLog)
7070
if len(errs) > 0 {
7171
return nil, errs
7272
}
@@ -125,7 +125,7 @@ func NewApp(params param.Params, settings *setting.Setting) (*App, []error) {
125125
}
126126

127127
return &App{
128-
vhostSvc: vhSvc,
129-
logFileMan: logFileMan,
128+
vhostSvc: vhSvc,
129+
logMan: logMan,
130130
}, nil
131131
}

src/serverLog/fileDest.go

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -77,16 +77,10 @@ func (dest *fileDest) serve() {
7777
os.Stderr.WriteString(e.Error() + "\n")
7878
}
7979
}
80-
if dest.info != nil { // not Stdout or Stderr
81-
dest.file.Close()
82-
}
80+
dest.file.Close()
8381
}
8482

8583
func (dest *fileDest) reopen() error {
86-
if dest.info == nil { // Stdout or Stderr
87-
return nil
88-
}
89-
9084
matched := false
9185
file, info, err := getFileInfoIfNotMatch(dest.fsPath, func(info os.FileInfo) bool {
9286
matched = os.SameFile(info, dest.info)

src/serverLog/fileMan.go

Lines changed: 40 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
// fileMan maintains opened files shared by multiple loggerChan
2-
31
package serverLog
42

53
import (
@@ -15,41 +13,52 @@ type FileMan struct {
1513
dests []*fileDest
1614
}
1715

18-
func (fMan *FileMan) getWritingCh(fsPath string, file *os.File) (chan<- []byte, error) {
19-
if len(fsPath) == 0 && file == nil {
16+
func (fMan *FileMan) ReOpen() []error {
17+
var errs []error
18+
19+
for _, dest := range fMan.dests {
20+
err := dest.reopen()
21+
if err != nil {
22+
errs = append(errs, err)
23+
}
24+
}
25+
26+
return errs
27+
}
28+
29+
func (fMan *FileMan) Close() {
30+
for _, dest := range fMan.dests {
31+
dest.close()
32+
}
33+
fMan.wg.Wait()
34+
}
35+
36+
func (fMan *FileMan) getWritingCh(fsPath string) (chan<- []byte, error) {
37+
if len(fsPath) == 0 {
2038
return nil, errors.New("log file not provided")
2139
}
2240

41+
var file *os.File
2342
var info os.FileInfo
2443
var err error
2544

26-
if file == nil { // regular file
27-
var ch chan<- []byte
28-
file, info, err = getFileInfoIfNotMatch(fsPath, func(info os.FileInfo) bool {
29-
for _, dest := range fMan.dests {
30-
if os.SameFile(info, dest.info) {
31-
ch = dest.ch
32-
return true
33-
}
34-
}
35-
return false
36-
})
37-
38-
if err != nil {
39-
return nil, err
40-
}
41-
42-
if ch != nil {
43-
return ch, nil
44-
}
45-
} else { // Stdout or Stderr
45+
var ch chan<- []byte
46+
file, info, err = getFileInfoIfNotMatch(fsPath, func(info os.FileInfo) bool {
4647
for _, dest := range fMan.dests {
47-
if file == dest.file {
48-
return dest.ch, nil
48+
if os.SameFile(info, dest.info) {
49+
ch = dest.ch
50+
return true
4951
}
5052
}
53+
return false
54+
})
55+
56+
if err != nil {
57+
return nil, err
58+
}
5159

52-
fsPath = file.Name()
60+
if ch != nil {
61+
return ch, nil
5362
}
5463

5564
dest := newFileDest(fsPath, file, info)
@@ -64,37 +73,12 @@ func (fMan *FileMan) getWritingCh(fsPath string, file *os.File) (chan<- []byte,
6473
return dest.ch, nil
6574
}
6675

67-
func (fMan *FileMan) Reopen() []error {
68-
var errs []error
69-
70-
for _, dest := range fMan.dests {
71-
err := dest.reopen()
72-
if err != nil {
73-
errs = append(errs, err)
74-
}
75-
}
76-
77-
return errs
78-
}
79-
80-
func (fMan *FileMan) Close() {
81-
for _, dest := range fMan.dests {
82-
dest.close()
83-
}
84-
fMan.wg.Wait()
85-
}
86-
87-
func (fMan *FileMan) newLogChan(fsPath string, dashFile *os.File) (loggerChan, error) {
76+
func (fMan *FileMan) newLogChan(fsPath string) (loggerChan, error) {
8877
var ch chan<- []byte
8978
var err error
9079

9180
if len(fsPath) > 0 {
92-
if fsPath == "-" {
93-
ch, err = fMan.getWritingCh("", dashFile)
94-
} else {
95-
ch, err = fMan.getWritingCh(fsPath, nil)
96-
}
97-
81+
ch, err = fMan.getWritingCh(fsPath)
9882
if err != nil {
9983
return nil, err
10084
}
@@ -106,20 +90,16 @@ func (fMan *FileMan) newLogChan(fsPath string, dashFile *os.File) (loggerChan, e
10690
func (fMan *FileMan) NewLogger(accLogFilename, errLogFilename string) (*Logger, []error) {
10791
var errs []error
10892

109-
accChan, err := fMan.newLogChan(accLogFilename, os.Stdout)
93+
accChan, err := fMan.newLogChan(accLogFilename)
11094
if err != nil {
11195
errs = append(errs, err)
11296
}
11397

114-
errChan, err := fMan.newLogChan(errLogFilename, os.Stderr)
98+
errChan, err := fMan.newLogChan(errLogFilename)
11599
if err != nil {
116100
errs = append(errs, err)
117101
}
118102

119-
if len(errs) > 0 {
120-
return nil, errs
121-
}
122-
123103
logger := &Logger{
124104
acc: accChan,
125105
err: errChan,

src/serverLog/logger.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
// Logger maintains access log and error log objects for each virtual host.
2-
// It also determines what a "-" file means, Stdout or Stderr, depends on the loggerChan's role.
3-
41
package serverLog
52

63
type Logger struct {

src/serverLog/loggerChan.go

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,3 @@
1-
// loggerChan controls if log action should really be performed by `canLog()`
2-
// It also provides utility functions to accept other data format rather than []byte,
3-
// e.g. `logString()` accepts string as log data.
4-
51
package serverLog
62

73
type loggerChan chan<- []byte

src/serverLog/man.go

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package serverLog
2+
3+
import "os"
4+
5+
const stdIO string = "-"
6+
7+
type Man struct {
8+
fMan *FileMan
9+
wMan *WriterMan
10+
}
11+
12+
func (man *Man) ReOpenFiles() []error {
13+
return man.fMan.ReOpen()
14+
}
15+
16+
func (man *Man) CloseFiles() {
17+
man.fMan.Close()
18+
}
19+
20+
func (man *Man) NewLogger(accessLog, errorLog string) (*Logger, []error) {
21+
var accChan, errChan loggerChan
22+
var err error
23+
var errs []error
24+
25+
if accessLog != stdIO {
26+
accChan, err = man.fMan.newLogChan(accessLog)
27+
} else {
28+
accChan, err = man.wMan.newLogChan(os.Stdout)
29+
}
30+
if err != nil {
31+
errs = append(errs, err)
32+
}
33+
34+
if errorLog != stdIO {
35+
errChan, err = man.fMan.newLogChan(errorLog)
36+
} else {
37+
errChan, err = man.wMan.newLogChan(os.Stderr)
38+
}
39+
if err != nil {
40+
errs = append(errs, err)
41+
}
42+
43+
logger := &Logger{
44+
acc: accChan,
45+
err: errChan,
46+
}
47+
return logger, nil
48+
}
49+
50+
func NewMan() *Man {
51+
return &Man{
52+
fMan: NewFileMan(),
53+
wMan: NewWriterMan(),
54+
}
55+
}

src/serverLog/writerDest.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package serverLog
2+
3+
import (
4+
"io"
5+
"os"
6+
)
7+
8+
type writerDest struct {
9+
w io.Writer
10+
ch chan []byte
11+
}
12+
13+
func newWriterDest(w io.Writer) *writerDest {
14+
ch := make(chan []byte, chanBuffer)
15+
16+
dest := &writerDest{
17+
w: w,
18+
ch: ch,
19+
}
20+
21+
return dest
22+
}
23+
24+
func (dest *writerDest) serve() {
25+
for payload := range dest.ch {
26+
payload = append(payload, logEnding)
27+
_, e := dest.w.Write(payload)
28+
if e != nil {
29+
os.Stderr.WriteString(e.Error() + "\n")
30+
}
31+
}
32+
}
33+
34+
func (dest *writerDest) close() {
35+
close(dest.ch)
36+
}

0 commit comments

Comments
 (0)