見出し画像

NSLogの表示が変わっていた

久しぶりに NSLog を使ったらXcodeの Debug Area の表示が変わっていました。

Xcode Version 16.2
macOS 15.2 で確認しました。
画面はダーク表示です。


SwiftUIを使いだしてからは print ばかり使っていましたが、スレッドIDを確認してみたくて NSLog を試したところタイムスタンプさえ表示されませんでした。
そこでいくつか確認したのでここにまとめます。



NSLog は Objective-C 時代から利用可能なコンソールにログを表示する関数です。

Objective-C用には

void NSLog(NSString *format, ...);

を使います。

Swiftでは

func NSLog(
    _ format: String,
    _ args: any CVarArg...
)

が使えます。

久しぶりにNSLogを使ってみた

引数が Swift の String型なので String interpolation が使えます
【フォーマット指定とそのワーニングから解放され、printと同じ様に使えます】

// printと同じ様に使える
print("randomNumber: \(randomNumber)")
NSLog("randomNumber: \(randomNumber)")

print と NSLog の Debug Area 表示は全く同じでした。

printとNSLogの表示

昔の環境で NSLog の出力はタイムスタンプ、プロセス名、PID:TIDの後に文字列を表示していました。
Xcode 16.2 では OSLog と同じ表示のようです。

OSLog についてはWWDC23のセッションで確認できます。
(メタデータの表示方法の説明もあります)


メタデータは表示できる

NSLog も OSLog と同様に、表示する Metadata を Xcode の Metadata Options からいつでも選択・変更できます。

Xcode Debug Area の Metadata Options
Metadata Options をクリックした状態

選択できるメタデータは Type、Timestamp、Library、PID:TID、Subsystem、Category です。

タイムスタンプとPID:TIDを選んだ状態

Metadata 右のトグルをオフにすると選択はそのままメタデータ表示を一時的にオフにもできます。


タイムスタンプとPID:TIDを表示した状態

この状態で Debug Area をコピー(⌘C)すると

randomNumber: 38
randomNumber: 38

とメタデータはコピーされません。

タイムスタンプやスレッドIDが必要な場合もあります、メタデータのコピーは次の方法で可能でした。

副ボタンクリックのコンテキストメニュー
Сору
Copy Rows with Visible Metadata
Copy Rows with All Metadata
Copy Rows without Metadata が選べます。

メタデータをコピーに含めるか選べます

ただしCopy Rows with Visible Metadata では PID:TID も表示していますがタイムスタンプだけがコピーされました。(これはバグかな?)

randomNumber: 38
randomNumber: 38
Timestamp: 2024-12-17 14:46:08.661753+09:00

【print出力にメタデータはありません】
色分けは note の機能です、コピーされるのはテキストのみです。

Copy Rows with All Metadata では

randomNumber: 38
Type: stdio
randomNumber: 38
Type: Notice | Timestamp: 2024-12-17 14:46:08.661753+09:00 | Process: NSLogTest | Library: Foundation | TID: 0x14c66

ここでは print 出力行にも Type: stdio と表示されています。
NSLog の出力は OSLog の Notice に相当していることが確認できます。
フィルターで stdio のみや Notice のみに絞り込んで表示可能です。(WWDC23 Debug with structured logging ビデオで説明されています)

ちなみにすべてのメタデータを表示した場合は print と NSLog 出力ではこのようになりました。

すべてのメタデータを選んだ状態の Debug Area 表示


メタデータを表示していなくてもコピー可能

Debug Area にメタデータを表示していない状態でもコンテキストメニューに「Copy Rows with All Metadata 」などの項目があるのでコピー可能です。


コードの行とは対応しない

OSLog と NSLog の大きな違いはログ表示から表示したコードの行とリンクしていない点です。


かつての表示

かつて(Xcode 11 など)の Debug Area 表示は次の様なイメージです。

2024-12-17 14:46:08.661753+09:00 NSLogTest[PID:TID] randomNumber: 38

表示文字列の前にタイムスタンプなどが全行付くので冗長でした。


Playground画面では表示されない

NSLogは Xcode の Playground でもコードに記述できエラーにはなりませんが、実行しても Debug Area には何も表示しませんでした。


NSLog についてはこちらの記事にも書いています:

【『はじめてのデバッガー』は iOSアプリ開発入門 マガジン でも読むことができます】


まとめ

🔸 Swiftでは NSLog を使う場合フォーマット指定が不要にでき便利
🔸 ログ表示がタイムスタンプなどに埋もれることがなくなった
🔸 表示はシンプルだが、メタデータは必要により確認もコピーも可能




こんな記事も書いています


いいなと思ったら応援しよう!

快技庵 高橋政明
今後も記事を増やすつもりです。 サポートしていただけると大変はげみになります。