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レベルのログです")

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