From 4782a2e9db8a6f5efe11c69e7c78828e9ed21f61 Mon Sep 17 00:00:00 2001 From: Guilhem Fanton Date: Thu, 18 Oct 2018 15:29:05 +0200 Subject: [PATCH] feat(android): Better format log --- client/react-native/Makefile | 18 +++++ .../main/java/chat/berty/core/CoreModule.java | 8 ++- .../src/main/java/chat/berty/core/Level.java | 24 +++++++ .../src/main/java/chat/berty/core/Logger.java | 67 +++++++++++++++++++ client/react-native/gomobile/Makefile | 1 - client/react-native/gomobile/core.go | 12 +--- client/react-native/gomobile/logger.go | 30 ++++----- 7 files changed, 130 insertions(+), 30 deletions(-) create mode 100644 client/react-native/android/app/src/main/java/chat/berty/core/Level.java create mode 100644 client/react-native/android/app/src/main/java/chat/berty/core/Logger.java diff --git a/client/react-native/Makefile b/client/react-native/Makefile index ec129e7e80..bf5b5f3611 100644 --- a/client/react-native/Makefile +++ b/client/react-native/Makefile @@ -53,6 +53,11 @@ deps.ios: deps .PHONY: deps.web deps.web: deps cd $(WEB) && yarn + +.PHONY: deps.logs +deps.logs: + brew install --HEAD pidcat + ############################## @@ -82,6 +87,19 @@ debug.web: deps.web ############################## +### Logs part ### +.PHONY: log.android +log.android: + @(command -v pidcat > /dev/null && pidcat --always-display-tags -t chat.berty.*) || \ + (echo "Consider to install pidcat (brew install pidcat) for a better logging experience" && sleep 2 && adb logcat) + +.PHONY: log.ios +log.ios: + @open '/Applications/Utilities/Console.app' + +############################## + + ### Clean dependencies part ### .PHONY: clean.bundler_and_pkgs clean.bundler_and_pkgs: diff --git a/client/react-native/android/app/src/main/java/chat/berty/core/CoreModule.java b/client/react-native/android/app/src/main/java/chat/berty/core/CoreModule.java index cf7f7c4d9c..cfc6ce9874 100644 --- a/client/react-native/android/app/src/main/java/chat/berty/core/CoreModule.java +++ b/client/react-native/android/app/src/main/java/chat/berty/core/CoreModule.java @@ -8,7 +8,7 @@ import core.Core; public class CoreModule extends ReactContextBaseJavaModule { - + private Logger logger = new Logger("chat.berty.io"); private String filesDir = ""; private ReactApplicationContext reactContext; @@ -23,11 +23,12 @@ public String getName() { } @ReactMethod - public void start(Promise promise) { + public void start(Promise promise) throws Exception { try { - Core.start(this.filesDir); + Core.start(this.filesDir, this.logger); promise.resolve(null); } catch (Exception err) { + this.logger.format(Level.ERROR, this.getName(), "Unable to start core: %s", err); promise.reject(err); } } @@ -38,6 +39,7 @@ public void getPort(Promise promise) { Long port = Core.getPort(); promise.resolve(port.toString()); } catch (Exception err) { + this.logger.format(Level.ERROR, this.getName(), "Unable to get port", err); promise.reject(err); } } diff --git a/client/react-native/android/app/src/main/java/chat/berty/core/Level.java b/client/react-native/android/app/src/main/java/chat/berty/core/Level.java new file mode 100644 index 0000000000..60e762a5c2 --- /dev/null +++ b/client/react-native/android/app/src/main/java/chat/berty/core/Level.java @@ -0,0 +1,24 @@ +package chat.berty.core; + +public enum Level +{ + DEBUG("DEBUG"), + INFO("INFO"), + WARN("WARN"), + ERROR("ERROR"), + PANIC("PANIC"), + DPANIC("DPANIC"), + FATAL("FATAL"), + UNKNOW("UNKNOW"); + + private final String level; + + Level(final String level) { + this.level = level; + } + + @Override + public String toString() { + return level; + } +} diff --git a/client/react-native/android/app/src/main/java/chat/berty/core/Logger.java b/client/react-native/android/app/src/main/java/chat/berty/core/Logger.java new file mode 100644 index 0000000000..f57b2148cf --- /dev/null +++ b/client/react-native/android/app/src/main/java/chat/berty/core/Logger.java @@ -0,0 +1,67 @@ +package chat.berty.core; + +import android.util.Log; + +public class Logger implements core.Logger { + boolean isEnabled = true; + String subsytem = "logger"; + + public Logger(String subsytem) { + this.subsytem = subsytem; + } + + // @TODO: implement this + @Override + public boolean levelEnabler(String level) { + return this.isEnabled; + } + + public void format(Level level, String namespace, String format, Object... args) { + final String message = String.format(format, args); + try { + this.log(level.toString(), namespace, message); + } catch (Exception e) { + final String tag = this.subsytem + "." + namespace; + Log.e(tag, "Unable to use logger: " + e.getMessage()); + Log.e(tag, message); + } + } + + @Override + public void log(String level, String namespace, String message) throws Exception { + final Level currentLevel = Level.valueOf(level); + final String tag = this.subsytem + "." + namespace; + + switch(currentLevel) { + case DEBUG: + Log.d(tag, message); + break; + case INFO: + Log.i(tag, message); + break; + case WARN: + Log.w(tag, message); + break; + case ERROR: + Log.e(tag, message); + break; + case PANIC: + Log.wtf(tag, message); + break; + case DPANIC: + Log.wtf(tag, message); + break; + case FATAL: + Log.wtf(tag, message); + break; + case UNKNOW: + Log.i(tag, message); + break; + default: + Log.i(tag, message); + break; + + + } + } +} diff --git a/client/react-native/gomobile/Makefile b/client/react-native/gomobile/Makefile index f0808a0a09..77c8a0fff5 100644 --- a/client/react-native/gomobile/Makefile +++ b/client/react-native/gomobile/Makefile @@ -39,7 +39,6 @@ deps: patch -N ~/go/src/golang.org/x/mobile/cmd/gomobile/env.go $(BUILD_PATCH_PATH)/gomobile-env-flag.diff || true go install golang.org/x/mobile/cmd/gomobile go get -v golang.org/x/mobile/cmd/gobind - gomobile init .PHONY: init init: deps diff --git a/client/react-native/gomobile/core.go b/client/react-native/gomobile/core.go index 57a6e3f9bf..b04a3f725b 100644 --- a/client/react-native/gomobile/core.go +++ b/client/react-native/gomobile/core.go @@ -82,19 +82,11 @@ func Start(datastorePath string, logger Logger) error { return nil } + // initialize logger if err := setupLogger("debug", logger); err != nil { return err } - // // initialize logger - // cfg := zap.NewDevelopmentConfig() - // cfg.Level.SetLevel(zap.DebugLevel) - // l, err := cfg.Build() - // if err != nil { - // panic(err) - // } - // zap.ReplaceGlobals(l) - if err := setGqlPort(); err != nil { return err } @@ -185,7 +177,7 @@ func daemon(opts *daemonOptions) error { } if addr.IP == nil { - addr.IP = net.IP{127, 0, 0, 1} + addr.IP = net.IP{0, 0, 0, 0} } listener, err := reuse.Listen(addr.Network(), fmt.Sprintf("%s:%d", addr.IP.String(), addr.Port)) diff --git a/client/react-native/gomobile/logger.go b/client/react-native/gomobile/logger.go index 8a9009a739..06fb438587 100644 --- a/client/react-native/gomobile/logger.go +++ b/client/react-native/gomobile/logger.go @@ -33,21 +33,12 @@ func (mc *mobileCore) Check(entry zapcore.Entry, checked *zapcore.CheckedEntry) } func (mc *mobileCore) Write(entry zapcore.Entry, fields []zapcore.Field) error { - var out string - - out = entry.Message - if len(fields) > 0 { - out += ": { " - for i, f := range fields { - out += f.Key + ": " + f.String - if i < len(fields)-1 { - out += ", " - } - } - out += " }" + buff, err := mc.enc.EncodeEntry(entry, fields) + if err != nil { + return err } - return mc.l.Log(entry.Level.CapitalString(), entry.LoggerName, out) + return mc.l.Log(entry.Level.CapitalString(), entry.LoggerName, buff.String()) } type p2pLogBackendWrapper struct { @@ -107,18 +98,25 @@ func setupLogger(logLevel string, mlogger Logger) error { config := zap.NewDevelopmentConfig() config.Level.SetLevel(zapLogLevel) config.DisableStacktrace = true - config.EncoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder + + // configure log encoder + // disable unwanted info + config.EncoderConfig.LevelKey = "" + config.EncoderConfig.TimeKey = "" + config.EncoderConfig.NameKey = "" + config.EncoderConfig.CallerKey = "" + l, err := config.Build() if err != nil { return err } consoleEncoder := zapcore.NewConsoleEncoder(config.EncoderConfig) - mobile := zap.WrapCore(func(core zapcore.Core) zapcore.Core { + mobileCore := zap.WrapCore(func(core zapcore.Core) zapcore.Core { return newMobileCore(core, consoleEncoder, mlogger) }) - zap.ReplaceGlobals(l.WithOptions(mobile)) + zap.ReplaceGlobals(l.WithOptions(mobileCore)) logger().Debug("logger initialized") // configure p2p log