Skip to content

Commit

Permalink
added timestamp field
Browse files Browse the repository at this point in the history
message timestamp now automatically added to message
position timestamp field
closes #19
  • Loading branch information
steenzout committed Nov 18, 2015
1 parent 40fecc3 commit 392702c
Show file tree
Hide file tree
Showing 7 changed files with 147 additions and 19 deletions.
2 changes: 2 additions & 0 deletions fields/fields.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,6 @@ const (
Start = "start"
// StopLevel is the name of the log message attribute that stores a stop point in time.
Stop = "stop"
// Timestamp is the name of the log message attribute that the timestamp when the message was created.
Timestamp = "timestamp"
)
28 changes: 28 additions & 0 deletions fields/timestamp/helpers_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
//
// Copyright 2015 Rakuten Marketing LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

package timestamp_test

import (
"testing"

"github.com/stretchr/testify/suite"
)

// TestSuite runs the test suites.
func TestSuite(t *testing.T) {
suite.Run(t, new(FieldTestSuite))
}
31 changes: 31 additions & 0 deletions fields/timestamp/timestamp.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
//
// Copyright 2015 Rakuten Marketing LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

package timestamp

import (
"time"
)

// Type type for the log message timestamp field.
type Type struct {
time.Time
}

// String returns a RFC3339 string representation of the timestamp.
func (t Type) String() string {
return t.Format(time.RFC3339)
}
38 changes: 38 additions & 0 deletions fields/timestamp/timestamp_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
//
// Copyright 2015 Rakuten Marketing LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

package timestamp_test

import (
"time"

"github.com/mediaFORGE/gol/fields/timestamp"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/suite"
)

type FieldTestSuite struct {
suite.Suite
}

func (s *FieldTestSuite) TestTypeString() {
assert.Equal(
s.T(),
"2015-01-02T03:04:05Z",
timestamp.Type{
time.Date(2015, 1, 2, 3, 4, 5, 0, time.UTC),
}.String())
}
10 changes: 6 additions & 4 deletions internal/examples/formatters/custom/example.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,20 +23,22 @@ func (f Custom) Format(msg *gol.LogMessage) (string, error) {

i := 0
for k, v := range *msg {
if k != fields.Severity {
if k != fields.Severity && k != fields.Timestamp {
buffer[i] = fmt.Sprintf("%s:'%s'", k, v)
i += 1
}
}

t, _ := msg.Timestamp()

if severity, err := msg.Severity(); err != nil {
return fmt.Sprintf("UNKNOWN %s\n", strings.Join(buffer, " ")), nil
return fmt.Sprintf("%s UNKNOWN %s\n", t.String(), strings.Join(buffer, " ")), nil
} else {
switch severity >= field_severity.Error {
case true:
return fmt.Sprintf("%s %s\n", color.RedString("%s", severity), strings.Join(buffer, " ")), nil
return fmt.Sprintf("%s %s %s\n", t.String(), color.RedString("%s", severity), strings.Join(buffer, " ")), nil
default:
return fmt.Sprintf("%s %s\n", severity, strings.Join(buffer, " ")), nil
return fmt.Sprintf("%s %s %s\n", t.String(), severity, strings.Join(buffer, " ")), nil
}
}
}
Expand Down
43 changes: 28 additions & 15 deletions messages.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ import (
"time"

"github.com/mediaFORGE/gol/fields"
"github.com/mediaFORGE/gol/fields/severity"
field_severity "github.com/mediaFORGE/gol/fields/severity"
field_timestamp "github.com/mediaFORGE/gol/fields/timestamp"
)

// LogMessage is a log message.
Expand All @@ -25,16 +26,16 @@ func (msg LogMessage) Get(f string) (i interface{}, err error) {
}

// Severity returns the value of the logger message severity level field.
func (msg LogMessage) Severity() (lvl severity.Type, err error) {
func (msg LogMessage) Severity() (lvl field_severity.Type, err error) {
var v interface{}
if v, err = msg.Get(fields.Severity); err == nil {
return v.(severity.Type), nil
return v.(field_severity.Type), nil
}
return severity.Type(-1), err
return field_severity.Type(-1), err
}

// SetSeverity sets the value of the logger message severity level field.
func (msg LogMessage) SetSeverity(lvl severity.Type) (err error) {
func (msg LogMessage) SetSeverity(lvl field_severity.Type) (err error) {
if err = lvl.Validate(); err == nil {
msg[fields.Severity] = lvl
}
Expand Down Expand Up @@ -71,53 +72,65 @@ func (msg LogMessage) SetStop(s *time.Time) (err error) {
return nil
}

// Timestamp returns the value of the logger message timestamp field.
func (msg LogMessage) Timestamp() (*field_timestamp.Type, error) {
var v interface{}
var err error
if v, err = msg.Get(fields.Timestamp); err == nil {
vt := v.(field_timestamp.Type)
return &vt, nil
}
return nil, err
}

// NewLogMessageFunc is the function signature of LogMessage constructor functions.
type NewLogMessageFunc func(args ...interface{}) *LogMessage

// NewEmergency builds an emergency severity message.
func NewEmergency(args ...interface{}) *LogMessage {
return NewMessage(severity.Type(severity.Emergency), args...)
return NewMessage(field_severity.Type(field_severity.Emergency), args...)
}

// NewAlert builds an alert severity message.
func NewAlert(args ...interface{}) *LogMessage {
return NewMessage(severity.Type(severity.Alert), args...)
return NewMessage(field_severity.Type(field_severity.Alert), args...)
}

// NewCritical builds a critical severity message.
func NewCritical(args ...interface{}) *LogMessage {
return NewMessage(severity.Type(severity.Critical), args...)
return NewMessage(field_severity.Type(field_severity.Critical), args...)
}

// NewError builds an error severity message.
func NewError(args ...interface{}) *LogMessage {
return NewMessage(severity.Type(severity.Error), args...)
return NewMessage(field_severity.Type(field_severity.Error), args...)
}

// NewWarning builds a warning severity message.
func NewWarning(args ...interface{}) *LogMessage {
return NewMessage(severity.Type(severity.Warning), args...)
return NewMessage(field_severity.Type(field_severity.Warning), args...)
}

// NewNotice builds a notice severity message.
func NewNotice(args ...interface{}) *LogMessage {
return NewMessage(severity.Type(severity.Notice), args...)
return NewMessage(field_severity.Type(field_severity.Notice), args...)
}

// NewInfo builds an info severity message.
func NewInfo(args ...interface{}) *LogMessage {
return NewMessage(severity.Type(severity.Info), args...)
return NewMessage(field_severity.Type(field_severity.Info), args...)
}

// NewDebug builds a debug severity message.
func NewDebug(args ...interface{}) *LogMessage {
return NewMessage(severity.Type(severity.Debug), args...)
return NewMessage(field_severity.Type(field_severity.Debug), args...)
}

// NewMessage build a log message with the given severity level.
func NewMessage(l severity.Type, args ...interface{}) *LogMessage {
func NewMessage(l field_severity.Type, args ...interface{}) *LogMessage {
msg := LogMessage{
fields.Severity: l,
fields.Timestamp: field_timestamp.Type{time.Now()},
fields.Severity: l,
}
for i := 0; i < len(args); i += 2 {
msg[args[i].(string)] = args[i+1]
Expand Down
14 changes: 14 additions & 0 deletions messages_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -135,3 +135,17 @@ func (s *MessageTestSuite) TestNewSeverity() {
s.assertSeverityLevel(severity.Type(lvl), f)
}
}

func (s *MessageTestSuite) TestTimestamp() {
var msg *gol.LogMessage

msg = &gol.LogMessage{"key": "value"}
v, err := msg.Timestamp()
assert.Equal(s.T(), fmt.Errorf("Message does not contain field timestamp"), err)
assert.Nil(s.T(), v)

msg = gol.NewInfo("key", "value")
v, err = msg.Timestamp()
assert.Nil(s.T(), err)
assert.True(s.T(), v.Before(time.Now()))
}

0 comments on commit 392702c

Please sign in to comment.