Запис даних на пристрій та отримання журналу


82

Під час збірки налагодження в Xcode, незалежно від того, чи використовую я симулятор чи фактичний пристрій, на консолі виходять оператори NSLog, printf, fprintf assert та NSAssert

Якщо я зараз запустив збірку випусків на пристрої (скажімо, я надсилаю пробну збірку польоту та збільшую її на своєму iPhone; це буде збірка випуску), які з них (якщо такі є) записуються?

І як мені отримати журнал?

Чи насправді NSLog виводить щось при побудові випуску? Що є визначальним фактором? Чи це запис у stdout, або stderr? чи лише stderr записується в журнал пристрою? Чи означає це, що я повинен використовувати fprintf? Чи що-небудь записано в журнал пристрою? є навіть така річ? Якщо так, то як його забрати?

Хтось міг би прояснити ситуацію?


1
Для того, щоб просто зберегти результати як Файл, використовуйте це: stackoverflow.com/questions/28114110/…
Kiran P Nair

Відповіді:


94
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *fileName =[NSString stringWithFormat:@"%@.log",[NSDate date]];
NSString *logFilePath = [documentsDirectory stringByAppendingPathComponent:fileName];
freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding],"a+",stderr);

Просто додайте цей блок коду в application:didFinishLaunchingWithOptionsметод у файл делегата програми, і він створить файл журналу в каталозі документів програми на iPhone, який реєструє всі події журналу консолі. Вам потрібно імпортувати цей файл із iTunes, щоб переглянути всі події консолі.

Примітка. У файлі .plist переконайтеся, що Application supports iTunes file sharingвін існує та встановлений YESтак, щоб ви могли отримати доступ через iTunes.

Щоб отримати журнали: Запустіть itunes, після того, як пристрій підключено, виберіть Програми - виберіть свою програму - в Документі Augument ви отримаєте свій файл. Потім ви можете зберегти його на своєму диску


1
Як це працює? просто маючи .logфайл у каталозі документів iOS пише там вихідні дані консолі?
Алі

2
Як програмно видалити файли журналів за порядком дат, щоб запобігти витоку пам'яті диска?
hkaraoglu

4
Не впевнений, чи NSDocumentDirectoryпідходить для файлів журналів - зазвичай він призначений для власного вмісту, створеного користувачем, але файли журналів є вмістом підтримки програми, тому, можливо, вони належать до NSLibraryDirectory/ підкаталогу журналів.
JustAMartin

Як я можу експортувати дані журналу з ПК з Windows?
Vineesh TP

1
@Ali це працює, асоціюючи дескриптор файлу stderr (стандартний вивід помилок) (тобто дескриптор файлу 2) до файлу, відкритого для запису. Отже, кожного разу, коли ви друкуєте у stderr, він замість цього друкує у файл. Таким чином, ви вловлюєте stderr-результат програми. Система журналів про це нічого не знає.
Ammo Goettsch

140

У Xcode 6.1.1 ви можете переглянути вихід NSLog, виконавши наступне. Однак я не впевнений, що це дозволяє вам бачити журнали із занадто далеких часів. Я бачив, як це повертається до декількох годин.

У будь-якому випадку, ось кроки:

  1. У Xcode перейдіть до Вікна -> Пристрої.
  2. Виберіть пристрій на лівій панелі.
  3. Клацніть на маленьку стрілку, як показано на скріншоті нижче.

введіть тут опис зображення


3
Це повинна бути правильна відповідь ... Я витратив півгодини на пошук кнопки журналу. Дякуємо, що
заощадили

1
просто NSLog. Не чекайте там cout або printf.
Кіран,

10
За допомогою цієї техніки ви не можете отримати журнали з робочих / поданих програм. Це корисно лише під час налагодження.
Сатьям

7
ти зробив мені день, прекрасний приклад того, як НЕ розробляти інтерфейс, можливо, їм слід прочитати developer.apple.com/library/mac/documentation/UserExperience/…
Хофі

1
Ви щойно врятували мій бекон. Переслідуючи помилку, яка з’являється лише у версії, журнали виявили проблему. Я переглянув те саме діалогове вікно і ніколи не думав натискати маленьку стрілку, яка, мабуть, є універсальним символом "показувати журнали пристроїв у реальному часі". Дякую!
chacmool

23

У Swift 3.0 код Шил зміниться на,

var paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
let documentsDirectory = paths[0]
let fileName = "\(Date()).log"
let logFilePath = (documentsDirectory as NSString).appendingPathComponent(fileName)
freopen(logFilePath.cString(using: String.Encoding.ascii)!, "a+", stderr)

всі інші процеси такі самі, що пояснив Шил

Просто додайте цей блок коду в додаток: didFinishLaunchingWithOptions у файл делегата програми, і він створить файл журналу в каталозі документів програми на iPhone, який реєструє всі події журналу консолі. Вам потрібно імпортувати цей файл із iTunes, щоб переглянути всі події консолі.

Примітка: У файлі .plist переконайтеся, що він Application supports iTunes file sharingіснує та встановлений у YESтакий спосіб, щоб ви мали доступ через iTunes.

Щоб отримати журнали: Запустіть iTunes, після того, як пристрій підключено, виберіть Програми - виберіть свою програму - в Документі Augument ви отримаєте свій файл. Потім ви можете зберегти його на своєму диску


виправте мене, якщо я помиляюся: це змінює каталог журналів, що означає, що він спочатку написаний /var/db/diagnostics/. Дивіться тут .
Мед,

@Honey, цей журнал буде збережено в каталозі документів програми.
Kiran P Nair

Цей код завжди створює новий файл при запуску програми
DURGESH

Будь-яка ідея, як змусити це працювати, коли журнал виконується в розширенні Watch?
user2623825 02

1
@KiranPNair - чи можу я це зробити і для операторів print (), або просто для NSLog?
Fra

12

NSLog записується в журнал пристрою у виробничому випуску, і ви можете перевірити це, підключивши iPhone до вашої системи та використовуючи Органайзер. Виберіть свій iPhone в органайзері, клацніть Журнали пристроїв. Ви побачите всі вихідні дані NSLog у журналі.


4
Оновлення: у Xcode 6 більше неможливо читати виходи NSLog через журнали пристроїв. Вікно> Організатор більше не перелічує пристрої. Натомість Вікно> Пристрої перелічує пристрої, але відображає лише журнали збоїв.
Роберт

1
Роберт, на екрані Вікно> Пристрої Xcode 6 біля нижнього краю екрана є невидима лінія. Якщо ви піднімете його, ви побачите журнал консолі вибраного пристрою. Це невидимо через помилку інтерфейсу користувача в Xcode, я думаю.
oradyvan

7

Я знайшов це посилання з APPLE дуже інформативним та повним. Це майже дає всі можливості перегляду журналів пристрою або доступу до них, незалежно від того, підключені вони до вашої машини розробника.

https://developer.apple.com/library/ios/qa/qa1747/_index.html


1
Цей документ надзвичайно застарів. У ньому згадується лише xCode 6. Метод абсолютно інший для xCode 9 та 10
1800 ІНФОРМАЦІЯ

2

Так, виводи NSLog на пристрій. Ви можете бачити, що це виводиться з вашого пристрою, підключеного до Mac, та за допомогою інструменту Xcode Organizer.


Чи можливо для користувача перевірити ці журнали через iTunes?
P 1

3
У цій відповіді stackoverflow.com/questions/2334664/… зазначено, що утиліта конфігурації iPhone дозволяє експортувати журнал консолі з пристрою
Денис


2

Я знаю, що це старий потік, але ви також можете отримати доступ до журналів пристрою, які збираються:

Налаштування -> Конфіденційність -> Аналітика -> Дані

Сподіваюся, це допоможе

З повагою


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.