Skip to content

Commit ceb7a2f

Browse files
authored
Merge pull request #4 for v0.3 Release
2 parents 212f372 + 27c8bd2 commit ceb7a2f

17 files changed

+1302
-1023
lines changed

.travis.yml

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,22 @@ language: go
33
sudo: false
44

55
branches:
6-
only:
7-
# - master
8-
# - integration
6+
except:
7+
# skip tags build, we are building branch and master that is enough for
8+
# consistenty check and release. Let's use Travis CI resources optimally
9+
# for aah framework.
10+
- /^v[0-9]\.[0-9]/
911

1012
go:
11-
- 1.6
12-
- 1.7
13+
- 1.7.x
1314
- 1.8
15+
- 1.8.x
1416
- tip
1517

16-
before_install:
17-
- bash <(curl -s https://aahframework.org/env.txt) "log" "v0"
18-
19-
install:
20-
- cd $GOPATH/src/aahframework.org/log.v0
21-
- go get -v -t ./...
18+
go_import_path: aahframework.org/log.v0
2219

2320
script:
24-
- bash go.test.sh
21+
- bash <(curl -s https://aahframework.org/go-test)
2522

2623
after_success:
2724
- bash <(curl -s https://codecov.io/bash)

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
# log - aah framework
22
[![Build Status](https://travis-ci.org/go-aah/log.svg?branch=master)](https://travis-ci.org/go-aah/log) [![codecov](https://codecov.io/gh/go-aah/log/branch/master/graph/badge.svg)](https://codecov.io/gh/go-aah/log/branch/master) [![Go Report Card](https://goreportcard.com/badge/aahframework.org/log.v0)](https://goreportcard.com/report/aahframework.org/log.v0)
3-
[![Version](https://img.shields.io/badge/version-0.2-blue.svg)](https://github.com/go-aah/log/releases/latest) [![GoDoc](https://godoc.org/aahframework.org/log.v0?status.svg)](https://godoc.org/aahframework.org/log.v0)
3+
[![Version](https://img.shields.io/badge/version-0.3-blue.svg)](https://github.com/go-aah/log/releases/latest) [![GoDoc](https://godoc.org/aahframework.org/log.v0?status.svg)](https://godoc.org/aahframework.org/log.v0)
44
[![License](https://img.shields.io/github/license/go-aah/log.svg)](LICENSE)
55

6-
***v0.2 [released](https://github.com/go-aah/log/releases/latest) and tagged on Mar 04, 2017***
6+
***v0.3 [released](https://github.com/go-aah/log/releases/latest) and tagged on May 16, 2017***
77

88
Simple, flexible & powerful `Go` logger inspired by standard logger & Google glog. aah framework utilizes `log` library across.
99

console_receiver.go

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
// Copyright (c) Jeevanandam M (https://github.com/jeevatkm)
2+
// go-aah/log source code and usage is governed by a MIT style
3+
// license that can be found in the LICENSE file.
4+
5+
package log
6+
7+
import (
8+
"fmt"
9+
"io"
10+
"os"
11+
"runtime"
12+
"sync"
13+
14+
"aahframework.org/config.v0"
15+
)
16+
17+
var (
18+
// ANSI color codes
19+
resetColor = []byte("\033[0m")
20+
levelToColor = [][]byte{
21+
levelFatal: []byte("\033[0;31m"), // red
22+
levelPanic: []byte("\033[0;31m"), // red
23+
LevelError: []byte("\033[0;31m"), // red
24+
LevelWarn: []byte("\033[0;33m"), // yellow
25+
LevelInfo: []byte("\033[0;37m"), // white
26+
LevelDebug: []byte("\033[0;34m"), // blue
27+
LevelTrace: []byte("\033[0;35m"), // magenta (purple)
28+
}
29+
30+
_ Receiver = &ConsoleReceiver{}
31+
)
32+
33+
// ConsoleReceiver writes the log entry into os.Stderr.
34+
// For non-windows it writes with color.
35+
type ConsoleReceiver struct {
36+
rw *sync.RWMutex
37+
out io.Writer
38+
formatter string
39+
flags *[]FlagPart
40+
isCallerInfo bool
41+
isColor bool
42+
}
43+
44+
//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
45+
// ConsoleReceiver methods
46+
//___________________________________
47+
48+
// Init method initializes the console logger.
49+
func (c *ConsoleReceiver) Init(cfg *config.Config) error {
50+
c.out = os.Stderr
51+
c.isColor = runtime.GOOS != "windows"
52+
53+
c.formatter = cfg.StringDefault("log.format", "text")
54+
if !(c.formatter == textFmt || c.formatter == jsonFmt) {
55+
return fmt.Errorf("log: unsupported format '%s'", c.formatter)
56+
}
57+
58+
return nil
59+
}
60+
61+
// SetPattern method initializes the logger format pattern.
62+
func (c *ConsoleReceiver) SetPattern(pattern string) error {
63+
c.rw.Lock()
64+
defer c.rw.Unlock()
65+
flags, err := parseFlag(pattern)
66+
if err != nil {
67+
return err
68+
}
69+
c.flags = flags
70+
if c.formatter == textFmt {
71+
c.isCallerInfo = isCallerInfo(c.flags)
72+
}
73+
return nil
74+
}
75+
76+
// IsCallerInfo method returns true if log receiver is configured with caller info
77+
// otherwise false.
78+
func (c *ConsoleReceiver) IsCallerInfo() bool {
79+
return c.isCallerInfo
80+
}
81+
82+
// Log method writes the log entry into os.Stderr.
83+
func (c *ConsoleReceiver) Log(entry *Entry) {
84+
c.rw.RLock()
85+
defer c.rw.RUnlock()
86+
if c.isColor {
87+
_, _ = c.out.Write(levelToColor[entry.Level])
88+
}
89+
90+
msg := applyFormatter(c.formatter, c.flags, entry)
91+
if len(msg) == 0 || msg[len(msg)-1] != '\n' {
92+
msg = append(msg, '\n')
93+
}
94+
_, _ = c.out.Write(msg)
95+
96+
if c.isColor {
97+
_, _ = c.out.Write(resetColor)
98+
}
99+
}

console_receiver_test.go

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
// Copyright (c) Jeevanandam M (https://github.com/jeevatkm)
2+
// go-aah/log source code and usage is governed by a MIT style
3+
// license that can be found in the LICENSE file.
4+
5+
package log
6+
7+
import (
8+
"testing"
9+
"time"
10+
11+
"aahframework.org/config.v0"
12+
"aahframework.org/test.v0/assert"
13+
)
14+
15+
func TestConsoleLoggerTextJSON(t *testing.T) {
16+
// Text 1
17+
textConfigStr1 := `
18+
log {
19+
receiver = "console"
20+
level = "debug"
21+
pattern = "%utctime:2006-01-02 15:04:05.000 %level:-5 %longfile %line %custom:- %message"
22+
}
23+
`
24+
testConsoleLogger(t, textConfigStr1)
25+
26+
// Text 2
27+
textConfigStr2 := `
28+
log {
29+
receiver = "console"
30+
level = "debug"
31+
pattern = "%time:2006-01-02 15:04:05.000 %level:-5 %shortfile %line %custom:- %message"
32+
}
33+
`
34+
testConsoleLogger(t, textConfigStr2)
35+
36+
// JSON
37+
jsonConfigStr := `
38+
log {
39+
receiver = "console"
40+
level = "debug"
41+
format = "json"
42+
}
43+
`
44+
testConsoleLogger(t, jsonConfigStr)
45+
}
46+
47+
func TestConsoleLoggerUnsupportedFormat(t *testing.T) {
48+
configStr := `
49+
log {
50+
# default config plus
51+
pattern = "%utctime:2006-01-02 15:04:05.000 %level:-5 %longfile %line %custom:- %message"
52+
format = "xml"
53+
}
54+
`
55+
cfg, _ := config.ParseString(configStr)
56+
logger, err := New(cfg)
57+
assert.Nil(t, logger)
58+
assert.Equal(t, "log: unsupported format 'xml'", err.Error())
59+
}
60+
61+
func TestConsoleLoggerUnknownFormatFlag(t *testing.T) {
62+
configStr := `
63+
log {
64+
# default config plus
65+
pattern = "%time:2006-01-02 15:04:05.000 %level:-5 %myfile %line %custom:- %message"
66+
}
67+
`
68+
cfg, _ := config.ParseString(configStr)
69+
logger, err := New(cfg)
70+
assert.Nil(t, logger)
71+
assert.Equal(t, "unrecognized log format flag: myfile", err.Error())
72+
}
73+
74+
func TestConsoleLoggerUnknownLevel(t *testing.T) {
75+
configStr := `
76+
log {
77+
# default config plus
78+
level = "MYLEVEL"
79+
pattern = "%time:2006-01-02 15:04:05.000 %level:-5 %message"
80+
}
81+
`
82+
cfg, _ := config.ParseString(configStr)
83+
logger, err := New(cfg)
84+
assert.Nil(t, logger)
85+
assert.Equal(t, "log: unknown log level 'MYLEVEL'", err.Error())
86+
}
87+
88+
func TestConsoleLoggerDefaults(t *testing.T) {
89+
configStr := `
90+
log {
91+
# default config
92+
}
93+
`
94+
cfg, _ := config.ParseString(configStr)
95+
logger, err := New(cfg)
96+
assert.NotNil(t, logger)
97+
assert.Nil(t, err)
98+
99+
// receiver nil scenario
100+
logger.receiver = nil
101+
err = logger.SetPattern("%time:2006-01-02 15:04:05.000 %level:-5 %message")
102+
assert.Equal(t, "log: receiver is nil", err.Error())
103+
}
104+
105+
func testConsoleLogger(t *testing.T, cfgStr string) {
106+
cfg, _ := config.ParseString(cfgStr)
107+
logger, err := New(cfg)
108+
assert.FailNowOnError(t, err, "unexpected error")
109+
110+
logger.Trace("I shoudn't see this msg, because standard logger level is DEBUG")
111+
logger.Tracef("I shoudn't see this msg, because standard logger level is DEBUG: %v", 4)
112+
113+
logger.Debug("I would like to see this message, debug is useful for dev")
114+
logger.Debugf("I would like to see this message, debug is useful for %v", "dev")
115+
116+
logger.Info("Yes, I would love to see")
117+
logger.Infof("Yes, I would love to %v", "see")
118+
119+
logger.Warn("Yes, yes it's an warning")
120+
logger.Warnf("Yes, yes it's an %v", "warning")
121+
122+
logger.Error("Yes, yes, yes - finally an error")
123+
logger.Errorf("Yes, yes, yes - %v", "finally an error")
124+
125+
time.Sleep(1 * time.Millisecond)
126+
}

0 commit comments

Comments
 (0)