lib/utils/log_util.dart (119 lines of code) (raw):

// Created with Android Studio // User:keria // Date:2021/6/29 // Email:runchen.brc@alibaba-inc.com // Reference:A utility class for logging messages with different levels. import 'package:flutter/foundation.dart'; /// 回调函数类型定义 typedef LogCallback = void Function( LogLevel level, String tag, String message, ); /// 日志工具类 /// /// A utility class for logging. class LogUtil { /// 默认日志标签 static const String _defaultTag = "AliPlayerWidget"; /// 是否开启调试模式 static bool _debuggable = kDebugMode; /// 当前日志标签 static String _currentTag = _defaultTag; /// 当前日志级别 static LogLevel _logLevel = LogLevel.verbose; /// 日志级别简写映射表 static const Map<LogLevel, String> _levelShortcuts = { LogLevel.verbose: "[V]", LogLevel.debug: "[D]", LogLevel.info: "[I]", LogLevel.warn: "[W]", LogLevel.error: "[E]", }; /// 缓存的时间戳 static String _cachedTimestamp = ""; /// 上次更新时间戳的时间 static int _lastTimestampUpdate = 0; /// 回调函数列表 static final List<LogCallback> _callbacks = []; // 私有构造函数,防止实例化 LogUtil._(); /// 初始化日志工具类 /// /// Initializes the log utility with optional debug mode, tag, and log level. /// This method can only be called once. static void init({ bool isDebug = false, String tag = _defaultTag, LogLevel level = LogLevel.verbose, }) { _debuggable = isDebug; _currentTag = tag.isEmpty ? _defaultTag : tag; _logLevel = level; } /// 注册日志回调函数 /// /// Registers a callback function to receive logs of specified levels. static void registerCallback(LogCallback callback) { if (!_callbacks.contains(callback)) { _callbacks.add(callback); } } /// 移除日志回调函数 /// /// Removes a previously registered callback function. static void unregisterCallback(LogCallback callback) { _callbacks.remove(callback); } /// 移除所有日志回调函数 /// /// Removes all previously registered callback functions. static void unregisterAllCallbacks() { _callbacks.clear(); } /// 打印日志 /// /// Prints a log message with the specified log level and tag. static void log(LogLevel level, Object object, {String tag = _defaultTag}) { if (!_debuggable || level.index < _logLevel.index) return; final logTag = tag.isEmpty ? _currentTag : tag; final timestamp = getCachedTimestamp(); final levelShortcut = _levelShortcuts[level] ?? "[X]"; // 默认未知级别为 [X] String msg; if (levelShortcut == "[X]") { // 如果是未知级别,生成警告日志 msg = "[$timestamp] [WARN] $logTag:-> Unknown log level encountered."; debugPrint(msg); // 调用回调函数,使用 LogLevel.warn 级别 for (final callback in _callbacks) { callback(LogLevel.warn, logTag, msg); } return; // 直接返回,不再继续处理 } // 正常日志处理 msg = "[$timestamp] $levelShortcut $logTag:-> $object"; debugPrint(msg); // 调用回调函数 for (final callback in _callbacks) { callback(level, logTag, msg); } } /// 获取格式化后的时间戳(带缓存) /// /// Returns a cached timestamp updated every 100 milliseconds. static String getCachedTimestamp() { final now = DateTime.now().millisecondsSinceEpoch; if (now - _lastTimestampUpdate > 100) { // 每 100 毫秒更新一次 _cachedTimestamp = getFormattedTimestamp(); _lastTimestampUpdate = now; } return _cachedTimestamp; } /// 获取格式化后的时间戳 /// /// Get the formatted timestamp in the format "YYYY-MM-DD HH:mm:ss.SSS". static String getFormattedTimestamp() { final now = DateTime.now(); final year = now.year.toString().padLeft(4, '0'); final month = now.month.toString().padLeft(2, '0'); final day = now.day.toString().padLeft(2, '0'); final hour = now.hour.toString().padLeft(2, '0'); final minute = now.minute.toString().padLeft(2, '0'); final second = now.second.toString().padLeft(2, '0'); final millisecond = now.millisecond.toString().padLeft(3, '0'); return "$year-$month-$day $hour:$minute:$second.$millisecond"; } /// 打印 Verbose 级别日志 static void v(Object object, {String tag = _defaultTag}) { log(LogLevel.verbose, object, tag: tag); } /// 打印 Debug 级别日志 static void d(Object object, {String tag = _defaultTag}) { log(LogLevel.debug, object, tag: tag); } /// 打印 Info 级别日志 static void i(Object object, {String tag = _defaultTag}) { log(LogLevel.info, object, tag: tag); } /// 打印 Warn 级别日志 static void w(Object object, {String tag = _defaultTag}) { log(LogLevel.warn, object, tag: tag); } /// 打印 Error 级别日志 static void e(Object object, {String tag = _defaultTag}) { log(LogLevel.error, object, tag: tag); } } /// 打印 Verbose 级别日志 void logv(Object object, {String tag = LogUtil._defaultTag}) { LogUtil.v(object, tag: tag); } /// 打印 Debug 级别日志 void logd(Object object, {String tag = LogUtil._defaultTag}) { LogUtil.d(object, tag: tag); } /// 打印 Info 级别日志 void logi(Object object, {String tag = LogUtil._defaultTag}) { LogUtil.i(object, tag: tag); } /// 打印 Warn 级别日志 void logw(Object object, {String tag = LogUtil._defaultTag}) { LogUtil.w(object, tag: tag); } /// 打印 Error 级别日志 void loge(Object object, {String tag = LogUtil._defaultTag}) { LogUtil.e(object, tag: tag); } /// 日志级别枚举 /// /// An enumeration representing different log levels. enum LogLevel { verbose, // 最详细的日志 debug, // 调试信息 info, // 普通信息 warn, // 警告信息 error, // 错误信息 }