技術ブログ

プログラミング、IT関連の記事中心

ロガー(Logger)クラスの自作方法【Swift】

■はじめに

コンソールログを残したままリリースすると、ログが表示されてしまいます。

APIの情報などをログに出してしまうと、セキュリティ上、問題になるので、開発環境ではログが表示されて、本番環境では表示されないようにロガークラスを作成して管理しましょう。

■手順

「YNLogger.swift」ファイルを作成し、以下のソースを丸々コピペで貼り付けてください。

import Foundation

class YNLogger {
    /// ログに表示する日時
    private static var dateString: String {
        let date = Date()
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy/MM/dd HH:mm:ss"
        return formatter.string(from: date)
    }
    
    /// ログレベルの種類のENUM
    private enum LogLevel: String {
        case debug
        case error
    }
    
    /// デバッグのログ(ログに「[DEBUG]」が表示される)
    /// - Parameter file: 該当のファイル名を取得する(引数で明示的に渡す必要はない)
    /// - Parameter function: 該当の関数名を取得する(引数で明示的に渡す必要はない)
    /// - Parameter line: 該当の行数を取得する(引数で明示的に渡す必要はない)
    /// - Parameter message: ログメッセージを渡す
    public static func log(file: String = #file, function: String = #function, line: Int = #line, _ message: String = "") {
        printToConsole(logLevel: .debug, file: file, function: function, line: line, message: message)
    }
    
    /// エラーのログ(ログに「[DEBUG]」が表示される)
    /// - Parameter file: 該当のファイル名を取得する(引数で明示的に渡す必要はない)
    /// - Parameter function: 該当の関数名を取得する(引数で明示的に渡す必要はない)
    /// - Parameter line: 該当の行数を取得する(引数で明示的に渡す必要はない)
    /// - Parameter message: ログメッセージを渡す
    public static func error(file: String = #file, function: String = #function, line: Int = #line, _ message: String = "") {
        printToConsole(logLevel: .error, file: file, function: function, line: line, message: message)
    }
    
    /// ファイル名からクラス名を取得する
    /// - Parameter filePath: ファイル名
    private static func className(from filePath: String) -> String {
        let fileName = filePath.components(separatedBy: "/").last
        return fileName?.components(separatedBy: ".").first ?? ""
    }
    
    /// 開発環境でのみ、コンソールにログを出力する
    /// - Parameter logLevel: ログレベル
    /// - Parameter file: ファイル名
    /// - Parameter function: 関数名
    /// - Parameter line: 行数
    /// - Parameter message: ログ内容
    private static func printToConsole(logLevel: LogLevel, file: String, function: String, line: Int, message: String) {
        #if DEBUG
            print("\(dateString) [\(logLevel.rawValue.uppercased())] \(className(from: file)).\(function) \(line)s: \(message)")
        #endif
    }
}

呼び出し元では、以下のどちらかの方法で呼び出しましょう。

※「log」は「[DEBUG]」のタグが付き、「error」は「[ERROR]」のタグが付くログです。

YNLogger.log("こんにちは")
YNLogger.error("えらー")

コンソールには、以下のように表示されます。

2019/11/22 21:39:34 [DEBUG] ViewController.viewDidLoad() 16s: こんにちは
2019/11/22 21:39:34 [ERROR] ViewController.viewDidLoad() 17s: えらー