Rejestrowanie danych na urządzeniu i pobieranie dziennika

82

W kompilacji debugowania w Xcode, niezależnie od tego, czy używam symulatora, czy rzeczywistego urządzenia, na konsoli pojawiają się instrukcje NSLog, printf, fprintf assert i NSAssert

Jeśli teraz uruchomię kompilację wydania na urządzeniu (powiedzmy, że wyślę kompilację do lotu testowego i zwiększę ją na moim iPhonie; będzie to kompilacja wydania), które z nich (jeśli w ogóle) zostaną nagrane?

Jak mogę odzyskać dziennik?

Czy NSLog faktycznie wyświetla coś podczas kompilacji wydania? Co jest decydującym czynnikiem? Czy jest to zapis na stdout czy stderr? czy tylko stderr jest zapisywane w dzienniku urządzenia? Czy to oznacza, że ​​muszę używać fprintf? Czy COŚ zostało zapisane w dzienniku urządzenia? czy jest coś takiego? Jeśli tak, jak to odebrać?

Czy ktoś mógłby wyjaśnić sytuację?

Liczba Pi
źródło
1
Po prostu zapisz wyniki jako plik, użyj tego: stackoverflow.com/questions/28114110/…
Kiran P Nair

Odpowiedzi:

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);

Po prostu dodaj ten blok kodu do application:didFinishLaunchingWithOptionsmetody w pliku delegata aplikacji i utworzy plik dziennika w katalogu dokumentów aplikacji na iPhonie, który rejestruje wszystkie zdarzenia dziennika konsoli. Aby zobaczyć wszystkie zdarzenia konsoli, musisz zaimportować ten plik z iTunes.

Uwaga: w pliku .plist upewnij się, że Application supports iTunes file sharingistnieje i jest ustawiony na YES, aby umożliwić dostęp przez iTunes.

Aby pobrać logi: Uruchom itunes, po podłączeniu urządzenia wybierz Aplikacje - wybierz swoją aplikację - w dokumencie Augument otrzymasz plik. Następnie możesz zapisać go na dysku

Shyla
źródło
1
Jak to działa? po prostu mając .logplik w katalogu dokumentów iOS zapisuje tam dane wyjściowe konsoli?
Ali
2
Jak programowo usuwać pliki dziennika według kolejności dat, aby zapobiec wyciekowi pamięci dyskowej?
hkaraoglu
4
Nie jestem pewien, czy NSDocumentDirectoryjest to odpowiednie dla plików dziennika - zwykle jest przeznaczone dla treści generowanych przez użytkownika, ale pliki dziennika są treścią pomocniczą aplikacji, dlatego mogą należeć do NSLibraryDirectorypodkatalogu / Logs.
JustAMartin
Jak mogę wyeksportować szczegóły dziennika z komputera z systemem Windows?
Vineesh TP
1
@Ali działa poprzez powiązanie deskryptora pliku stderr (standardowe wyjście błędów) (tj. Deskryptor pliku 2) z plikiem otwartym do zapisu. Więc za każdym razem, gdy drukujesz na stderr, drukuje on do pliku. W ten sposób przechwytujesz wyjście stderr aplikacji. System dziennika nic o tym nie wie.
Ammo Goettsch
140

W Xcode 6.1.1 można wyświetlić dane wyjściowe NSLog, wykonując następujące czynności. Nie jestem jednak pewien, czy pozwala zobaczyć dzienniki ze zbyt odległych czasów. Widziałem, jak cofa się do kilku godzin.

W każdym razie oto kroki:

  1. W Xcode przejdź do Window -> Devices.
  2. Wybierz swoje urządzenie w lewym panelu.
  3. Kliknij małą strzałkę, jak pokazano na zrzucie ekranu poniżej.

wprowadź opis obrazu tutaj

Myxtic
źródło
3
To powinna być poprawna odpowiedź ... Spędziłem pół godziny, szukając przycisku dziennika. Dzięki za zaoszczędzenie czasu ...
PrimaryChicken
1
tylko NSLog. Nie oczekuj tam cout lub printf.
Kiran
10
Nie możesz pobrać dzienników z produkcji / przesłanych aplikacji przy użyciu tej techniki. Jest przydatny tylko podczas debugowania.
Satyam
7
zrobiłeś mój dzień, doskonały przykład, jak NIE projektować interfejsu użytkownika, może powinni przeczytać developer.apple.com/library/mac/documentation/UserExperience/ ...
Hofi
1
Właśnie uratowałeś mój bekon. Ścigaliśmy błąd, który pojawia się tylko w wydaniu, dzienniki ujawniły problem. Spojrzałem na to samo okno dialogowe i nigdy nie pomyślałem o kliknięciu małej strzałki, która najwyraźniej jest uniwersalnym symbolem „pokaż dzienniki urządzeń na żywo”. Dziękuję Ci!
chacmool
23

W Swift 3.0 kod Shyl zmieni się na,

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)

wszystkie inne procesy są takie same, jak wyjaśnione przez Shyl

Po prostu dodaj ten blok kodu w aplikacji: didFinishLaunchingWithOptions w pliku delegata aplikacji, a utworzy on plik dziennika w katalogu dokumentów aplikacji na iPhonie, który rejestruje wszystkie zdarzenia dziennika konsoli. Aby zobaczyć wszystkie zdarzenia konsoli, musisz zaimportować ten plik z iTunes.

Uwaga: w pliku .plist upewnij się, że Application supports iTunes file sharingistnieje i jest ustawiony na YES, aby umożliwić dostęp przez iTunes.

Aby uzyskać logi: Uruchom iTunes, po podłączeniu urządzenia wybierz Aplikacje - wybierz swoją aplikację - w dokumencie Augument otrzymasz plik. Następnie możesz zapisać go na dysku

Kiran P Nair
źródło
popraw mnie, jeśli się mylę: Zmienia katalog dzienników, co oznacza, że ​​jest pierwotnie zapisany /var/db/diagnostics/. Zobacz tutaj .
Kochanie
@ Kochanie, ten dziennik zostanie zapisany w katalogu dokumentów aplikacji.
Kiran P Nair
Ten kod zawsze tworzy nowy plik po uruchomieniu aplikacji
DURGESH
Masz jakiś pomysł, jak to zadziałać, gdy dziennik jest wykonywany w ramach rozszerzenia Watch?
user2623825
1
@KiranPNair - czy mogę to zrobić również dla instrukcji print (), czy tylko dla NSLog?
Fra
12

NSLog jest zapisywany w dzienniku urządzenia w wersji produkcyjnej i możesz to sprawdzić, podłączając iPhone'a do systemu i używając Organizatora. Wybierz swój iPhone w organizatorze, kliknij Dzienniki urządzeń. W dzienniku byłyby widoczne wszystkie wyjścia NSLog.

Bora
źródło
4
Aktualizacja: W Xcode 6 nie jest już możliwe odczytywanie wyjść NSLog za pośrednictwem dzienników urządzeń. Okno> Organizator nie wyświetla już listy urządzeń. Zamiast tego Okno> Urządzenia wyświetla listę urządzeń, ale wyświetla tylko dzienniki awarii.
Robert
1
Robert, na ekranie Window> Devices Xcode 6 znajduje się niewidoczna linia w pobliżu dolnej krawędzi ekranu. Jeśli ją wyciągniesz, zobaczysz dziennik konsoli wybranego urządzenia. Jest niewidoczny z powodu błędu interfejsu użytkownika w Xcode, jak sądzę.
oradyvan
7

Uważam, że ten link z APPLE jest bardzo pouczający i kompletny. To prawie daje wszystkie opcje przeglądania lub uzyskiwania dostępu do dzienników urządzenia, niezależnie od tego, czy jest ono podłączone do twojego urządzenia deweloperskiego.

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

GrandSteph
źródło
1
Ten dokument jest zdumiewająco nieaktualny. Wspomina tylko o xCode 6. Metoda jest zupełnie inna dla xCode 9 i 10
1800 INFORMACJA
2

Tak, wyjścia NSLog na urządzeniu. Możesz zobaczyć jego wyjścia po podłączeniu urządzenia do komputera Mac i użyciu narzędzia Xcode Organizer.

Denis
źródło
Czy użytkownik może przeglądać te dzienniki za pośrednictwem iTunes?
P i
3
W tej odpowiedzi stackoverflow.com/questions/2334664/… stwierdza się, że narzędzie konfiguracyjne iPhone'a umożliwia wyeksportowanie dziennika konsoli z urządzenia
Denis
2

Wiem, że to stary wątek, ale możesz również uzyskać dostęp do dzienników urządzenia, aby:

Ustawienia -> Prywatność -> Analityka -> Dane

Mam nadzieję, że to pomoże

pozdrowienia

Ramón Esteban
źródło