# 日志系统使用说明 ## 概述 我们创建了一个功能强大的日志系统,可以显示代码在文件的行号、类名和打印时间,完全替换了原来的 `print` 语句。 ## 特性 - 🔍 **调试日志**: 用于详细的调试信息 - ℹ️ **信息日志**: 用于一般信息 - ⚠️ **警告日志**: 用于警告信息 - ❌ **错误日志**: 用于错误信息 - ✅ **成功日志**: 用于成功操作 ## 使用方法 ### 1. 基本日志函数 ```swift // 调试日志 logDebug("这是一条调试信息", className: "MyClass") // 信息日志 logInfo("这是一条信息", className: "MyClass") // 警告日志 logWarning("这是一条警告", className: "MyClass") // 错误日志 logError("这是一条错误", className: "MyClass") // 成功日志 logSuccess("操作成功", className: "MyClass") ``` ### 2. 自动获取类名 ```swift class MyViewController: UIViewController { func someMethod() { // 使用 self.className 自动获取类名 logInfo("方法被调用", className: self.className) // 或者使用静态方法 logInfo("类被初始化", className: MyViewController.className) } } ``` ### 3. 日志输出格式 日志输出格式如下: ``` [时间戳] 图标 [类名] [文件名:行号] 函数名: 消息内容 ``` 例如: ``` [14:30:25.123] ℹ️ [ScannerView] [ScannerView.swift:162] onReceive: 检测到条码数量: 2 ``` ### 4. 日志级别控制 ```swift // 设置最小日志级别(只显示该级别及以上的日志) Logger.shared.minimumLevel = .info // 只显示 info、warning、error、success // 启用/禁用日志 Logger.shared.isEnabled = false // 完全禁用日志 ``` ## 已替换的 print 语句 ### ScannerView.swift - 条码检测相关日志 - 屏幕方向变化日志 - 自动选择定时器日志 ### ScannerViewModel.swift - 元数据输出日志 - 条码创建日志 - 数据更新日志 ### CodePositionMarker - 位置计算日志 - 坐标转换日志 - 边界检查日志 ## 日志级别说明 1. **Debug (🔍)**: 最详细的调试信息,包括坐标、尺寸等 2. **Info (ℹ️)**: 一般信息,如状态变化、操作结果 3. **Warning (⚠️)**: 警告信息,如使用默认值、降级处理 4. **Error (❌)**: 错误信息,如权限失败、设备不支持 5. **Success (✅)**: 成功操作,如扫描完成、权限获取 ## 性能考虑 - 日志系统使用 `@Published` 属性,支持 SwiftUI 的响应式更新 - 在 Release 版本中,可以通过设置 `isEnabled = false` 完全禁用日志 - 日志输出使用 `DispatchQueue.main.async` 确保在主线程执行 ## 测试日志系统 在 ContentView 中点击"测试日志系统"按钮,可以看到所有级别的日志输出示例。 ## 自定义扩展 如果需要添加新的日志级别或自定义格式,可以扩展 `LogLevel` 枚举和 `Logger` 类: ```swift extension LogLevel { case custom = "🎯" var localizedName: String { switch self { case .custom: return "自定义" // ... 其他情况 } } } ``` ## 注意事项 1. 所有日志函数都支持自动获取文件名、行号和函数名 2. 类名参数是可选的,如果不提供会显示 "Unknown" 3. 日志系统是线程安全的,可以在任何线程中调用 4. 在开发阶段建议保持日志启用,生产环境可以适当调整级别