# LogMonitor **Repository Path**: yyf0502/LogMonitor ## Basic Information - **Project Name**: LogMonitor - **Description**: Android端日志监控,默认保存为文件,定时删除日志文件,自动按照大小清理 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-03-29 - **Last Updated**: 2025-10-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: Android, Java, 日志监控, 移动端 ## README # LogMonitor README ## 简介 `LogMonitor` 是一个**高性能、线程安全的 Android 日志管理系统**,支持将不同类型的日志存储到不同的子目录。它提供了完整的日志生命周期管理、性能优化和调试支持,适用于生产环境和开发调试。 ## ✨ 核心特性 ### 🔒 线程安全 - 使用 `ConcurrentHashMap` 和 `ReadWriteLock` 保证并发安全 - 支持多线程同时写入不同类型的日志 - 双重检查锁定避免重复初始化 ### 🚀 性能优化 - **异步日志写入**:支持 10000 容量的阻塞队列,显著提高高频日志场景性能 - **智能降级**:队列满时自动切换到同步模式 - **资源复用**:使用缓冲写入,减少 I/O 操作 ### 🛡️ 资源管理 - **自动关闭**:5 分钟无操作自动关闭日志文件 - **资源泄漏检测**:记录创建堆栈,方便定位泄漏源(调试模式) - **完整清理**:关闭时清理所有相关资源 ### 📊 调试与监控 - **日志统计**:实时统计每种类型的日志条数和字节数 - **状态监控**:查看系统运行状态、队列容量、活跃日志数 - **性能分析**:格式化显示运行时长、文件大小、吞吐量 ### 🗂️ 日志分类 - 支持 **70+ 种日志类型**,包括系统日志、网络日志、UI 交互日志、性能监控日志等 - 自动按类型分目录存储 - 按日期创建日志文件 ### 🧹 自动清理 - **按时间清理**:默认保留最近 3 天的日志 - **按大小清理**:单文件超过 200MB 自动重置,目录超过 1GB 清理旧文件 - **智能清理**:优先清理最旧的文件 ## 🎮 快速体验 Demo 本项目包含一个完整的 Demo 应用,展示所有功能和使用场景。 ### 运行 Demo ```bash # 克隆项目 git clone https://github.com/YOUR_USERNAME/LogMonitor.git cd LogMonitor # 构建并安装 ./gradlew installDebug # 或使用 Android Studio 直接运行 app 模块 ``` ### Demo 功能展示 Demo 应用包含以下功能演示: - ✅ **异步模式切换** - 实时开关异步日志,体验性能差异 - ✅ **资源泄漏检测** - 演示如何检测未关闭的日志文件 - ✅ **各类型日志** - 系统、网络、UI、性能等多种日志类型 - ✅ **批量写入测试** - 1000 条日志性能测试,对比同步/异步 - ✅ **统计信息展示** - 实时查看日志条数、文件大小、运行时长 - ✅ **资源管理** - 演示如何正确关闭日志文件 详细使用说明请查看 [app/DEMO_GUIDE.md](app/DEMO_GUIDE.md) --- ## 📖 使用方法 ### 1. 基础使用 ```java // 获取 LogMonitor 实例(单例模式) LogMonitor logger = LogMonitor.getInstance(context); // 记录日志 logger.log(LogType.SYSTEM, "系统启动成功"); logger.log(LogType.NETWORK, "NetworkManager", "连接成功"); // 关闭日志 logger.close(LogType.SYSTEM); logger.closeAll(); // 关闭所有日志 ``` ### 2. 启用高级功能 #### 异步日志写入(提高性能) ```java // 启用异步模式(推荐用于高频日志场景) logger.enableAsyncLogging(true); // 异步模式下,日志会进入队列,由后台线程处理 logger.log(LogType.PERFORMANCE, "帧率:60FPS"); // 不阻塞主线程 // 禁用异步(需要时) logger.enableAsyncLogging(false); ``` #### 资源泄漏检测(调试模式) ```java // 启用泄漏检测(建议在调试版本中使用) if (BuildConfig.DEBUG) { logger.enableLeakDetection(true); } // 检查是否有未关闭的资源 logger.checkLeaks(); // 会在 Logcat 中输出泄漏信息 ``` ### 3. 日志统计与监控 ```java // 获取整体统计信息 String stats = logger.getStatistics(); Log.i("LogMonitor", stats); // 输出示例: // ========== LogMonitor 统计信息 ========== // 运行时长: 2 小时 15 分钟 // 异步模式: 启用 // 队列剩余容量: 9850/10000 // 已打开的日志类型: 5 // // 各类型日志统计: // system: 1250 条, 156.80 KB // network: 3420 条, 512.45 KB // // 总计: 4670 条日志, 669.25 KB // ========================================== // 获取指定类型的统计 String systemStats = logger.getStatistics(LogType.SYSTEM); // 输出: [system] 状态: 打开, 日志数: 1250, 写入: 156.80 KB, 文件大小: 158.20 KB // 打印系统状态到 Logcat logger.dumpStatus(); // 重置统计信息 logger.resetStatistics(); ``` ### 4. 支持的日志类型 `LogMonitor` 支持 **70+ 种日志类型**,自动分类存储: | 分类 | 日志类型示例 | |------|------------| | **基础系统** | SYSTEM, SERVICE, PERFORMANCE, MEMORY, CPU, BATTERY, POWER, THERMAL 等 | | **用户交互** | UI, CLICK, LONG_PRESS, SCROLL, GESTURE, INPUT, TOUCH, SWIPE 等 | | **网络通信** | NETWORK, HTTP, SOCKET, MQTT, WEBSOCKET, DNS, WIFI, BLUETOOTH 等 | | **设备传感器** | GPS, SENSOR, CAMERA, MICROPHONE, SCREEN, GYROSCOPE, ACCELEROMETER 等 | | **音视频** | AUDIO, VIDEO, MEDIA, SCREENSHOT, SCREEN_RECORD, STREAMING, CAST 等 | | **存储数据** | DATABASE, FILE_IO, CACHE, CLOUD_STORAGE, DOWNLOAD, UPLOAD, BACKUP 等 | | **后台任务** | JOB, WORK_MANAGER, ALARM, BACKGROUND_TASK, ASYNC_TASK, THREAD_POOL 等 | | **调试开发** | DEBUG, TEST, ANR, MEMORY_LEAK, STRICT_MODE, FEATURE_FLAG 等 | 完整列表请查看源码中的 `LogType` 枚举。 ### 5. 配置参数 | 参数 | 默认值 | 说明 | |------|--------|------| | **最大日志文件大小** | 200MB | 单个日志文件超过此大小会自动重置 | | **最大目录大小** | 1GB | 目录超过此大小会清理旧文件 | | **日志保留天数** | 3 天 | 超过此天数的日志文件会被自动删除 | | **自动关闭超时** | 5 分钟 | 无操作后自动关闭日志文件 | | **异步队列容量** | 10000 条 | 异步模式下的日志队列大小 | ## 依赖和库导入 如果你使用的是 `Gradle`,可以通过以下方式添加依赖: #### 1. 在项目根目录的 `settings.gradle` 中添加 JitPack 仓库 ```gradle dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() mavenCentral() maven { url 'https://jitpack.io' } } } ``` #### 2. 在模块的 `build.gradle` 中添加 `LogMonitor` 依赖 ```gradle dependencies { implementation 'com.gitee.yyf0502:LogMonitor:v1.2.3' } ``` #### 3. 本地构建方式 如果你想直接使用源码或本地构建,可以: 1. 克隆项目到本地 2. 在你的项目 `settings.gradle` 中添加: ```gradle include ':logs' project(':logs').projectDir = new File('/path/to/LogMonitor/logs') ``` 3. 在模块的 `build.gradle` 中添加依赖: ```gradle dependencies { implementation project(':logs') } ``` --- ## 💡 完整示例 ```java public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); // 获取 LogMonitor 实例 LogMonitor logger = LogMonitor.getInstance(this); // 生产环境:启用异步模式提高性能 if (!BuildConfig.DEBUG) { logger.enableAsyncLogging(true); } // 调试环境:启用资源泄漏检测 if (BuildConfig.DEBUG) { logger.enableLeakDetection(true); } // 记录应用启动 logger.log(LogType.SYSTEM, "Application", "应用启动成功"); // 监听应用生命周期 registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() { @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { logger.log(LogType.UI, activity.getClass().getSimpleName(), "Activity 创建"); } @Override public void onActivityDestroyed(Activity activity) { logger.log(LogType.UI, activity.getClass().getSimpleName(), "Activity 销毁"); // 在调试模式检查资源泄漏 if (BuildConfig.DEBUG) { logger.checkLeaks(); } } // ... 其他生命周期方法 }); } @Override public void onTerminate() { super.onTerminate(); // 应用退出前打印统计信息 LogMonitor logger = LogMonitor.getInstance(this); Log.i("LogMonitor", logger.getStatistics()); // 关闭所有日志 logger.closeAll(); } } ``` ## ⚠️ 注意事项 1. **日志目录**:日志文件保存在 `Context.getExternalCacheDir()/padLogs/{类型}/` 目录下 2. **权限要求**:需要存储权限(Android 6.0+ 需要动态申请) 3. **线程安全**:所有 API 都是线程安全的,可以在任意线程调用 4. **资源管理**: - 建议在 Application 中初始化 - 在 `onTerminate()` 中调用 `closeAll()` - 启用自动关闭可以防止资源泄漏 5. **性能建议**: - 高频日志场景启用异步模式 - 调试模式才启用资源泄漏检测 - 定期查看统计信息优化日志策略 ## 📋 API 兼容性 - **最低 SDK 版本**:API 21 (Android 5.0) - **目标 SDK 版本**:API 33 (Android 13) - **编译 SDK 版本**:API 33 (Android 13) - **线程安全**:✅ 所有方法都是线程安全的 - **Kotlin 支持**:✅ 完全兼容 ## 🔄 版本历史 ### v2.0 (最新) - ✅ 完全重构,支持线程安全 - ✅ 新增异步日志写入(10000 条队列) - ✅ 新增资源泄漏检测 - ✅ 新增日志统计和监控功能 - ✅ 新增自动关闭机制(5分钟超时) - ✅ 优化性能,减少 I/O 操作 - ✅ 改进异常处理和参数校验 - ✅ 兼容 Android API 21+ - ✅ **新增完整 Demo 应用**,展示所有功能 ### v1.x - 基础日志功能 - 自动清理 - 日志分类 ## 🏗️ 项目架构 LogMonitor 采用模块化设计,职责清晰,易于维护和扩展: ``` LogMonitor/ ├── logs/ # 核心库模块 │ └── com.kmfc.logs/ │ ├── LogMonitor.java # 核心协调类,对外提供统一API │ ├── LogConfig.java # 配置管理类,集中管理所有配置常量 │ ├── LogStatistics.java # 统计管理类,负责日志计数和性能统计 │ ├── LogCleaner.java # 清理管理类,负责日志文件清理策略 │ ├── AsyncLogWriter.java # 异步写入类,管理异步队列和线程池 │ └── ResourceManager.java # 资源管理类,负责泄漏检测和自动关闭 │ └── app/ # Demo 示例应用 ├── MainActivity.java # 完整功能演示界面 ├── activity_main.xml # Material Design 界面布局 └── DEMO_GUIDE.md # 详细使用指南 ``` ### 模块职责说明 | 模块 | 职责 | 主要功能 | |-----|------|---------| | **LogConfig** | 配置管理 | 统一管理文件大小、清理天数、队列容量等配置 | | **LogStatistics** | 统计管理 | 统计日志条数、字节数、运行时长,提供格式化输出 | | **LogCleaner** | 清理管理 | 实现按时间、按大小的日志清理策略 | | **AsyncLogWriter** | 异步写入 | 管理 10000 容量队列和后台线程池 | | **ResourceManager** | 资源管理 | 资源泄漏检测、5 分钟超时自动关闭 | | **LogMonitor** | 核心协调 | 协调各模块工作,提供统一的外部API | ### 设计优势 - ✅ **单一职责**:每个类只负责一个明确的功能 - ✅ **易于测试**:可以单独对每个模块进行单元测试 - ✅ **易于维护**:修改某个功能只需改对应的类 - ✅ **高内聚低耦合**:模块之间通过接口交互 - ✅ **可扩展性强**:添加新功能不影响现有代码 - ✅ **符合 SOLID 原则**:专业的软件工程实践 ## 📄 许可证 本项目采用开源许可证,具体请查看 LICENSE 文件。 ---