Make usage of loggers explicit (#45)

This commit is contained in:
andig 2020-04-21 11:19:49 +02:00 • committed by GitHub
parent f739470d9d
commit 0e352c77d7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 45 additions and 47 deletions

View file

@ -3,11 +3,13 @@ package provider
import (
"time"
"github.com/andig/evcc/api"
"github.com/benbjohnson/clock"
)
// Cached wraps a getter with a cache
type Cached struct {
log *api.Logger
clock clock.Clock
updated time.Time
cache time.Duration
@ -16,8 +18,9 @@ type Cached struct {
}
// NewCached wraps a getter with a cache
func NewCached(getter interface{}, cache time.Duration) *Cached {
func NewCached(log *api.Logger, getter interface{}, cache time.Duration) *Cached {
return &Cached{
log: log,
clock: clock.New(),
getter: getter,
cache: cache,
@ -29,7 +32,7 @@ func (c *Cached) FloatGetter() FloatGetter {
g, ok := c.getter.(FloatGetter)
if !ok {
if g, ok = c.getter.(func() (float64, error)); !ok {
log.FATAL.Fatalf("invalid type: %T", c.getter)
c.log.FATAL.Fatalf("invalid type: %T", c.getter)
}
g = FloatGetter(g)
}
@ -54,7 +57,7 @@ func (c *Cached) IntGetter() IntGetter {
g, ok := c.getter.(IntGetter)
if !ok {
if g, ok = c.getter.(func() (int64, error)); !ok {
log.FATAL.Fatalf("invalid type: %T", c.getter)
c.log.FATAL.Fatalf("invalid type: %T", c.getter)
}
g = IntGetter(g)
}
@ -79,7 +82,7 @@ func (c *Cached) StringGetter() StringGetter {
g, ok := c.getter.(StringGetter)
if !ok {
if g, ok = c.getter.(func() (string, error)); !ok {
log.FATAL.Fatalf("invalid type: %T", c.getter)
c.log.FATAL.Fatalf("invalid type: %T", c.getter)
}
g = StringGetter(g)
}
@ -105,7 +108,7 @@ func (c *Cached) BoolGetter() BoolGetter {
g, ok := c.getter.(BoolGetter)
if !ok {
if g, ok = c.getter.(func() (bool, error)); !ok {
log.FATAL.Fatalf("invalid type: %T", g)
c.log.FATAL.Fatalf("invalid type: %T", g)
}
g = BoolGetter(g)
}

View file

@ -27,7 +27,7 @@ func TestCachedGetter(t *testing.T) {
}
duration := time.Second
c := NewCached(g, duration)
c := NewCached(nil, g, duration)
clck := clock.NewMock()
c.clock = clck
getter := c.FloatGetter()

View file

@ -70,7 +70,7 @@ func NewFloatGetterFromConfig(log *api.Logger, config Config) (res FloatGetter)
pc := scriptFromConfig(log, config.Other)
res = NewScriptProvider(pc.Timeout).FloatGetter(pc.Cmd)
if pc.Cache > 0 {
res = NewCached(res, pc.Cache).FloatGetter()
res = NewCached(log, res, pc.Cache).FloatGetter()
}
case "modbus-rtu", "modbus-tcp", "modbus-rtuovertcp", "modbus-tcprtu", "modbus-rtutcp":
res = FloatGetter(NewModbusFromConfig(log, config.Type, config.Other).FloatGetter)
@ -91,7 +91,7 @@ func NewIntGetterFromConfig(log *api.Logger, config Config) (res IntGetter) {
pc := scriptFromConfig(log, config.Other)
res = NewScriptProvider(pc.Timeout).IntGetter(pc.Cmd)
if pc.Cache > 0 {
res = NewCached(res, pc.Cache).IntGetter()
res = NewCached(log, res, pc.Cache).IntGetter()
}
case "modbus-rtu", "modbus-tcp", "modbus-rtuovertcp", "modbus-tcprtu", "modbus-rtutcp":
res = IntGetter(NewModbusFromConfig(log, config.Type, config.Other).IntGetter)
@ -112,7 +112,7 @@ func NewStringGetterFromConfig(log *api.Logger, config Config) (res StringGetter
pc := scriptFromConfig(log, config.Other)
res = NewScriptProvider(pc.Timeout).StringGetter(pc.Cmd)
if pc.Cache > 0 {
res = NewCached(res, pc.Cache).StringGetter()
res = NewCached(log, res, pc.Cache).StringGetter()
}
case "combined", "openwb":
res = openWBStatusFromConfig(log, config.Other)
@ -133,7 +133,7 @@ func NewBoolGetterFromConfig(log *api.Logger, config Config) (res BoolGetter) {
pc := scriptFromConfig(log, config.Other)
res = NewScriptProvider(pc.Timeout).BoolGetter(pc.Cmd)
if pc.Cache > 0 {
res = NewCached(res, pc.Cache).BoolGetter()
res = NewCached(log, res, pc.Cache).BoolGetter()
}
default:
log.FATAL.Fatalf("invalid provider type %s", config.Type)

View file

@ -12,10 +12,9 @@ import (
"github.com/kballard/go-shellquote"
)
var log = api.NewLogger("exec")
// Script implements shell script-based providers and setters
type Script struct {
log *api.Logger
timeout time.Duration
}
@ -23,6 +22,7 @@ type Script struct {
// Script execution is aborted after given timeout.
func NewScriptProvider(timeout time.Duration) *Script {
return &Script{
log: api.NewLogger("exec"),
timeout: timeout,
}
}
@ -53,11 +53,11 @@ func (e *Script) StringGetter(script string) StringGetter {
s = strings.TrimSpace(string(ee.Stderr))
}
log.ERROR.Printf("%s: %s", strings.Join(args, " "), s)
e.log.ERROR.Printf("%s: %s", strings.Join(args, " "), s)
return "", err
}
log.TRACE.Printf("%s: %s", strings.Join(args, " "), s)
e.log.TRACE.Printf("%s: %s", strings.Join(args, " "), s)
return s, nil
}
}

View file

@ -2,6 +2,7 @@ package provider
import (
"fmt"
"math"
"strconv"
"sync"
"time"
@ -15,10 +16,9 @@ const (
waitTimeout = 50 * time.Millisecond // polling interval when waiting for initial value
)
var mlog = api.NewLogger("mqtt")
// MqttClient is a paho publisher
type MqttClient struct {
log *api.Logger
mux sync.Mutex
Client mqtt.Client
broker string
@ -34,9 +34,11 @@ func NewMqttClient(
clientID string,
qos byte,
) *MqttClient {
mlog.INFO.Printf("connecting %s at %s", clientID, broker)
log := api.NewLogger("mqtt")
log.INFO.Printf("connecting %s at %s", clientID, broker)
mc := &MqttClient{
log: log,
broker: broker,
qos: qos,
listener: make(map[string]func(string)),
@ -63,18 +65,18 @@ func NewMqttClient(
// ConnectionLostHandler logs cause of connection loss as warning
func (m *MqttClient) ConnectionLostHandler(client mqtt.Client, reason error) {
mlog.WARN.Printf("%s connection lost: %v", m.broker, reason.Error())
m.log.WARN.Printf("%s connection lost: %v", m.broker, reason.Error())
}
// ConnectionHandler restores listeners
func (m *MqttClient) ConnectionHandler(client mqtt.Client) {
mlog.TRACE.Printf("%s connected", m.broker)
m.log.TRACE.Printf("%s connected", m.broker)
m.mux.Lock()
defer m.mux.Unlock()
for topic, l := range m.listener {
mlog.TRACE.Printf("%s subscribe %s", m.broker, topic)
m.log.TRACE.Printf("%s subscribe %s", m.broker, topic)
go m.listen(topic, l)
}
}
@ -83,7 +85,7 @@ func (m *MqttClient) ConnectionHandler(client mqtt.Client) {
func (m *MqttClient) Listen(topic string, callback func(string)) {
m.mux.Lock()
if _, ok := m.listener[topic]; ok {
mlog.FATAL.Fatalf("%s: duplicate listener not allowed", topic)
m.log.FATAL.Fatalf("%s: duplicate listener not allowed", topic)
}
m.listener[topic] = callback
m.mux.Unlock()
@ -105,6 +107,7 @@ func (m *MqttClient) listen(topic string, callback func(string)) {
// FloatGetter creates handler for float64 from MQTT topic that returns cached value
func (m *MqttClient) FloatGetter(topic string, multiplier float64, timeout time.Duration) FloatGetter {
h := &msgHandler{
log: m.log,
topic: topic,
multiplier: multiplier,
timeout: timeout,
@ -117,6 +120,7 @@ func (m *MqttClient) FloatGetter(topic string, multiplier float64, timeout time.
// IntGetter creates handler for int64 from MQTT topic that returns cached value
func (m *MqttClient) IntGetter(topic string, multiplier int64, timeout time.Duration) IntGetter {
h := &msgHandler{
log: m.log,
topic: topic,
multiplier: float64(multiplier),
timeout: timeout,
@ -129,6 +133,7 @@ func (m *MqttClient) IntGetter(topic string, multiplier int64, timeout time.Dura
// StringGetter creates handler for string from MQTT topic that returns cached value
func (m *MqttClient) StringGetter(topic string, timeout time.Duration) StringGetter {
h := &msgHandler{
log: m.log,
topic: topic,
timeout: timeout,
}
@ -140,6 +145,7 @@ func (m *MqttClient) StringGetter(topic string, timeout time.Duration) StringGet
// BoolGetter creates handler for string from MQTT topic that returns cached value
func (m *MqttClient) BoolGetter(topic string, timeout time.Duration) BoolGetter {
h := &msgHandler{
log: m.log,
topic: topic,
timeout: timeout,
}
@ -167,7 +173,7 @@ func (m *MqttClient) IntSetter(param, topic, message string) IntSetter {
return err
}
mlog.TRACE.Printf("send %s: '%s'", topic, payload)
m.log.TRACE.Printf("send %s: '%s'", topic, payload)
token := m.Client.Publish(topic, m.qos, false, payload)
if token.WaitTimeout(publishTimeout) {
return token.Error()
@ -185,7 +191,7 @@ func (m *MqttClient) BoolSetter(param, topic, message string) BoolSetter {
return err
}
mlog.TRACE.Printf("send %s: '%s'", topic, payload)
m.log.TRACE.Printf("send %s: '%s'", topic, payload)
token := m.Client.Publish(topic, m.qos, false, payload)
if token.WaitTimeout(publishTimeout) {
return token.Error()
@ -199,14 +205,15 @@ func (m *MqttClient) BoolSetter(param, topic, message string) BoolSetter {
func (m *MqttClient) WaitForToken(token mqtt.Token) {
if token.WaitTimeout(publishTimeout) {
if token.Error() != nil {
mlog.ERROR.Printf("error: %s", token.Error())
m.log.ERROR.Printf("error: %s", token.Error())
}
} else {
mlog.DEBUG.Println("timeout")
m.log.DEBUG.Println("timeout")
}
}
type msgHandler struct {
log *api.Logger
once sync.Once
mux sync.Mutex
updated time.Time
@ -217,7 +224,7 @@ type msgHandler struct {
}
func (h *msgHandler) Receive(payload string) {
mlog.TRACE.Printf("recv %s: '%s'", h.topic, payload)
h.log.TRACE.Printf("recv %s: '%s'", h.topic, payload)
h.mux.Lock()
defer h.mux.Unlock()
@ -231,7 +238,7 @@ func (h *msgHandler) waitForInitialValue() {
defer h.mux.Unlock()
if h.updated.IsZero() {
mlog.TRACE.Printf("%s wait for initial value", h.topic)
h.log.TRACE.Printf("%s wait for initial value", h.topic)
// wait for initial update
for h.updated.IsZero() {
@ -260,20 +267,8 @@ func (h *msgHandler) floatGetter() (float64, error) {
}
func (h *msgHandler) intGetter() (int64, error) {
h.once.Do(h.waitForInitialValue)
h.mux.Lock()
defer h.mux.Unlock()
if elapsed := time.Since(h.updated); h.timeout != 0 && elapsed > h.timeout {
return 0, fmt.Errorf("%s outdated: %v", h.topic, elapsed.Truncate(time.Second))
}
val, err := strconv.ParseInt(h.payload, 10, 64)
if err != nil {
return 0, fmt.Errorf("%s invalid: '%s'", h.topic, h.payload)
}
return int64(h.multiplier) * val, nil
f, err := h.floatGetter()
return int64(math.Round(f)), err
}
func (h *msgHandler) stringGetter() (string, error) {

View file

@ -70,7 +70,7 @@ func NewAudiFromConfig(log *api.Logger, other map[string]interface{}) api.Vehicl
vin: cc.VIN,
}
v.chargeStateG = provider.NewCached(v.chargeState, cc.Cache).FloatGetter()
v.chargeStateG = provider.NewCached(log, v.chargeState, cc.Cache).FloatGetter()
return v
}

View file

@ -52,7 +52,7 @@ func NewBMWFromConfig(log *api.Logger, other map[string]interface{}) api.Vehicle
vin: cc.VIN,
}
v.chargeStateG = provider.NewCached(v.chargeState, cc.Cache).FloatGetter()
v.chargeStateG = provider.NewCached(log, v.chargeState, cc.Cache).FloatGetter()
return v
}

View file

@ -43,7 +43,7 @@ func NewNissanFromConfig(log *api.Logger, other map[string]interface{}) api.Vehi
session: session,
}
v.chargeStateG = provider.NewCached(v.chargeState, cc.Cache).FloatGetter()
v.chargeStateG = provider.NewCached(log, v.chargeState, cc.Cache).FloatGetter()
return v
}

View file

@ -57,8 +57,8 @@ func NewTeslaFromConfig(log *api.Logger, other map[string]interface{}) api.Vehic
log.FATAL.Fatal("cannot create tesla: vin not found")
}
v.chargeStateG = provider.NewCached(v.chargeState, cc.Cache).FloatGetter()
v.chargedEnergyG = provider.NewCached(v.chargedEnergy, cc.Cache).FloatGetter()
v.chargeStateG = provider.NewCached(log, v.chargeState, cc.Cache).FloatGetter()
v.chargedEnergyG = provider.NewCached(log, v.chargedEnergy, cc.Cache).FloatGetter()
return v
}

View file

@ -40,7 +40,7 @@ func NewConfigurableFromConfig(log *api.Logger, other map[string]interface{}) ap
getter := provider.NewFloatGetterFromConfig(log, cc.Charge)
if cc.Cache > 0 {
getter = provider.NewCached(getter, cc.Cache).FloatGetter()
getter = provider.NewCached(log, getter, cc.Cache).FloatGetter()
}
return &Vehicle{