Swift2でリリースビルドの時にログ表示しないようにする

Xcode7(Swift2) でデバッグビルドの時だけデバッグ出力して、プロダクションビルドの時はセキュリティのためデバッグログを削る方法のメモ。

このコードにより、print, debugPrintln, NSLogの出力を制御することができます。

事前準備

XcodeプロジェクトのBuild Settings → Swift Compiler → Other Swift Flags の Debug に「-DDEBUG」を追加して下さい。

コード

AppDelegate.swift の冒頭に以下のグローバル関数を追加します。

他のファイルのほうがわかりやすければAppDelegate以外でも大丈夫です。

// リリースビルドでprint, debugPrintを無効化
func print(object: Any) {
#if DEBUG
Swift.print(object, terminator: "")
#endif
}
func debugPrint(object: Any) {
#if DEBUG
Swift.debugPrint(object, terminator: "")
#endif
}
// リリースビルドでNSLog無効化
func NSLog(message:String){
#if DEBUG
Foundation.NSLog(message)
#endif
}
func NSLog(format:String, _ args:CVarArgType...){
#if DEBUG
Foundation.NSLog(String(format: format, arguments: args))
#endif
}

この記事を書いた理由

print, debugPrintは出てきますが、SwiftでNSLogを非表示にする方法がどうしても出てこなかったので記事にしました。

Swift2から廃止されたprintln, debugPrintlnはここに書いていませんが、print, debugPrint と同様の方法で対応可能です。

ググると NSLogを消す方法として、プレフィクスヘッダファイル(.pchファイル)に #define NSLog を方法が出てきますが、こちらはObjective Cにしか効果がないようなので注意。

おまけ

代替案としては、より細かいログレベル制御が可能なXCGLoggerを使うのも手です。

AppDelegateで

import XCGLogger
let log: XCGLogger = {
let log = XCGLogger.defaultInstance()
#if DEBUG
log.setup(.Debug, showThreadName: true, showLogLevel: true, showFileNames: true, showLineNumbers: true, writeToFile: nil)
#else
log.setup(.Severe, showThreadName: true, showLogLevel: true, showFileNames: true, showLineNumbers: true, writeToFile: nil)
#endif
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "MM/dd/yyyy hh:mma"
dateFormatter.locale = NSLocale.currentLocale()
log.dateFormatter = dateFormatter
return log
}()

としておくと、

log.debug("Debugレベルのログです")
log.info("infoレベルのログです")

のようにログレベルごとのログ出力ができるようになります。