![見出し画像](https://assets.st-note.com/production/uploads/images/166099583/rectangle_large_type_2_3a4e4cc797ea1594dc819b73a586afde.png?width=1200)
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 表示は全く同じでした。
![](https://assets.st-note.com/img/1734415014-LF73WhgquCRfXxO0EGSV5Pjs.png?width=1200)
昔の環境で NSLog の出力はタイムスタンプ、プロセス名、PID:TIDの後に文字列を表示していました。
Xcode 16.2 では OSLog と同じ表示のようです。
OSLog についてはWWDC23のセッションで確認できます。
(メタデータの表示方法の説明もあります)
メタデータは表示できる
NSLog も OSLog と同様に、表示する Metadata を Xcode の Metadata Options からいつでも選択・変更できます。
![](https://assets.st-note.com/img/1734417570-hkRjJoAmglGFUzdSEx7NnwKQ.png?width=1200)
![](https://assets.st-note.com/img/1734415843-atsoWFdjXIx9mB6GAJlMnNTQ.png?width=1200)
選択できるメタデータは Type、Timestamp、Library、PID:TID、Subsystem、Category です。
![](https://assets.st-note.com/img/1734415933-RYykib6GDWzmvdNqf5TcBZ34.png?width=1200)
Metadata 右のトグルをオフにすると選択はそのままメタデータ表示を一時的にオフにもできます。
![](https://assets.st-note.com/img/1734415948-RjOuqwz8tdWa3x94ZBsHhFK5.png?width=1200)
この状態で Debug Area をコピー(⌘C)すると
randomNumber: 38
randomNumber: 38
とメタデータはコピーされません。
タイムスタンプやスレッドIDが必要な場合もあります、メタデータのコピーは次の方法で可能でした。
副ボタンクリックのコンテキストメニューで
Сору
Copy Rows with Visible Metadata
Copy Rows with All Metadata
Copy Rows without Metadata が選べます。
![](https://assets.st-note.com/img/1734415977-pOaF8hgo2kI6TNMK7RisXP3G.png?width=1200)
ただし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 出力ではこのようになりました。
![](https://assets.st-note.com/img/1734416751-qeuvWs8BjmQ45tnEzISr06yV.png?width=1200)
メタデータを表示していなくてもコピー可能
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 を使う場合フォーマット指定が不要にでき便利
🔸 ログ表示がタイムスタンプなどに埋もれることがなくなった
🔸 表示はシンプルだが、メタデータは必要により確認もコピーも可能
こんな記事も書いています
いいなと思ったら応援しよう!
![快技庵 高橋政明](https://assets.st-note.com/production/uploads/images/9832833/profile_4b095662ad7e81c87f504c6f761a1f34.png?width=600&crop=1:1,smart)