[SEBA-342] Publishing logs to kafka

Change-Id: Iaa72945dfd59a5d151cad14ff593eb299229fb3e
diff --git a/common/logger.go b/common/logger.go
deleted file mode 100644
index c707601..0000000
--- a/common/logger.go
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * 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 logger
-
-import (
-	"log"
-	"strings"
-)
-
-func Error(s string, opts ...interface{}) {
-	trimmed := strings.TrimRight(s, "\n")
-	if len(opts) == 0 {
-		log.Printf("[ERROR]:%s\n", trimmed)
-	} else {
-		fmt := "[ERROR]:" + trimmed + "\n"
-		log.Printf(fmt, opts...)
-	}
-}
-
-func Debug(s string, opts ...interface{}) {
-	trimmed := strings.TrimRight(s, "\n")
-	if len(opts) == 0 {
-		log.Printf("[DEBUG]:%s\n", trimmed)
-	} else {
-		fmt := "[DEBUG]:" + trimmed + "\n"
-		log.Printf(fmt, opts...)
-	}
-}
-
-func Info(s string, opts ...interface{}) {
-	trimmed := strings.TrimRight(s, "\n")
-	if len(opts) == 0 {
-		log.Printf("[INFO]:%s\n", trimmed)
-	} else {
-		fmt := "[INFO]:" + trimmed + "\n"
-		log.Printf(fmt, opts...)
-	}
-}
diff --git a/common/logger/logger.go b/common/logger/logger.go
new file mode 100644
index 0000000..f0bf4aa
--- /dev/null
+++ b/common/logger/logger.go
@@ -0,0 +1,96 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+
+ * 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 logger
+
+import (
+	"fmt"
+
+	lkh "github.com/gfremex/logrus-kafka-hook"
+	log "github.com/sirupsen/logrus"
+)
+
+var (
+	myLogger *log.Entry
+)
+
+func Setup(kafkaBroker string, level string) {
+
+	logger := log.New()
+	myLogger = logger.WithField("topics", []string{"bbsim.log"})
+
+	// TODO make this configurable via cli arg
+	if level == "DEBUG" {
+		logger.SetLevel(log.DebugLevel)
+	}
+
+	if len(kafkaBroker) > 0 {
+		myLogger.Debug("Setting up kafka integration")
+		hook, err := lkh.NewKafkaHook(
+			"kh",
+			[]log.Level{log.DebugLevel, log.InfoLevel, log.WarnLevel, log.ErrorLevel},
+			&log.JSONFormatter{
+				FieldMap: log.FieldMap{
+					log.FieldKeyTime:  "@timestamp",
+					log.FieldKeyLevel: "level",
+					log.FieldKeyMsg:   "message",
+				},
+			},
+			[]string{kafkaBroker},
+		)
+
+		if err != nil {
+			myLogger.Error(err)
+		}
+
+		logger.Hooks.Add(hook)
+
+	}
+
+	myLogger.WithField("kafkaBroker", kafkaBroker).Debug("Logger setup done")
+}
+
+func WithField(key string, value interface{}) *log.Entry {
+	return myLogger.WithField(key, value)
+}
+
+func WithFields(fields log.Fields) *log.Entry {
+	return myLogger.WithFields(fields)
+}
+
+func Panic(args ...interface{}) {
+	myLogger.Panic(fmt.Sprint(args...))
+}
+
+func Fatal(args ...interface{}) {
+	myLogger.Fatal(fmt.Sprint(args...))
+}
+
+func Error(args ...interface{}) {
+	myLogger.Error(fmt.Sprint(args...))
+}
+
+func Warn(args ...interface{}) {
+	myLogger.Warn(fmt.Sprint(args...))
+}
+
+func Info(args ...interface{}) {
+	myLogger.Info(fmt.Sprint(args...))
+}
+
+func Debug(args ...interface{}) {
+	myLogger.Debug(fmt.Sprint(args...))
+}
diff --git a/common/utils/utils.go b/common/utils/utils.go
new file mode 100644
index 0000000..a8fc3ba
--- /dev/null
+++ b/common/utils/utils.go
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+
+ * 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 utils
+
+import (
+	"fmt"
+
+	"gerrit.opencord.org/voltha-bbsim/device"
+)
+
+func OnuToSn(onu *device.Onu) string {
+	// TODO this can be more elegant,
+	// see https://github.com/opencord/voltha/blob/master/voltha/adapters/openolt/openolt_device.py#L929-L943
+	return string(onu.SerialNumber.VendorId) + "00000" + fmt.Sprint(onu.IntfID) + "0" + fmt.Sprintf("%x", onu.OnuID)
+}