リリース時にprintログを出力させない方法
Swiftの標準出力関数printを開発時のみ出力させる方法
ヒーラー
print関数は開発に便利だが、リリースに出力されてしまうのが気持ち悪い
問題
Swiftには標準出力関数が3種類あります。
- debugPrint
- dump
しかしすべて本番環境のリリース時にも出力されてしまい、ハッキングに繋がるようなセキュリティリスクがあり気持ち悪いものです。(debugPrintはDebugと付いていますが、リリースでも出力されてしまいます)
標準で開発中のデバッグ時だけ出力してくれるような関数はありません。
Objective-Cでは、以下のようなマクロを使用していました。
#ifdef DEBUG
#define LOG(fmt,...) NSLog((@"%s %d " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
#else
#define LOG(fmt,...)
#endif
これは非常に万能で、DEBUGというマクロ(プリプロセッサ/プリコンパイラ)さえ定義してあれば、詳しいロギングが可能になり、デバッグに役立ちます。
従来のNSLogの使い方ができるのに加えて、出力時には関数名と何行目かの情報も表示してくれます。
つまり、Swiftでも上記同様、本番環境と開発環境(ReleaseとDebug)を分けて、関数名や行数などの情報も付加した出力がしたいということです。
解決方法
SwiftではObjective-Cのようなマクロが使えませんので、Utils.swiftなど共通用のファイルに以下のような関数を用意して対応しました。
public func log(_ items: Any?, file: String = #file, line: Int = #line, function: String = #function) {
#if DEBUG
let filename = URL(fileURLWithPath: file).lastPathComponent
if let items = items {
print("[\(filename) \(line):\(function)] : \(items)")
} else {
print("[\(filename) \(line):\(function)]")
}
#endif
}
print関数をラップするような方法でも良いのですが、printと区別するようにlog関数としました。
DEBUGマクロ(プリプロセッサ/プリコンパイラ)が定義してあれば、機能するようになっています。
print関数と同様の使い方で、付加情報(ファイル名、何行目、関数名)を表示します。
これで本番リリース時には出力されないようになります。
これが現時点での開発におけるロギングのベストプラクティスかと思います。