diff --git a/lib/bootstrap.dart b/lib/bootstrap.dart index 7398b845..89caf44b 100644 --- a/lib/bootstrap.dart +++ b/lib/bootstrap.dart @@ -4,7 +4,6 @@ import 'dart:io'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_displaymode/flutter_displaymode.dart'; -import 'package:flutter_loggy/flutter_loggy.dart'; import 'package:flutter_native_splash/flutter_native_splash.dart'; import 'package:hiddify/core/analytics/analytics_controller.dart'; import 'package:hiddify/core/app_info/app_info_provider.dart'; @@ -27,7 +26,6 @@ import 'package:hiddify/features/window/notifier/window_notifier.dart'; import 'package:hiddify/singbox/service/singbox_service_provider.dart'; import 'package:hiddify/utils/utils.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:loggy/loggy.dart'; import 'package:sentry_flutter/sentry_flutter.dart'; Future lazyBootstrap( @@ -36,8 +34,7 @@ Future lazyBootstrap( ) async { FlutterNativeSplash.preserve(widgetsBinding: widgetsBinding); - Loggy.initLoggy(logPrinter: const PrettyDeveloperPrinter()); - + LoggerController.preInit(); FlutterError.onError = Logger.logFlutterError; WidgetsBinding.instance.platformDispatcher.onError = Logger.logPlatformDispatcherError; diff --git a/lib/core/logger/custom_logger.dart b/lib/core/logger/custom_logger.dart index 181234cf..139eea87 100644 --- a/lib/core/logger/custom_logger.dart +++ b/lib/core/logger/custom_logger.dart @@ -1,7 +1,58 @@ +// ignore_for_file: avoid_print + import 'dart:io'; import 'package:loggy/loggy.dart'; +class ConsolePrinter extends LoggyPrinter { + const ConsolePrinter({ + this.showColors = false, + }); + + final bool showColors; + + static final _levelColors = { + LogLevel.debug: + AnsiColor(foregroundColor: AnsiColor.grey(0.5), italic: true), + LogLevel.info: AnsiColor(foregroundColor: 35), + LogLevel.warning: AnsiColor(foregroundColor: 214), + LogLevel.error: AnsiColor(foregroundColor: 196), + }; + + @override + void onLog(LogRecord record) { + final colorize = showColors && stdout.supportsAnsiEscapes; + final time = record.time.toIso8601String().split('T')[1]; + final callerFrame = record.callerFrame == null + ? ' ' + : ' (${record.callerFrame?.location}) '; + + final String logLevel; + if (colorize) { + logLevel = record.level.name.toUpperCase().padRight(8); + } else { + logLevel = "[${record.level.name.toUpperCase()}]".padRight(10); + } + + final color = + showColors ? levelColor(record.level) ?? AnsiColor() : AnsiColor(); + + print( + color( + '$time $logLevel [${record.loggerName}]$callerFrame${record.message}', + ), + ); + + if (record.stackTrace != null) { + print(record.stackTrace); + } + } + + AnsiColor? levelColor(LogLevel level) { + return _levelColors[level]; + } +} + class FileLogPrinter extends LoggyPrinter { FileLogPrinter( String filePath, { diff --git a/lib/core/logger/logger_controller.dart b/lib/core/logger/logger_controller.dart index 4594ef6a..9fa4f138 100644 --- a/lib/core/logger/logger_controller.dart +++ b/lib/core/logger/logger_controller.dart @@ -1,6 +1,5 @@ import 'dart:io'; -import 'package:flutter_loggy/flutter_loggy.dart'; import 'package:hiddify/core/logger/custom_logger.dart'; import 'package:hiddify/utils/custom_loggers.dart'; import 'package:loggy/loggy.dart'; @@ -18,9 +17,13 @@ class LoggerController extends LoggyPrinter with InfraLogger { static late LoggerController _instance; + static void preInit() { + Loggy.initLoggy(logPrinter: const ConsolePrinter()); + } + static void init(String appLogPath) { _instance = LoggerController( - const PrettyDeveloperPrinter(), + const ConsolePrinter(), {"app": FileLogPrinter(appLogPath)}, ); Loggy.initLoggy(logPrinter: _instance);