Skip to content

Commit 55453ad

Browse files
committed
Filter and standard filter
1 parent d0e0e49 commit 55453ad

17 files changed

+296
-235
lines changed

config.go

Lines changed: 30 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88

99
"github.com/ccpaging/nxlog4go/cast"
1010
"github.com/ccpaging/nxlog4go/driver"
11-
"github.com/ccpaging/nxlog4go/patt"
1211
)
1312

1413
// NameValue stores every single option's name and value.
@@ -35,35 +34,39 @@ type LoggerConfig struct {
3534
Filters []*FilterConfig `xml:"filter" json:"filters"`
3635
}
3736

38-
func setLogger(l *Logger, level int, props []NameValue) (errs []error) {
39-
l.Set("level", level)
40-
for _, prop := range props {
37+
func setLogger(l *Logger, enb bool, fc *FilterConfig) (errs []error) {
38+
l.Set("level", Level(INFO).Int(fc.Level))
39+
for _, prop := range fc.Properties {
4140
v := strings.Trim(prop.Value, " \r\n")
4241
if err := l.Set(prop.Name, v); err != nil {
4342
errs = append(errs, fmt.Errorf("Warn: %s. %s: %s", err.Error(), prop.Name, v))
4443
}
4544
}
45+
l.Enable(enb)
4646
return
4747
}
4848

49-
func loadFilter(level int, typ string, dsn string, props []NameValue) (filter *Filter, errs []error) {
50-
app, err := driver.Open(typ, dsn)
49+
func loadFilter(fc *FilterConfig) (filter *driver.Filter, errs []error) {
50+
app, err := driver.Open(fc.Type, fc.Dsn)
5151
if app == nil {
5252
return nil, append(errs, err)
5353
}
5454

55-
for _, prop := range props {
55+
for _, prop := range fc.Properties {
5656
v := strings.Trim(prop.Value, " \r\n")
5757
if err := app.Set(prop.Name, v); err != nil {
58-
errs = append(errs, fmt.Errorf("Warn: Set [%s] as [%s=%s]. %s", typ, prop.Name, v, err.Error()))
58+
errs = append(errs, fmt.Errorf("Warn: Set [%s] as [%s=%s]. %s", fc.Type, prop.Name, v, err.Error()))
5959
}
6060
}
6161

62-
filter = &Filter{
63-
Enabler: driver.AtAbove(level),
64-
Layout: patt.NewLayout(""),
62+
filter = &driver.Filter{
63+
Name: fc.Tag,
64+
Enabler: driver.AtAbove(Level(INFO).Int(fc.Level)),
65+
Layout: nil,
6566
Apps: []driver.Appender{app},
6667
}
68+
69+
errs = append(errs, fmt.Errorf("Trace: Succeeded loading tag [%s], type [%s], dsn [%s]", fc.Tag, fc.Type, fc.Dsn))
6770
return
6871
}
6972

@@ -73,7 +76,7 @@ func (l *Logger) LoadConfiguration(lc *LoggerConfig) (errs []error) {
7376
return append(errs, fmt.Errorf("Warn: Logger configuration is NIL"))
7477
}
7578

76-
var filters []*Filter
79+
var filters []*driver.Filter
7780
for i, fc := range lc.Filters {
7881
if fc.Type == "" {
7982
errs = append(errs, fmt.Errorf("Warn: The type of Filter [%d] is not defined", i))
@@ -84,28 +87,28 @@ func (l *Logger) LoadConfiguration(lc *LoggerConfig) (errs []error) {
8487

8588
}
8689

87-
if enabled, err := cast.ToBool(fc.Enabled); !enabled {
90+
enabled, err := cast.ToBool(fc.Enabled)
91+
if err != nil {
8892
errs = append(errs, fmt.Errorf("Trace: Disable filter [%s]. Error: %v", fc.Tag, err))
89-
continue
93+
} else if !enabled {
94+
errs = append(errs, fmt.Errorf("Trace: Disable filter [%s]", fc.Tag))
9095
}
9196

92-
level := Level(INFO).Int(fc.Level)
93-
94-
switch fc.Type {
95-
case "loglog":
96-
multiErr := setLogger(GetLogLog(), level, fc.Properties)
97-
errs = append(errs, multiErr...)
98-
case "stdout":
99-
multiErr := setLogger(l, level, fc.Properties)
100-
errs = append(errs, multiErr...)
101-
default:
102-
filter, multiErr := loadFilter(level, fc.Type, fc.Dsn, fc.Properties)
103-
errs = append(errs, multiErr...)
97+
var e []error
98+
if fc.Type == "loglog" {
99+
e = setLogger(GetLogLog(), enabled, fc)
100+
} else if fc.Type == stdfName {
101+
e = setLogger(l, enabled, fc)
102+
} else if enabled {
103+
var filter *driver.Filter
104+
filter, e = loadFilter(fc)
104105
if filter != nil {
105-
errs = append(errs, fmt.Errorf("Trace: Succeeded loading tag [%s], type [%s], dsn [%s]", fc.Tag, fc.Type, fc.Dsn))
106106
filters = append(filters, filter)
107107
}
108+
} else {
109+
// disabled
108110
}
111+
errs = append(errs, e...)
109112
}
110113

111114
l.Attach(filters...)

config_test.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import (
1616
)
1717

1818
var xmlBuf = `<logging>
19-
<filter enabled="true">
19+
<filter enabled="false">
2020
<tag>stdout</tag>
2121
<type>stdout</type>
2222
<level>DEBUG</level>
@@ -27,7 +27,7 @@ var xmlBuf = `<logging>
2727
<tag>loglog</tag>
2828
<type>loglog</type>
2929
<level>DEBUG</level>
30-
<property name="format">[%D %T] [%L] (%S) %M</property>
30+
<property name="format">"[%D %T] [%L] [%P] (%S) \t%M"</property>
3131
</filter>
3232
<filter enabled="true">
3333
<tag>console</tag>
@@ -118,17 +118,17 @@ func TestXMLConfig(t *testing.T) {
118118

119119
// Make sure we got all loggers
120120
if filters == nil {
121-
t.Fatalf("XMLConfig: Expected 3 filters, found %d", len(filters))
121+
t.Fatalf("XMLConfig: Expected 4 filters, found %d", len(filters))
122122
}
123123

124-
if len(filters) != 3 {
125-
t.Fatalf("XMLConfig: Expected 3 filters, found %d", len(filters))
124+
if len(filters) != 4 {
125+
t.Fatalf("XMLConfig: Expected 4 filters, found %d", len(filters))
126126
}
127127

128128
// Make sure they're the right type
129-
for i, filter := range filters {
129+
for name, filter := range filters {
130130
if fmt.Sprintf("%T", filter.Dispatch) != "func(*driver.Recorder)" {
131-
t.Fatalf("XMLConfig: Expected [%d] filter Dispatch(*nxlog4go.Recorder), found %T", i, filter.Dispatch)
131+
t.Fatalf("XMLConfig: Expected [%s] filter Dispatch(*nxlog4go.Recorder), found %T", name, filter.Dispatch)
132132
}
133133
}
134134

filter.go renamed to driver/filter.go

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,28 @@
11
// Copyright (C) 2017, ccpaging <[email protected]>. All rights reserved.
22

3-
package nxlog4go
3+
package driver
44

55
import (
66
"bytes"
7-
8-
"github.com/ccpaging/nxlog4go/driver"
97
)
108

119
// Filter contains:
1210
// - Enabler, the Enabler interface for filter log Recorder
1311
// - Layout, the Layout interface for encoding log Recorder
1412
// - Apps, the slice of the Appender interface
1513
type Filter struct {
16-
driver.Enabler
17-
driver.Layout
18-
Apps []driver.Appender
19-
}
20-
21-
// NewFilter creates a new filter with an enabler, a layout
22-
// and appenders.
23-
func NewFilter(level int, lo driver.Layout, apps ...driver.Appender) *Filter {
24-
return &Filter{driver.AtAbove(level), lo, apps}
14+
Name string
15+
Enabler
16+
Layout
17+
Apps []Appender
2518
}
2619

2720
// Dispatch filters, encodes a log recorder to bytes, and writes it to all appenders.
2821
// - Enabler.Enabled, filter log Recorder.
2922
// - Layout.Encode, encode log Recorder to bytes.Buffer.
3023
// - Apps[i].Enabled, filter log recorder by appender.
3124
// - Apps[i].Write, append with log recorder encoded bytes.
32-
func (f *Filter) Dispatch(r *driver.Recorder) {
25+
func (f *Filter) Dispatch(r *Recorder) {
3326
if f.Enabler != nil && !f.Enabler.Enabled(r) {
3427
return
3528
}
@@ -53,8 +46,9 @@ func (f *Filter) Dispatch(r *driver.Recorder) {
5346

5447
// Close closes all log appenders in preparation for exiting the program.
5548
// Calling this is not really imperative, unless you want to
56-
// guarantee that all log messages are written. Close() removes
57-
// all appenders from the filter.
49+
// guarantee that all log messages are written.
50+
//
51+
// Notice: Close() removes all appenders from the filter.
5852
func (f *Filter) Close() {
5953
for _, a := range f.Apps {
6054
if a != nil {

examples/example.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"version": "",
33
"filters": [
44
{
5-
"enabled": "true",
5+
"enabled": "false",
66
"tag": "stdout",
77
"type": "stdout",
88
"dsn": "",
@@ -27,7 +27,7 @@
2727
"properties": [
2828
{
2929
"name": "format",
30-
"value": "[%D %T] [%L] (%S) %M"
30+
"value": "\"[%D %T] [%L] [%P] (%S) \\t%M\""
3131
}
3232
]
3333
},

examples/example.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<logging>
2-
<filter enabled="true">
2+
<filter enabled="false">
33
<tag>stdout</tag>
44
<type>stdout</type>
55
<level>DEBUG</level>
@@ -10,7 +10,7 @@
1010
<tag>loglog</tag>
1111
<type>loglog</type>
1212
<level>DEBUG</level>
13-
<property name="format">[%D %T] [%L] (%S) %M</property>
13+
<property name="format">"[%D %T] [%L] [%P] (%S) \t%M"</property>
1414
</filter>
1515
<filter enabled="true">
1616
<tag>console</tag>

examples/jsonconfig.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ var (
1616
fname = flag.String("conf", "example.json", "config file")
1717
)
1818

19-
var log = l4g.GetLogger().SetOptions("caller", false, "format", "[%T] [%L] (%S) %M\n")
19+
var log = l4g.GetLogger().SetOptions("caller", true, "format", "[%T] [%P] [%L] (%S) %M\n")
2020

2121
func main() {
2222
flag.Parse()

examples/xmlconfig.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,10 @@ func main() {
5858
log.Trace("Oh no! %d + %d = %d!", 2, 2, 2+2)
5959
log.Info("About that time, eh chaps?")
6060

61-
// Unload filters
62-
log.Detach(filters...)
6361
// Do not forget close all filters
6462
for _, f := range filters {
63+
// Unload filters
64+
log.Detach(f)
6565
if f != nil {
6666
f.Close()
6767
}

file/example/jsonOntime.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ func main() {
3232
return
3333
}
3434

35-
logger.Attach(log.NewFilter(log.TRACE, nil, a))
35+
logger.AddFilter("json", log.TRACE, a)
3636

3737
for i := 0; i < 25; i++ {
3838
for j := 0; j < 5; j++ {
@@ -61,6 +61,8 @@ func main() {
6161
fmt.Println(err)
6262
}
6363

64+
fmt.Println("rotate = 0. Only one log file.")
65+
6466
// contains a list of all files in the current directory
6567
files, _ := filepath.Glob(removeFiles)
6668
fmt.Printf("%d files match %s\n", len(files), removeFiles)

file/example/xmlOndemand.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ func main() {
3232
return
3333
}
3434

35-
logger.Attach(log.NewFilter(log.FINE, nil, a))
35+
logger.AddFilter("xml", log.FINE, a)
3636

3737
for i := 0; i < 125; i++ {
3838
log.Info("%d: The time is now: %s", i+1, time.Now().Format("15:04:05 MST 2006/01/02"))
@@ -46,6 +46,8 @@ func main() {
4646
fmt.Println(err)
4747
}
4848

49+
fmt.Println("rotate = 1. There are two log files.")
50+
4951
// contains a list of all files in the current directory
5052
files, _ := filepath.Glob(removeFiles)
5153
fmt.Printf("%d files match %s\n", len(files), removeFiles)

file/filelog_test.go

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,15 @@ func newLogRecord(level int, src string, msg string) *driver.Recorder {
3232
}
3333
}
3434

35+
func newFilter(level int, a driver.Appender) *driver.Filter {
36+
return &driver.Filter{
37+
Name: "file",
38+
Enabler: driver.AtAbove(level),
39+
Layout: nil,
40+
Apps: []driver.Appender{a},
41+
}
42+
}
43+
3544
func removeFile(t *testing.T, filename string) {
3645
err := os.Remove(filename)
3746
if err != nil && t != nil {
@@ -82,7 +91,7 @@ func TestFileLog(t *testing.T) {
8291

8392
// Create a default logger that is logging messages of FINE or higher
8493
a, _ := NewFileAppender(testLogFile, "rotate", 0)
85-
f := l4g.NewFilter(l4g.FINE, nil, a)
94+
f := newFilter(l4g.FINE, a)
8695
log.Attach(f)
8796
writeSomethingToLogFile(log)
8897
log.Detach(f)
@@ -112,7 +121,7 @@ func TestFileLogRotate(t *testing.T) {
112121
"cycle", 5,
113122
"maxsize", "5k")
114123

115-
log.Attach(l4g.NewFilter(l4g.FINE, nil, a))
124+
log.Attach(newFilter(l4g.FINE, a))
116125
// Log some experimental messages
117126
for j := 0; j < 15; j++ {
118127
for i := 0; i < 200/(j+1); i++ {
@@ -140,7 +149,7 @@ func BenchmarkCacheFileLog(b *testing.B) {
140149
b.StopTimer()
141150
a, _ := NewFileAppender(benchLogFile,
142151
"level", l4g.INFO, "rotate", 0)
143-
sl.Attach(l4g.NewFilter(l4g.INFO, nil, a))
152+
sl.Attach(newFilter(l4g.INFO, a))
144153
b.StartTimer()
145154
for i := 0; i < b.N; i++ {
146155
sl.Warn("This is a log message")
@@ -155,7 +164,7 @@ func BenchmarkCacheFileNotLogged(b *testing.B) {
155164
b.StopTimer()
156165
a, _ := NewFileAppender(benchLogFile,
157166
"level", l4g.INFO, "rotate", 0)
158-
sl.Attach(l4g.NewFilter(l4g.INFO, nil, a))
167+
sl.Attach(newFilter(l4g.INFO, a))
159168
b.StartTimer()
160169
for i := 0; i < b.N; i++ {
161170
sl.Debug("This is a log message")
@@ -170,7 +179,7 @@ func BenchmarkCacheFileUtilLog(b *testing.B) {
170179
b.StopTimer()
171180
a, _ := NewFileAppender(benchLogFile,
172181
"level", l4g.INFO, "rotate", 0)
173-
sl.Attach(l4g.NewFilter(l4g.INFO, nil, a))
182+
sl.Attach(newFilter(l4g.INFO, a))
174183
b.StartTimer()
175184
for i := 0; i < b.N; i++ {
176185
sl.Info("%s is a log message", "This")
@@ -185,7 +194,7 @@ func BenchmarkCacheFileUtilNotLog(b *testing.B) {
185194
b.StopTimer()
186195
a, _ := NewFileAppender(benchLogFile,
187196
"level", l4g.INFO, "rotate", 0)
188-
sl.Attach(l4g.NewFilter(l4g.WARN, nil, a))
197+
sl.Attach(newFilter(l4g.WARN, a))
189198
b.StartTimer()
190199
for i := 0; i < b.N; i++ {
191200
sl.Debug("%s is a log message", "This")

0 commit comments

Comments
 (0)