mirror of
https://github.com/gogrlx/nats-server.git
synced 2026-04-02 03:38:42 -07:00
login system abstraction
This commit is contained in:
65
logger/log.go
Normal file
65
logger/log.go
Normal file
@@ -0,0 +1,65 @@
|
||||
// Copyright 2012-2014 Apcera Inc. All rights reserved.
|
||||
package logger
|
||||
|
||||
import (
|
||||
"log"
|
||||
"os"
|
||||
)
|
||||
|
||||
type Logger struct {
|
||||
logger *log.Logger
|
||||
debug bool
|
||||
trace bool
|
||||
}
|
||||
|
||||
func NewStdLogger(time, debug, trace bool) *Logger {
|
||||
flags := 0
|
||||
if time {
|
||||
flags = log.LstdFlags
|
||||
}
|
||||
|
||||
return &Logger{
|
||||
logger: log.New(os.Stderr, "", flags),
|
||||
debug: debug,
|
||||
trace: trace,
|
||||
}
|
||||
}
|
||||
|
||||
func NewFileLogger(filename string, time, debug, trace bool) *Logger {
|
||||
fileflags := os.O_WRONLY | os.O_APPEND | os.O_CREATE
|
||||
f, err := os.OpenFile(filename, fileflags, 0660)
|
||||
if err != nil {
|
||||
log.Fatal("error opening file: %v", err)
|
||||
}
|
||||
|
||||
flags := 0
|
||||
if time {
|
||||
flags = log.LstdFlags
|
||||
}
|
||||
|
||||
return &Logger{
|
||||
logger: log.New(f, "", flags),
|
||||
debug: debug,
|
||||
trace: trace,
|
||||
}
|
||||
}
|
||||
|
||||
func (l *Logger) Log(format string, v ...interface{}) {
|
||||
l.logger.Printf(format, v...)
|
||||
}
|
||||
|
||||
func (l *Logger) Fatal(format string, v ...interface{}) {
|
||||
l.logger.Fatalf(format, v)
|
||||
}
|
||||
|
||||
func (l *Logger) Debug(format string, v ...interface{}) {
|
||||
if l.debug == true {
|
||||
l.Log(format, v...)
|
||||
}
|
||||
}
|
||||
|
||||
func (l *Logger) Trace(format string, v ...interface{}) {
|
||||
if l.trace == true {
|
||||
l.Log(format, v...)
|
||||
}
|
||||
}
|
||||
128
logger/log_test.go
Normal file
128
logger/log_test.go
Normal file
@@ -0,0 +1,128 @@
|
||||
package logger
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"os"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestStdLogger(t *testing.T) {
|
||||
logger := NewStdLogger(false, false, false)
|
||||
|
||||
flags := logger.logger.Flags()
|
||||
if flags != 0 {
|
||||
t.Fatalf("Expected %q, received %q\n", 0, flags)
|
||||
}
|
||||
|
||||
if logger.debug != false {
|
||||
t.Fatalf("Expected %b, received %b\n", false, logger.debug)
|
||||
}
|
||||
|
||||
if logger.trace != false {
|
||||
t.Fatalf("Expected %b, received %b\n", false, logger.trace)
|
||||
}
|
||||
}
|
||||
|
||||
func TestStdLoggerWithDebugTraceAndTime(t *testing.T) {
|
||||
logger := NewStdLogger(true, true, true)
|
||||
|
||||
flags := logger.logger.Flags()
|
||||
if flags != log.LstdFlags {
|
||||
t.Fatalf("Expected %d, received %d\n", log.LstdFlags, flags)
|
||||
}
|
||||
|
||||
if logger.debug != true {
|
||||
t.Fatalf("Expected %b, received %b\n", true, logger.debug)
|
||||
}
|
||||
|
||||
if logger.trace != true {
|
||||
t.Fatalf("Expected %b, received %b\n", true, logger.trace)
|
||||
}
|
||||
}
|
||||
|
||||
func TestStdLoggerLog(t *testing.T) {
|
||||
expectOutput(t, func() {
|
||||
logger := NewStdLogger(false, false, false)
|
||||
logger.Log("foo")
|
||||
}, "foo\n")
|
||||
}
|
||||
|
||||
func TestStdLoggerDebug(t *testing.T) {
|
||||
expectOutput(t, func() {
|
||||
logger := NewStdLogger(false, true, false)
|
||||
logger.Debug("foo %s", "bar")
|
||||
}, "foo bar\n")
|
||||
}
|
||||
|
||||
func TestStdLoggerDebugWithOutDebug(t *testing.T) {
|
||||
expectOutput(t, func() {
|
||||
logger := NewStdLogger(false, false, false)
|
||||
logger.Debug("foo")
|
||||
}, "")
|
||||
}
|
||||
|
||||
func TestStdLoggerTrace(t *testing.T) {
|
||||
expectOutput(t, func() {
|
||||
logger := NewStdLogger(false, false, true)
|
||||
logger.Trace("foo")
|
||||
}, "foo\n")
|
||||
}
|
||||
|
||||
func TestStdLoggerTraceWithOutDebug(t *testing.T) {
|
||||
expectOutput(t, func() {
|
||||
logger := NewStdLogger(false, false, false)
|
||||
logger.Trace("foo")
|
||||
}, "")
|
||||
}
|
||||
|
||||
func TestFileLogger(t *testing.T) {
|
||||
tmpDir, err := ioutil.TempDir("", "_gnatsd")
|
||||
if err != nil {
|
||||
t.Fatal("Could not create tmp dir")
|
||||
}
|
||||
defer os.RemoveAll(tmpDir)
|
||||
|
||||
file, err := ioutil.TempFile(tmpDir, "gnatsd:log_")
|
||||
file.Close()
|
||||
|
||||
logger := NewFileLogger(file.Name(), false, false, false)
|
||||
logger.Log("foo")
|
||||
|
||||
buf, err := ioutil.ReadFile(file.Name())
|
||||
if err != nil {
|
||||
t.Fatalf("Could not read logfile: %v", err)
|
||||
}
|
||||
if len(buf) <= 0 {
|
||||
t.Fatal("Expected a non-zero length logfile")
|
||||
}
|
||||
|
||||
if string(buf) != "foo\n" {
|
||||
t.Fatalf("Expected '%s', received '%s'\n", "foo", string(buf))
|
||||
}
|
||||
}
|
||||
|
||||
func expectOutput(t *testing.T, f func(), expect string) {
|
||||
old := os.Stdout // keep backup of the real stdout
|
||||
r, w, _ := os.Pipe()
|
||||
os.Stderr = w
|
||||
|
||||
f()
|
||||
|
||||
outC := make(chan string)
|
||||
// copy the output in a separate goroutine so printing can't block indefinitely
|
||||
go func() {
|
||||
var buf bytes.Buffer
|
||||
io.Copy(&buf, r)
|
||||
outC <- buf.String()
|
||||
}()
|
||||
|
||||
os.Stderr.Close()
|
||||
os.Stderr = old // restoring the real stdout
|
||||
out := <-outC
|
||||
if out != expect {
|
||||
t.Fatalf("Expected '%s', received '%s'\n", expect, out)
|
||||
}
|
||||
}
|
||||
60
logger/syslog.go
Normal file
60
logger/syslog.go
Normal file
@@ -0,0 +1,60 @@
|
||||
// Copyright 2012-2014 Apcera Inc. All rights reserved.
|
||||
package logger
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"log/syslog"
|
||||
)
|
||||
|
||||
type SysLogger struct {
|
||||
writer *syslog.Writer
|
||||
debug bool
|
||||
trace bool
|
||||
}
|
||||
|
||||
func NewSysLogger(debug, trace bool) *SysLogger {
|
||||
w, err := syslog.New(syslog.LOG_DAEMON|syslog.LOG_NOTICE, "gnatsd")
|
||||
if err != nil {
|
||||
log.Fatal("error connecting to syslog: %v", err)
|
||||
}
|
||||
|
||||
return &SysLogger{
|
||||
writer: w,
|
||||
debug: debug,
|
||||
trace: trace,
|
||||
}
|
||||
}
|
||||
|
||||
func NewRemoteSysLogger(network, raddr string, debug, trace bool) *SysLogger {
|
||||
w, err := syslog.Dial(network, raddr, syslog.LOG_DEBUG, "gnatsd")
|
||||
if err != nil {
|
||||
log.Fatal("error connecting to syslog: %v", err)
|
||||
}
|
||||
|
||||
return &SysLogger{
|
||||
writer: w,
|
||||
debug: debug,
|
||||
trace: trace,
|
||||
}
|
||||
}
|
||||
|
||||
func (l *SysLogger) Log(format string, v ...interface{}) {
|
||||
l.writer.Notice(fmt.Sprintf(format, v...))
|
||||
}
|
||||
|
||||
func (l *SysLogger) Fatal(format string, v ...interface{}) {
|
||||
l.writer.Crit(fmt.Sprintf(format, v...))
|
||||
}
|
||||
|
||||
func (l *SysLogger) Debug(format string, v ...interface{}) {
|
||||
if l.debug == true {
|
||||
l.writer.Debug(fmt.Sprintf(format, v...))
|
||||
}
|
||||
}
|
||||
|
||||
func (l *SysLogger) Trace(format string, v ...interface{}) {
|
||||
if l.trace == true {
|
||||
l.writer.Info(fmt.Sprintf(format, v...))
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user