美文网首页
iOS本地日志上报

iOS本地日志上报

作者: itclimb | 来源:发表于2023-07-18 10:25 被阅读0次

日志上报

  1. 采集日志到本地文件。
  2. 文件大小限制为1M,超过限制拷贝到备份文件。
  3. 定义上报时机,上报日志文件
import Foundation

class HXLogger {
    static let shared = HXLogger()
    private let logFileName = "app_log.txt"
    private var logFileURL: URL?
    private let maxLogFileSize: Int = 1024 * 1024 // 1MB
    
    private init() {
        configureLogFile()
    }
    
    private func configureLogFile() {
        // 获取应用沙盒中的Documents目录
        guard let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else {
            return
        }
        
        // 创建日志文件URL
        logFileURL = documentsDirectory.appendingPathComponent(logFileName)
        
        // 如果日志文件已存在,删除旧文件
        if FileManager.default.fileExists(atPath: logFileURL?.path ?? "") {
            do {
                try FileManager.default.removeItem(at: logFileURL!)
            } catch {
                print("Failed to remove existing log file: \(error)")
            }
        }
    }
    
    func log(message: String) {
        guard let logFileURL = logFileURL else {
            return
        }
        
        do {
            // 获取文件大小
            let fileSize = try FileManager.default.attributesOfItem(atPath: logFileURL.path)[.size] as? Int ?? 0
            
            // 如果文件大小超过限制,备份旧文件并创建新文件
            if fileSize >= maxLogFileSize {
                try backupLogFile()
            }
            // 将日志信息追加到文件末尾
            try message.appendLineToURL(fileURL: logFileURL)
        } catch {
            print("Failed to write log message to file: \(error)")
        }
    }
    
    func backupLogFile() throws {
        guard let logFileURL = logFileURL else {
            return
        }
        
        // 在文件名中添加时间戳作为备份文件的名称
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyyMMddHHmmss"
        let timestamp = dateFormatter.string(from: Date())
        
        let backupFileName = logFileName.appendingFormat("_%@", timestamp)
        
        // 生成备份文件URL
        let backupFileURL = logFileURL.deletingLastPathComponent().appendingPathComponent(backupFileName)
        
        // 将当前日志文件移动到备份文件位置
        try FileManager.default.moveItem(at: logFileURL, to: backupFileURL)
        
        // 创建新的日志文件
        configureLogFile()
    }
}

// 扩展String类型,用于将字符串追加到文件末尾
extension String {
    func appendLineToURL(fileURL: URL) throws {
        try (self + "\n").appendToURL(fileURL: fileURL)
    }
    
    func appendToURL(fileURL: URL) throws {
        let data = self.data(using: String.Encoding.utf8)!
        try data.append(fileURL: fileURL)
    }
}

// 扩展Data类型,用于将数据追加到文件末尾
extension Data {
    func append(fileURL: URL) throws {
        if let fileHandle = try? FileHandle(forWritingTo: fileURL) {
            defer {
                fileHandle.closeFile()
            }
            fileHandle.seekToEndOfFile()
            fileHandle.write(self)
        } else {
            try write(to: fileURL, options: .atomic)
        }
    }
}


相关文章

  • iOS 崩溃日志收集和上传服务器

    iOS 崩溃日志本地存储并上传 感谢iOS战士原创

  • iOS日志操作与开发,你真的会重视吗???

    iOS中常用日志和上报系统浅析 类CocoaLumberjack日志框架架构浅析 Crash的类型介绍和常用收集方...

  • crash

    iOS Crash文件的解析(一)教你如何对ios崩溃(crash)日志做符号化IOS本地日志记录解决方案友盟统计...

  • 3.Xcode方面问题

    1.iOS崩溃日志分析 iOS 获得crash dSYM方法(手机本地连接方式) [iOS Crash文件分析]-...

  • pthread_create & OOM

    上报主要是华为手机占比较高。这个不好找,不过在日志里频繁看到一个log上报的日志,所以猜测可能是日志上报过于频繁,...

  • 本地日志分析上报脚本实现思路梳理

    一、背景 目前我们部门的日志查询只能通过开发人员登录对应的机器执行日志分析,效率不够高效。对于现网问题,由于运维不...

  • 使用Object.definedproperty实现一个前端日志

    一、功能点 日志回调 环境区分 错误捕获及上报 日志信息获取及手动上报功能 二、功能点详解 1、日志回调 在用户对...

  • 前端错误日志采集上报

    js-log-report 前端错误日志采集上报、上报给后端分析错误日、主要用于移动端各手机类型错误日志的收集分析...

  • Filebeat占用文件句柄

    背景 平台使用整套的ELK日志框架:服务写本地文件日志,由Filebeat监控本地日志,并写入ES。本地Fileb...

  • Flutter日志上报和异常上报

    一、只能收集同步报错异常的方式 二、使用Zone收集,这种同步和异步报错都可以收集,还可以收集日志 使用直接看上面...

网友评论

      本文标题:iOS本地日志上报

      本文链接:https://www.haomeiwen.com/subject/hwsnudtx.html