Skip to content

Commit

Permalink
refactor: move some simple logs to native
Browse files Browse the repository at this point in the history
  • Loading branch information
Yesterday17 committed Aug 24, 2024
1 parent b973f7a commit 0940a78
Show file tree
Hide file tree
Showing 14 changed files with 380 additions and 128 deletions.
19 changes: 17 additions & 2 deletions lib/native/api/logging.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,23 @@ import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart';
void initLogger({required String path}) =>
RustLib.instance.api.crateApiLoggingInitLogger(path: path);

Future<List<LogEntry>> readLogs({required String path}) =>
RustLib.instance.api.crateApiLoggingReadLogs(path: path);
Future<List<LogEntry>> readLogs() =>
RustLib.instance.api.crateApiLoggingReadLogs();

void logNative(
{required String level,
String? module,
String? file,
int? line,
required String message,
String? stacktace}) =>
RustLib.instance.api.crateApiLoggingLogNative(
level: level,
module: module,
file: file,
line: line,
message: message,
stacktace: stacktace);

class LogEntry {
final String time;
Expand Down
156 changes: 121 additions & 35 deletions lib/native/frb_generated.dart

Large diffs are not rendered by default.

18 changes: 18 additions & 0 deletions lib/native/frb_generated.io.dart
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,9 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
NativePreferenceStore dco_decode_box_autoadd_native_preference_store(
dynamic raw);

@protected
int dco_decode_box_autoadd_u_32(dynamic raw);

@protected
double dco_decode_f_32(dynamic raw);

Expand Down Expand Up @@ -134,6 +137,9 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
@protected
int? dco_decode_opt_box_autoadd_i_32(dynamic raw);

@protected
int? dco_decode_opt_box_autoadd_u_32(dynamic raw);

@protected
PlayerStateEvent dco_decode_player_state_event(dynamic raw);

Expand Down Expand Up @@ -214,6 +220,9 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
NativePreferenceStore sse_decode_box_autoadd_native_preference_store(
SseDeserializer deserializer);

@protected
int sse_decode_box_autoadd_u_32(SseDeserializer deserializer);

@protected
double sse_decode_f_32(SseDeserializer deserializer);

Expand Down Expand Up @@ -257,6 +266,9 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
@protected
int? sse_decode_opt_box_autoadd_i_32(SseDeserializer deserializer);

@protected
int? sse_decode_opt_box_autoadd_u_32(SseDeserializer deserializer);

@protected
PlayerStateEvent sse_decode_player_state_event(SseDeserializer deserializer);

Expand Down Expand Up @@ -339,6 +351,9 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
void sse_encode_box_autoadd_native_preference_store(
NativePreferenceStore self, SseSerializer serializer);

@protected
void sse_encode_box_autoadd_u_32(int self, SseSerializer serializer);

@protected
void sse_encode_f_32(double self, SseSerializer serializer);

Expand Down Expand Up @@ -383,6 +398,9 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
@protected
void sse_encode_opt_box_autoadd_i_32(int? self, SseSerializer serializer);

@protected
void sse_encode_opt_box_autoadd_u_32(int? self, SseSerializer serializer);

@protected
void sse_encode_player_state_event(
PlayerStateEvent self, SseSerializer serializer);
Expand Down
9 changes: 5 additions & 4 deletions lib/services/annil/annil.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import 'package:annix/providers.dart';
import 'package:annix/services/anniv/anniv_model.dart';
import 'package:annix/services/annil/cache.dart';
import 'package:annix/services/local/database.dart';
import 'package:annix/services/logger.dart';
import 'package:annix/services/path.dart';
import 'package:annix/services/playback/playback_service.dart';
import 'package:annix/utils/redirect_interceptor.dart';
Expand Down Expand Up @@ -42,7 +43,7 @@ class AnnilService extends ChangeNotifier {

client.interceptors.add(RetryInterceptor(
dio: client,
logPrint: (final text) => FLog.error(text: text),
logPrint: (final text) => Logger.error(text),
retries: 3,
retryDelays: const [
Duration(seconds: 1),
Expand Down Expand Up @@ -337,8 +338,8 @@ class AnnilService extends ChangeNotifier {
),
);
final newETag = response.headers['etag']![0];
FLog.debug(
text: 'Annil cache MISSED, old etag: $etag, new etag: $newETag',
Logger.debug(
'Annil cache MISSED, old etag: $etag, new etag: $newETag',
);
if (etag != newETag) {
etags[server.id] = newETag;
Expand All @@ -361,7 +362,7 @@ class AnnilService extends ChangeNotifier {
}
} on DioException catch (e) {
if (e.response?.statusCode == 304) {
FLog.trace(text: 'Annil cache HIT, etag: $etag');
Logger.trace('Annil cache HIT, etag: $etag');
} else {
etags.remove(server.id);
await db.transaction(() async {
Expand Down
5 changes: 3 additions & 2 deletions lib/services/audio_handler.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import 'dart:io';
import 'package:annix/providers.dart';
import 'package:annix/services/anniv/anniv.dart';
import 'package:annix/services/anniv/anniv_model.dart';
import 'package:annix/services/logger.dart';
import 'package:annix/services/playback/playback.dart';
import 'package:annix/services/local/database.dart';
import 'package:audio_service/audio_service.dart';
Expand Down Expand Up @@ -53,7 +54,7 @@ class AnnixAudioHandler extends BaseAudioHandler {
// interruption
session.interruptionEventStream.listen((final event) {
if (event.begin) {
FLog.info(text: 'handling interruption beginning ${event.type}');
Logger.info('handling interruption beginning ${event.type}');
switch (event.type) {
case AudioInterruptionType.duck:
// TODO
Expand All @@ -65,7 +66,7 @@ class AnnixAudioHandler extends BaseAudioHandler {
break;
}
} else {
FLog.info(text: 'handling interruption end ${event.type}');
Logger.info('handling interruption end ${event.type}');
switch (event.type) {
case AudioInterruptionType.duck:
// TODO
Expand Down
19 changes: 19 additions & 0 deletions lib/services/logger.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import 'package:annix/native/api/logging.dart';

class Logger {
static void error(String message) {
logNative(level: 'ERROR', message: message);
}

static void info(String message) {
logNative(level: 'INFO', message: message);
}

static void debug(String message) {
logNative(level: 'DEBUG', message: message);
}

static void trace(String message) {
logNative(level: 'TRACE', message: message);
}
}
12 changes: 6 additions & 6 deletions lib/services/playback/playback_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@ import 'package:annix/services/annil/audio_source.dart';
import 'package:annix/services/annil/annil.dart';
import 'package:annix/services/anniv/anniv.dart';
import 'package:annix/services/anniv/anniv_model.dart';
import 'package:annix/services/logger.dart';
import 'package:annix/services/metadata/metadata_model.dart';
import 'package:annix/services/path.dart';
import 'package:annix/services/playback/playback.dart';
import 'package:annix/native/api/player.dart';
import 'package:audio_session/audio_session.dart' hide AVAudioSessionCategory;
import 'package:f_logs/f_logs.dart';
import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';

Expand Down Expand Up @@ -149,7 +149,7 @@ class PlaybackService extends ChangeNotifier {
}

if (!reload && !PlaybackService.player.isPlaying()) {
FLog.trace(text: 'Resume playing');
Logger.trace('Resume playing');
await PlaybackService.player.play();

if (loadedAndPaused) {
Expand All @@ -166,7 +166,7 @@ class PlaybackService extends ChangeNotifier {
}

// stop previous playback
FLog.trace(text: 'Start playing');
Logger.trace('Start playing');
await stop(false);

// TODO: move annil logic to rust and remove the workaround
Expand All @@ -192,7 +192,7 @@ class PlaybackService extends ChangeNotifier {
}

Future<void> pause() async {
FLog.trace(text: 'Pause playing');
Logger.trace('Pause playing');

await PlaybackService.player.pause();
// deactivate audio session
Expand Down Expand Up @@ -281,7 +281,7 @@ class PlaybackService extends ChangeNotifier {
}

Future<void> seek(final Duration position) async {
FLog.trace(text: 'Seek to position $position');
Logger.trace('Seek to position $position');

// seek first for ui update
playing.updatePosition(position);
Expand All @@ -307,7 +307,7 @@ class PlaybackService extends ChangeNotifier {
}

Future<void> jump(final int index) async {
FLog.trace(text: 'Jump to $index in playing queue');
Logger.trace('Jump to $index in playing queue');
if (queue.isNotEmpty) {
final to = index % queue.length;
if (to != playingIndex) {
Expand Down
4 changes: 3 additions & 1 deletion lib/ui/page/home/home_action_grid.dart
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,9 @@ class HomeActionGrid extends ConsumerWidget {
showLoadingDialog(context);
ref.read(playbackProvider).fullShuffleMode().then(
(final value) {
Navigator.of(context, rootNavigator: true).pop();
if (context.mounted) {
Navigator.of(context, rootNavigator: true).pop();
}
},
);
},
Expand Down
1 change: 0 additions & 1 deletion lib/ui/page/search.dart
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,6 @@ class _SearchResultWidget extends HookConsumerWidget {
final ValueNotifier<bool> isLoading;

const _SearchResultWidget({
super.key,
required this.result,
required this.isLoading,
});
Expand Down
4 changes: 1 addition & 3 deletions lib/ui/page/settings/settings_log.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import 'package:annix/native/api/logging.dart';
import 'package:annix/services/path.dart';
import 'package:annix/ui/route/delegate.dart';
import 'package:f_logs/f_logs.dart';
import 'package:flutter/material.dart';
Expand Down Expand Up @@ -110,8 +109,7 @@ class SettingsLogView extends HookConsumerWidget {
},
)
: FutureBuilder<List<LogEntry>>(
future: readLogs(path: logPath())
.then((logs) => logs.reversed.toList()),
future: readLogs().then((logs) => logs.reversed.toList()),
builder: (final context, final snapshot) {
if (snapshot.hasData) {
return ListView.builder(
Expand Down
3 changes: 1 addition & 2 deletions rust/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 4 additions & 1 deletion rust/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,10 @@ cpal = { version = "0.15.3", features = ["oboe-shared-stdcxx"] }
rand = "0.8.5"
material-colors = { version = "0.3.3", features = ["image"] }

tracing-subscriber-sqlite = { version = "0.1", features = ["tracing-log"] }
# TODO: upgrade version
tracing-subscriber-sqlite = { git = "https://github.com/ProjectAnni/tracing-subscriber-sqlite", features = [
"tracing-log",
], rev = "42e79729fae0cb2803b8b9cebb01b039d30f0c9a" }
tracing = "0.1.40"
tracing-log = "0.2"

Expand Down
83 changes: 56 additions & 27 deletions rust/src/api/logging.rs
Original file line number Diff line number Diff line change
@@ -1,25 +1,37 @@
use std::collections::HashMap;

use flutter_rust_bridge::frb;
use once_cell::sync::OnceCell;
use rusqlite::Connection;
use rusqlite::Result;
use tracing::level_filters::LevelFilter;
pub use tracing_subscriber_sqlite::LogEntry;
use tracing_subscriber_sqlite::LogHandle;

static LOGGER: OnceCell<LogHandle> = OnceCell::new();

#[frb(sync)]
pub fn init_logger(path: String) {
let conn = Connection::open(path).unwrap();
LOGGER.get_or_init(|| {
let conn = Connection::open(path).unwrap();

tracing_log::LogTracer::init().unwrap();
tracing::subscriber::set_global_default(
tracing_subscriber_sqlite::SubscriberBuilder::new()
let subscriber = tracing_subscriber_sqlite::SubscriberBuilder::new()
.with_max_level(LevelFilter::DEBUG)
.with_black_list(["h2"])
.build_prepared(conn)
.unwrap(),
)
.unwrap();
.unwrap();

let logger = subscriber.log_handle();
tracing::subscriber::set_global_default(subscriber).unwrap();

tracing_log::LogTracer::init().unwrap();

logger
});
}

#[derive(Debug)]
pub struct LogEntry {
#[frb(mirror(LogEntry))]
pub struct _LogEntry {
pub time: String,
pub level: String,
pub module: Option<String>,
Expand All @@ -29,22 +41,39 @@ pub struct LogEntry {
pub structured: String,
}

pub fn read_logs(path: String) -> Result<Vec<LogEntry>> {
let conn = Connection::open(path)?;

let mut stmt = conn.prepare("SELECT * FROM logs_v0")?;
let log_iter = stmt.query_map([], |row| {
Ok(LogEntry {
time: row.get(0)?,
level: row.get(1)?,
module: row.get(2)?,
file: row.get(3)?,
line: row.get(4)?,
message: row.get(5)?,
structured: row.get(6)?,
})
})?;

let logs: Result<Vec<LogEntry>> = log_iter.collect();
logs
pub fn read_logs() -> anyhow::Result<Vec<LogEntry>> {
let handle = LOGGER
.get()
.ok_or_else(|| anyhow::anyhow!("Logger not initialized"))?;
let logs = handle.read_logs_v0()?;
Ok(logs)
}

#[frb(sync)]
pub fn log_native(
level: String,
module: Option<String>,
file: Option<String>,
line: Option<u32>,
message: String,
stacktace: Option<String>,
) -> anyhow::Result<()> {
let logger = LOGGER
.get()
.ok_or_else(|| anyhow::anyhow!("Logger not initialized"))?;

let mut kvs = HashMap::new();
if let Some(stacktace) = stacktace {
kvs.insert("stacktace", stacktace);
}

logger.log_v0(
&level,
module.as_deref(),
file.as_deref(),
line,
&message,
kvs,
);
Ok(())
}
Loading

0 comments on commit 0940a78

Please sign in to comment.