Swift

Swiftの自前ログクラス

More than 1 year has passed since last update.

Swiftを少し触り始めたので、その時のメモを残します。

はじめに

自分仕様にログの出し方を整えておきたいと思い、ログクラスを作ることにしました。
Swiftもそうですが、Objective-Cもあまり触ったことがないので、もしかしたら、もっと簡単なやり方があるのかもしれませんが。

ログ出力でやりたいこと

  • 時間を出力したい
  • 実行行を出力したい
  • 実行クラス、メソッドを出力したい
  • ログレベルを出力したい

とりあえずこんなところでしょうか。

Logger.swift

Logger.swift
import Foundation

class Logger{
    class func debug(
            message: String,
            function: String = __FUNCTION__,
            file: String = __FILE__,
            line: Int = __LINE__) { Logger.write("[DEBUG]", message: message, function: function, file: file, line: line) };
    class func info(
            message: String,
            function: String = __FUNCTION__,
            file: String = __FILE__,
            line: Int = __LINE__) { Logger.write("[INFO]", message: message, function: function, file: file, line: line) };
    class func warning(
            message: String,
            function: String = __FUNCTION__,
            file: String = __FILE__,
            line: Int = __LINE__) { Logger.write("[WARNING]", message: message, function: function, file: file, line: line) };
    class func error(
            message: String,
            function: String = __FUNCTION__,
            file: String = __FILE__,
            line: Int = __LINE__) { Logger.write("[ERROR]", message: message, function: function, file: file, line: line) };
    class func write(
            loglevel: String,
            message: String,
            function: String,
            file: String,
            line: Int) {

            let now = NSDate() // 現在日時の取得
            let dateFormatter = NSDateFormatter()
            dateFormatter.locale = NSLocale(localeIdentifier: "ja_JP")
            dateFormatter.timeStyle = .MediumStyle
            dateFormatter.dateStyle = .MediumStyle
            //println(dateFormatter.stringFromDate(now)) // => 2014/12/11 15:19:04

            var nowdate = dateFormatter.stringFromDate(now)

            var filename = file
            if let match = filename.rangeOfString("[^/]*$", options: .RegularExpressionSearch) {
                filename = filename.substringWithRange(match)
            }
            println("\(loglevel) => \"\(message)\" \(nowdate) L\(line) \(function) @\(filename)")
    }
}

まあ、なんというかもしかしたらもっと良いやり方があるんかもしれないのですが。

使い方

DEBUG,INFO,WARNING,ERROR

Logger.debug("hogehoge")
Logger.info("hogehoge")
Logger.warning("hogehoge")
Logger.error("hogehoge")

出力結果

[DEBUG] => "hogehoge" 2014/12/11 15:56:16 L21 application(_:didFinishLaunchingWithOptions:) @AppDelegate.swift

[INFO] => "hogehoge" 2014/12/11 15:56:16 L22 application(_:didFinishLaunchingWithOptions:) @AppDelegate.swift

[WARNING] => "hogehoge" 2014/12/11 15:56:16 L23 application(_:didFinishLaunchingWithOptions:) @AppDelegate.swift

[ERROR] => "hogehoge" 2014/12/11 15:56:16 L24 application(_:didFinishLaunchingWithOptions:) @AppDelegate.swift