commit
f4df374a92
5 changed files with 284 additions and 0 deletions
-
3.gitignore
-
37Makefile
-
162logger.go
-
49message.go
-
33version.go.m4
@ -0,0 +1,3 @@ |
|||
# Generated with m4 |
|||
version.go |
|||
.version* |
|||
@ -0,0 +1,37 @@ |
|||
PACKAGE = gitlab.weird-web-workers.org/golang/logger |
|||
|
|||
SOURCES = version.go \
|
|||
logger.go \
|
|||
message.go |
|||
|
|||
VERSION = 0.0.1 |
|||
REVISION = $(shell git rev-parse HEAD) |
|||
BUILDTIME= "$(shell date -u +'%Y-%m-%dT%H:%M:%SZ')" |
|||
|
|||
GOOS = $(shell go env GOOS) |
|||
GOARCH = $(shell go env GOARCH) |
|||
|
|||
LIBRARY = $(GOPATH)/pkg/$(GOOS)_$(GOARCH)/$(PACKAGE).a |
|||
|
|||
.PHONY: all clean .version |
|||
|
|||
all: $(LIBRARY) |
|||
|
|||
$(LIBRARY): $(SOURCES) |
|||
go install $(PACKAGE) |
|||
|
|||
.version: |
|||
-@printf "%s\n%s\n%s" \
|
|||
"$(VERSION)" "$(REVISION)" "$(BUILDTIME)" >$@.new |
|||
-@diff $@ $@.new >/dev/null 2>&1 && rm $@.new || mv $@.new $@ |
|||
|
|||
version.go: version.go.m4 .version |
|||
-@m4 -Dm4_version=$(VERSION) \
|
|||
-Dm4_revision=$(REVISION) \
|
|||
-Dm4_build_time=$(BUILDTIME) \
|
|||
$< >$@ |
|||
|
|||
clean: |
|||
-@rm -f version.go 2>/dev/null |
|||
-@rm -f .version 2>/dev/null |
|||
-@rm -f $(LIBRARY) 2>/dev/null |
|||
@ -0,0 +1,162 @@ |
|||
/* |
|||
Handle the applications logging needs/ |
|||
|
|||
Authors: |
|||
Georg Hopp <georg@steffers.org> |
|||
|
|||
Changes: |
|||
2018-10-02 [Georg Hopp] File created. |
|||
|
|||
Copyright © 2018 Georg Hopp |
|||
|
|||
This program is free software: you can redistribute it and/or modify |
|||
it under the terms of the GNU General Public License as published by |
|||
the Free Software Foundation, either version 3 of the License, or |
|||
(at your option) any later version. |
|||
|
|||
This program is distributed in the hope that it will be useful, |
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
GNU General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU General Public License |
|||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
*/ |
|||
package logger |
|||
|
|||
import ( |
|||
"encoding/json" |
|||
"fmt" |
|||
"os" |
|||
"time" |
|||
) |
|||
|
|||
type Severity int |
|||
|
|||
const ( |
|||
DEBUG Severity = iota |
|||
INFO |
|||
WARNING |
|||
ERROR |
|||
FATAL |
|||
) |
|||
|
|||
var ( |
|||
SevStrings = [...]string{ |
|||
"DEBUG", |
|||
"INFO", |
|||
"WARNING", |
|||
"ERROR", |
|||
"FATAL", |
|||
} |
|||
) |
|||
|
|||
type Logger struct { |
|||
logLevel Severity |
|||
name string |
|||
} |
|||
|
|||
var Default = GetLogger(INFO, "default") |
|||
|
|||
func GetLogger(sev Severity, name string) *Logger { |
|||
logger := Logger{sev, name} |
|||
return &logger |
|||
} |
|||
|
|||
func SevStringToSeverity(sevStr string) (sev Severity) { |
|||
switch sevStr { |
|||
case SevStrings[DEBUG]: |
|||
sev = DEBUG |
|||
case SevStrings[INFO]: |
|||
sev = INFO |
|||
case SevStrings[WARNING]: |
|||
sev = WARNING |
|||
case SevStrings[FATAL]: |
|||
sev = FATAL |
|||
case SevStrings[ERROR]: |
|||
fallthrough |
|||
default: |
|||
sev = ERROR |
|||
} |
|||
return |
|||
} |
|||
|
|||
func SeverityToSevString(sev Severity) string { |
|||
return SevStrings[sev] |
|||
} |
|||
|
|||
func (logger *Logger) SetLevel(level Severity) { |
|||
logger.logLevel = level |
|||
} |
|||
|
|||
func (logger *Logger) logToJson( |
|||
sev Severity, format string, args ...interface{}) string { |
|||
|
|||
message, err := json.Marshal( |
|||
logMessage{ |
|||
time.Now().UTC().Format(time.RFC3339), |
|||
logger.name, |
|||
sev, |
|||
fmt.Sprintf(format, args...), |
|||
}) |
|||
if err != nil { |
|||
// TODO Making it fatal if no logging can be done is
|
|||
// kind of drastic
|
|||
os.Exit(1) |
|||
} |
|||
return string(message[:]) |
|||
} |
|||
|
|||
func (logger *Logger) log(sev Severity, format string, args ...interface{}) { |
|||
|
|||
var output *os.File |
|||
|
|||
if sev >= ERROR { |
|||
output = os.Stderr |
|||
} else { |
|||
output = os.Stdout |
|||
} |
|||
|
|||
if sev >= logger.logLevel { |
|||
fmt.Fprintln(output, logger.logToJson(sev, format, args...)) |
|||
} |
|||
} |
|||
|
|||
func (logger *Logger) Debug(format string, args ...interface{}) { |
|||
logger.log(DEBUG, format, args...) |
|||
} |
|||
|
|||
func (logger *Logger) Info(format string, args ...interface{}) { |
|||
logger.log(INFO, format, args...) |
|||
} |
|||
|
|||
func (logger *Logger) Warning(format string, args ...interface{}) { |
|||
logger.log(WARNING, format, args...) |
|||
} |
|||
|
|||
func (logger *Logger) Error(format string, args ...interface{}) { |
|||
logger.log(ERROR, format, args...) |
|||
} |
|||
|
|||
func (logger *Logger) Panic(format string, args ...interface{}) { |
|||
logger.log(FATAL, format, args...) |
|||
panic(fmt.Sprintf(format, args...)) |
|||
} |
|||
|
|||
func (logger *Logger) LogError( |
|||
err error, format string, args ...interface{}) { |
|||
|
|||
if err != nil { |
|||
logger.Error("%s: %s", fmt.Sprintf(format, args...), err) |
|||
} |
|||
} |
|||
|
|||
func (logger *Logger) FailOnError( |
|||
err error, format string, args ...interface{}) { |
|||
|
|||
if err != nil { |
|||
logger.Panic("%s: %s", fmt.Sprintf(format, args...), err) |
|||
} |
|||
} |
|||
|
|||
// vim: ts=4 sts=4 sw=4 noet tw=72:
|
|||
@ -0,0 +1,49 @@ |
|||
/* |
|||
Handle the applications logging needs/ |
|||
|
|||
Authors: |
|||
Georg Hopp <georg@steffers.org> |
|||
|
|||
Changes: |
|||
2018-10-02 [Georg Hopp] File created. |
|||
|
|||
Copyright © 2018 Georg Hopp |
|||
|
|||
This program is free software: you can redistribute it and/or modify |
|||
it under the terms of the GNU General Public License as published by |
|||
the Free Software Foundation, either version 3 of the License, or |
|||
(at your option) any later version. |
|||
|
|||
This program is distributed in the hope that it will be useful, |
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
GNU General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU General Public License |
|||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
*/ |
|||
package logger |
|||
|
|||
import ( |
|||
"fmt" |
|||
) |
|||
|
|||
type logMessage struct { |
|||
Time string `json:"time"` |
|||
Logger string `json:"logger"` |
|||
Severity Severity `json:"severity"` |
|||
Message string `json:"message"` |
|||
} |
|||
|
|||
func (sev Severity) MarshalJSON() (data []byte, err error) { |
|||
if int(sev) > len(SevStrings)-1 { |
|||
data = nil |
|||
err = fmt.Errorf("Unable to marshal unknown severity: %d", sev) |
|||
} else { |
|||
data = []byte("\"" + SevStrings[sev] + "\"") |
|||
err = nil |
|||
} |
|||
return |
|||
} |
|||
|
|||
// vim: ts=4 sts=4 sw=4 noet tw=72:
|
|||
@ -0,0 +1,33 @@ |
|||
/* |
|||
Package version information. |
|||
|
|||
Authors: |
|||
Georg Hopp <georg@steffers.org> |
|||
|
|||
Changes: |
|||
2018-10-02 [Georg Hopp] File created. |
|||
|
|||
Copyright © 2018 Georg Hopp |
|||
|
|||
This program is free software: you can redistribute it and/or modify |
|||
it under the terms of the GNU General Public License as published by |
|||
the Free Software Foundation, either version 3 of the License, or |
|||
(at your option) any later version. |
|||
|
|||
This program is distributed in the hope that it will be useful, |
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
GNU General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU General Public License |
|||
along with this program. If not, see <http://www.gnu.org/licenses/>. |
|||
*/ |
|||
package test |
|||
|
|||
const ( |
|||
VERSION = "m4_version" |
|||
REVISION = "m4_revision" |
|||
BUILD_TIME = "m4_build_time" |
|||
) |
|||
|
|||
// vim: ts=4 sts=4 sw=4 noet tw=72: |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue