Skip to content

Commit 781f0ab

Browse files
0xkelvinappflowy
andauthored
feat: propagate log from flutter to rust backend (#1723)
* feat: draft commit for getting guidance on send log to backend issue * feat: modify according to guidance * feat: add tracing dependencies * feat: continue implement for sending log to backend * fix: compile errors * feat: remove un-necessary code --------- Co-authored-by: nathan <[email protected]>
1 parent 5004729 commit 781f0ab

File tree

9 files changed

+89
-10
lines changed

9 files changed

+89
-10
lines changed

frontend/app_flowy/linux/flutter/dart_ffi/binding.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,6 @@ const uint8_t *sync_event(const uint8_t *input, uintptr_t len);
1111

1212
int32_t set_stream_port(int64_t port);
1313

14-
void link_me_please(void);
14+
void link_me_please(void);
15+
16+
void backend_log(int64_t level, const char *data);

frontend/app_flowy/packages/appflowy_backend/lib/ffi.dart

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,3 +133,21 @@ typedef _store_dart_post_cobject_C = Void Function(
133133
typedef _store_dart_post_cobject_Dart = void Function(
134134
Pointer<NativeFunction<Int8 Function(Int64, Pointer<Dart_CObject>)>> ptr,
135135
);
136+
137+
void log(
138+
int level,
139+
Pointer<ffi.Utf8> data,
140+
) {
141+
_invoke_log(level, data);
142+
}
143+
144+
final _invoke_log_Dart _invoke_log = _dart_ffi_lib
145+
.lookupFunction<_invoke_log_C, _invoke_log_Dart>('backend_log');
146+
typedef _invoke_log_C = Void Function(
147+
Int64 level,
148+
Pointer<ffi.Utf8> data,
149+
);
150+
typedef _invoke_log_Dart = void Function(
151+
int level,
152+
Pointer<ffi.Utf8>,
153+
);
Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
// ignore: import_of_legacy_library_into_null_safe
2+
import 'dart:ffi';
3+
4+
import 'package:flutter/foundation.dart';
25
import 'package:logger/logger.dart';
6+
import 'package:ffi/ffi.dart' as ffi;
7+
import 'ffi.dart';
38

49
class Log {
510
static final shared = Log();
@@ -9,7 +14,8 @@ class Log {
914
_logger = Logger(
1015
printer: PrettyPrinter(
1116
methodCount: 2, // number of method calls to be displayed
12-
errorMethodCount: 8, // number of method calls if stacktrace is provided
17+
errorMethodCount:
18+
8, // number of method calls if stacktrace is provided
1319
lineLength: 120, // width of the output
1420
colors: true, // Colorful log messages
1521
printEmojis: true, // Print an emoji for each log message
@@ -19,22 +25,50 @@ class Log {
1925
}
2026

2127
static void info(dynamic msg) {
22-
Log.shared._logger.i(msg);
28+
if (isReleaseVersion()) {
29+
log(0, toNativeUtf8(msg));
30+
} else {
31+
Log.shared._logger.i(msg);
32+
}
2333
}
2434

2535
static void debug(dynamic msg) {
26-
Log.shared._logger.d(msg);
36+
if (isReleaseVersion()) {
37+
log(1, toNativeUtf8(msg));
38+
} else {
39+
Log.shared._logger.d(msg);
40+
}
2741
}
2842

2943
static void warn(dynamic msg) {
30-
Log.shared._logger.w(msg);
44+
if (isReleaseVersion()) {
45+
log(3, toNativeUtf8(msg));
46+
} else {
47+
Log.shared._logger.w(msg);
48+
}
3149
}
3250

3351
static void trace(dynamic msg) {
34-
Log.shared._logger.v(msg);
52+
if (isReleaseVersion()) {
53+
log(2, toNativeUtf8(msg));
54+
} else {
55+
Log.shared._logger.v(msg);
56+
}
3557
}
3658

3759
static void error(dynamic msg) {
38-
Log.shared._logger.e(msg);
60+
if (isReleaseVersion()) {
61+
log(4, toNativeUtf8(msg));
62+
} else {
63+
Log.shared._logger.e(msg);
64+
}
3965
}
4066
}
67+
68+
bool isReleaseVersion() {
69+
return kReleaseMode;
70+
}
71+
72+
Pointer<ffi.Utf8> toNativeUtf8(dynamic msg) {
73+
return "$msg".toNativeUtf8();
74+
}

frontend/app_flowy/packages/appflowy_backend/linux/Classes/binding.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,6 @@ const uint8_t *sync_command(const uint8_t *input, uintptr_t len);
1212

1313
int32_t set_stream_port(int64_t port);
1414

15-
void link_me_please(void);
15+
void link_me_please(void);
16+
17+
void backend_log(int64_t level, const char *data);

frontend/app_flowy/packages/appflowy_backend/macos/Classes/binding.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,6 @@ const uint8_t *sync_event(const uint8_t *input, uintptr_t len);
1111

1212
int32_t set_stream_port(int64_t port);
1313

14-
void link_me_please(void);
14+
void link_me_please(void);
15+
16+
void backend_log(int64_t level, const char *data);

frontend/rust-lib/Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

frontend/rust-lib/dart-ffi/Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ bytes = { version = "1.0" }
2323
crossbeam-utils = "0.8.7"
2424
lazy_static = "1.4.0"
2525
parking_lot = "0.12.1"
26+
tracing = { version = "0.1", features = ["log"] }
27+
2628

2729
lib-dispatch = { path = "../lib-dispatch" }
2830
flowy-core = { path = "../flowy-core" }

frontend/rust-lib/dart-ffi/binding.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,6 @@ const uint8_t *sync_event(const uint8_t *input, uintptr_t len);
1111

1212
int32_t set_stream_port(int64_t port);
1313

14-
void link_me_please(void);
14+
void link_me_please(void);
15+
16+
void backend_log(int64_t level, const char *data);

frontend/rust-lib/dart-ffi/src/lib.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,3 +111,19 @@ async fn post_to_flutter(response: AFPluginEventResponse, port: i64) {
111111
}
112112
}
113113
}
114+
115+
#[no_mangle]
116+
pub extern "C" fn backend_log(level: i64, data: *const c_char) {
117+
let c_str = unsafe { CStr::from_ptr(data) };
118+
let log_str = c_str.to_str().unwrap();
119+
120+
// Don't change the mapping relation between number and level
121+
match level {
122+
0 => tracing::info!("{}", log_str),
123+
1 => tracing::debug!("{}", log_str),
124+
2 => tracing::trace!("{}", log_str),
125+
3 => tracing::warn!("{}", log_str),
126+
4 => tracing::error!("{}", log_str),
127+
_ => (),
128+
}
129+
}

0 commit comments

Comments
 (0)