Skip to content

Commit

Permalink
feat: add js console log to native logger
Browse files Browse the repository at this point in the history
Signed-off-by: Guilhem Fanton <guilhem.fanton@gmail.com>
  • Loading branch information
gfanton committed Jun 9, 2020
1 parent 1677ed2 commit 28b1378
Show file tree
Hide file tree
Showing 11 changed files with 100 additions and 34 deletions.
10 changes: 3 additions & 7 deletions go/framework/bertybridge/bridge_protocol.go
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,7 @@ func newProtocolBridge(logger *zap.Logger, config *ProtocolConfig) (*Protocol, e
// register protocol service
var grpcServer *grpc.Server
{
grpcLogger := logger.Named("grpc.protocol")
grpcLogger := logger.Named("grpc")
// Define customfunc to handle panic
panicHandler := func(p interface{}) (err error) {
return status.Errorf(codes.Unknown, "panic recover: %v", p)
Expand All @@ -237,10 +237,6 @@ func newProtocolBridge(logger *zap.Logger, config *ProtocolConfig) (*Protocol, e
grpc_recovery.WithRecoveryHandler(panicHandler),
}

zapOpts := []grpc_zap.Option{
grpc_zap.WithLevels(grpcCodeToLevel),
}

// setup grpc with zap
grpc_zap.ReplaceGrpcLoggerV2(grpcLogger)

Expand All @@ -249,13 +245,13 @@ func newProtocolBridge(logger *zap.Logger, config *ProtocolConfig) (*Protocol, e
grpc_middleware.WithUnaryServerChain(
grpc_ctxtags.UnaryServerInterceptor(grpc_ctxtags.WithFieldExtractor(grpc_ctxtags.CodeGenRequestFieldExtractor)),

grpc_zap.UnaryServerInterceptor(grpcLogger, zapOpts...),
grpc_zap.UnaryServerInterceptor(grpcLogger),
grpc_recovery.UnaryServerInterceptor(recoverOpts...),
grpc_trace.UnaryServerInterceptor(trServer),
),
grpc_middleware.WithStreamServerChain(
grpc_ctxtags.StreamServerInterceptor(grpc_ctxtags.WithFieldExtractor(grpc_ctxtags.CodeGenRequestFieldExtractor)),
grpc_zap.StreamServerInterceptor(grpcLogger, zapOpts...),
grpc_zap.StreamServerInterceptor(grpcLogger),
grpc_recovery.StreamServerInterceptor(recoverOpts...),
grpc_trace.StreamServerInterceptor(trServer),
),
Expand Down
10 changes: 0 additions & 10 deletions go/framework/bertybridge/driver_logger.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,8 @@ import (
"fmt"
"os"

grpc_zap "github.com/grpc-ecosystem/go-grpc-middleware/logging/zap"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"google.golang.org/grpc/codes"
)

type NativeLoggerDriver interface {
Expand Down Expand Up @@ -106,11 +104,3 @@ func newNativeLogger(loglevel string, mlogger NativeLoggerDriver) (*zap.Logger,
logger.Info("logger initialized", zap.String("level", loglevel))
return logger, nil
}

func grpcCodeToLevel(code codes.Code) zapcore.Level {
if code == codes.OK {
// It is DEBUG
return zap.DebugLevel
}
return grpc_zap.DefaultCodeToLevel(code)
}
1 change: 0 additions & 1 deletion js/packages/berty-app/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
* https://github.com/facebook/react-native
*
* @format
* @flow
*/

import React from 'react'
Expand Down
10 changes: 9 additions & 1 deletion js/packages/berty-app/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,19 @@ import 'node-libs-react-native/globals'

import { Alert, AppRegistry } from 'react-native'
import App from './App'
import { BridgeConsole } from '@berty-tech/go-bridge'
import { name as appName } from './app.json'

if (!__DEV__) {
/* eslint-disable no-undef */
console.error = (error) => Alert.alert('Error', `${error}`)
console = {
...BridgeConsole,
error: (message: any, ...opts: any[]): void => {
BridgeConsole.error(message, ...opts)
Alert.alert('Error', `${message}`)
},
}

//console.warn = () => Alert.alert('Warn')
/* eslint-enable no-undef */
}
Expand Down
2 changes: 2 additions & 0 deletions js/packages/go-bridge/GoBridge.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ class NoopGoBirdge implements GoBridgeInterface {
return Promise.reject()
}

log() {}

getProtocolAddr() {
return Promise.reject()
}
Expand Down
8 changes: 7 additions & 1 deletion js/packages/go-bridge/index.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,15 @@
import GoBridge from './GoBridge'

import BridgeLogger from './logger'
const BridgeConsole = {
...console,
...BridgeLogger(GoBridge),
}

import { GoBridgeInterface, GoBridgeOpts, GoLogLevel } from './types'

export type { GoBridgeInterface, GoBridgeOpts }

export { GoLogLevel }
export { GoLogLevel, BridgeConsole }

export default GoBridge
2 changes: 2 additions & 0 deletions js/packages/go-bridge/ios/GoBridge.m
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ @interface RCT_EXTERN_REMAP_MODULE_2(GoBridge, GoBridge, NSObject)
resolve:(RCTPromiseResolveBlock)resolve
reject:(RCTPromiseRejectBlock)reject);

RCT_EXTERN_METHOD(log:(NSDictionary)opts);

RCT_EXTERN_METHOD(stopProtocol:(RCTPromiseResolveBlock)resolve
reject:(RCTPromiseRejectBlock)reject);

Expand Down
15 changes: 15 additions & 0 deletions js/packages/go-bridge/ios/GoBridge.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ import Bertybridge

@objc(GoBridge)
class GoBridge: NSObject {
static let rnlogger = LoggerDriver("tech.berty", "react")

// protocol
var bridgeProtocol: BertybridgeProtocol?
let rootdir: URL
Expand Down Expand Up @@ -40,6 +42,19 @@ class GoBridge: NSObject {
}
}

@objc func log(_ opts: NSDictionary) {
if let message = opts["message"] as? String {
let type = opts["level"] as? String ?? "info"

// set log level
let level = Level(rawValue: type.uppercased()) ?? Level.info

// log
GoBridge.rnlogger.print(message as NSString, level: level, category: "react-native")
}
}


//////////////
// Protocol //
//////////////
Expand Down
33 changes: 19 additions & 14 deletions js/packages/go-bridge/ios/LoggerDriver.swift
Original file line number Diff line number Diff line change
Expand Up @@ -61,19 +61,20 @@ class LoggerDriver: NSObject, BertybridgeNativeLoggerDriverProtocol {

var type: OSLogType
switch level {
// @FIXME(gfanton): on some device: debug log dont show up on the Console.
// for the moment, merge debug logs into info logs
// case Level.debug:
// type = .debug
case Level.info, Level.debug:
// @FIXME(gfanton): on some device: debug log dont show up on the Console.
// for the moment, use default type for debug
case Level.debug:
type = .default
case Level.info:
type = .info
case Level.warn, Level.error:
case Level.warn:
type = .error
case Level.dPanic, Level.panic, Level.fatal:
case Level.error, Level.dPanic, Level.panic, Level.fatal:
type = .fault
default:
type = OSLogType.default
type = .default
}

switch self.scope {
case Visibility.visible: os_log("[%{public}@] %{public}@", log: logger, type: type, ulevel, out)
case Visibility.hidden: os_log("[%{private}@] %{private}@", log: logger, type: type, ulevel, out)
Expand All @@ -84,12 +85,16 @@ class LoggerDriver: NSObject, BertybridgeNativeLoggerDriverProtocol {
}

func format(_ format: NSString, level: Level = Level.info, _ args: CVarArg...) {
let message = NSString(format: format, args) as String
do {
try self.log(level.rawValue, namespace: self.category, message: message)
} catch {
NSLog("[%@] [%@]: %@", level.rawValue, self.subsytem + ".log", message)
}
self.print(NSString(format: format, args), level: level)
}

func print(_ message: NSString, level: Level = Level.info, category: String? = nil) {
let namespace = category ?? self.category
do {
try self.log(level.rawValue, namespace: namespace, message: message as String)
} catch {
NSLog("[%@] [%@]: %@", level.rawValue, self.subsytem + ".log", message)
}
}

// @TODO: implement this
Expand Down
37 changes: 37 additions & 0 deletions js/packages/go-bridge/logger.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import { GoLogLevel, GoBridgeInterface } from './types'

const formatMessage = (...args: any[]): string =>
args
.map((e) => JSON.stringify(e))
.join(' ')
.replace(/\\"/g, '"')

const BridgeLogger = (bridge: GoBridgeInterface) => ({
log: (message?: any, ...opts: any[]): void =>
bridge.log({
level: GoLogLevel.debug,
message: formatMessage(message, ...opts),
}),
debug: (message?: any, ...opts: any[]): void =>
bridge.log({
level: GoLogLevel.debug,
message: formatMessage(message, ...opts),
}),
warn: (message?: any, ...opts: any[]): void =>
bridge.log({
level: GoLogLevel.warn,
message: formatMessage(message, ...opts),
}),
error: (message?: any, ...opts: any[]): void =>
bridge.log({
level: GoLogLevel.error,
message: formatMessage(message, ...opts),
}),
info: (message?: any, ...opts: any[]): void =>
bridge.log({
level: GoLogLevel.info,
message: formatMessage(message, ...opts),
}),
})

export default BridgeLogger
6 changes: 6 additions & 0 deletions js/packages/go-bridge/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,13 @@ export type GoBridgeOpts = {
tracing?: boolean
}

export type GoLoggerOpts = {
level: GoLogLevel
message: string
}

export interface GoBridgeInterface {
log(_: GoLoggerOpts): void
startProtocol(_: GoBridgeOpts): Promise<void>
stopProtocol(): Promise<void>
getProtocolAddr(): Promise<string>
Expand Down

0 comments on commit 28b1378

Please sign in to comment.