【Swift】ログをファイル出力する

はじめに

私はコンソールのログをファイルにコピペしているため、ログ収集にかなり時間が使用していることに問題があると感じました。
これを機にログをファイル出力できる方法を調査し考えてみようと思ったので、それを記事に纏めました。

使用環境

● OS:macOS Big Sur 11.3.1
● Xcode:12.5
● Swift:5.4

なぜログをファイル出力する必要があるのか?

何が要因で処理が失敗しているかを開発者同士で考える時に、すぐにログを共有できた方が問題の解決に近づくからです。

必要な知識

  • ファイルの生成(FileManager)

  • ファイルに書き込む(FileHandle)

本記事の方法

コード

import Foundation

class LogManager {
    static var shared = LogManager()
    
    /// ファイル名
    let fileName = "log.txt"
    
    let contents = "ファイルの生成に成功"
    
    let fileManager = FileManager.default
    
    var log: String?
    
    /// ファイルを生成
    func createFile() {
        
        guard let fileUrl = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first else { return }
        
        /// 保存先パスを生成
        let file = fileUrl.appendingPathComponent(fileName)
        
        let existFile = FileManager.default.fileExists(atPath: file.path)
        
        guard !existFile else { return }
        
        let createFile = fileManager.createFile(atPath: file.path, contents: contents.data(using: .utf8), attributes: .none)
        
        guard createFile else { return print("ファイル生成に失敗しました。") }
        
        print(file)
    }
    
    /// ファイルに書き込む
    func write() {
        
        guard let fileUrl = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first else { return }
        
        /// 保存先パスを生成
        let file = fileUrl.appendingPathComponent(fileName)
        
        guard let fileHandle = FileHandle(forWritingAtPath: file.path) else { return }
        
        guard let contentData = log!.data(using: .utf8) else { return }
        
        fileHandle.seekToEndOfFile()
        
        fileHandle.write(contentData)
        
        print("書き込みに成功しました。")
        
        fileHandle.closeFile()
    }
    
    /// ログ出力
    /// - Parameters:
    ///   - object: 処理やコメントを記載
    ///   - function: 処理中の関数
    ///   - line: 処理中の行数
    /// - Returns: 変数logで返す
    func printer(object: Any, function: String = #function, line: Int = #line) -> String {
        print("[function:\(function) line:\(line)] \(object)")
        log = "\n[function:\(function) line:\(line)] \(object)\n"
        return log!
    }
}

使い方

1.ファイル生成

LogManager.shared.createFile()

2.ログ出力

 _ = LogManager.shared.printer(object: "生成")

3.ログを書き込む

LogManager.shared.write()

おわりに

APIで得たJSONデータのパースのログも自動でファイルに保存してくれるので、かなり開発が楽になりそうです。

参考文献


この記事が気に入ったらサポートをしてみませんか?