Ghi dữ liệu trên thiết bị và truy xuất nhật ký


81

Trên bản dựng gỡ lỗi trong Xcode, bất kể tôi đang sử dụng trình mô phỏng hay thiết bị thực tế, các câu lệnh NSLog, printf, fprintf khẳng định và NSAssert sẽ xuất hiện trên bảng điều khiển

Nếu bây giờ tôi chạy bản phát hành trên thiết bị (giả sử tôi gửi bản dựng chuyến bay thử nghiệm và mở rộng nó trên iPhone của mình; đây sẽ là bản phát hành), thì cái nào trong số này (nếu có) đang được ghi lại?

Và làm cách nào để lấy lại nhật ký?

NSLog có thực sự xuất ra thứ gì đó trên bản dựng phát hành không? Yếu tố quyết định là gì? Cho dù đó là viết cho stdout hay stderr? chỉ có stderr được ghi vào nhật ký thiết bị? Điều này có nghĩa là tôi phải sử dụng fprintf? CÓ BẤT KỲ ĐIỀU GÌ được ghi vào nhật ký thiết bị không? Điều đó có tồn tại sao? Nếu vậy, làm thế nào để nhặt nó lên?

Ai đó có thể làm rõ tình hình?


1
Đối với chỉ cần lưu các kết quả đầu ra như sử dụng tập tin này: stackoverflow.com/questions/28114110/...
Kiran P Nair

Câu trả lời:


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

Chỉ cần thêm khối mã này trong application:didFinishLaunchingWithOptionsphương thức trong tệp đại biểu ứng dụng và nó sẽ tạo tệp nhật ký trong thư mục tài liệu ứng dụng trên iPhone ghi lại tất cả các sự kiện nhật ký bảng điều khiển. Bạn cần nhập tệp này từ iTunes để xem tất cả các sự kiện trên bảng điều khiển.

Lưu ý: Trong tệp .plist, hãy đảm bảo rằng tệp đó Application supports iTunes file sharingtồn tại và được đặt thành để YESbạn có thể truy cập thông qua iTunes.

Để tải Logfiles: Khởi chạy itunes, sau khi thiết bị của bạn đã kết nối, chọn Ứng dụng - chọn Ứng dụng của bạn - trong Tài liệu Augument, bạn sẽ nhận được tệp của mình. Sau đó, bạn có thể lưu nó vào đĩa của mình


1
Cái này hoạt động ra sao? chỉ bằng cách có một .logtệp trong thư mục tài liệu iOS ghi đầu ra bảng điều khiển của bạn ở đó?
Ali

2
Làm thế nào để xóa các tệp nhật ký theo chương trình theo thứ tự ngày để ngăn bộ nhớ đĩa bị rò rỉ?
hkaraoglu

4
Không chắc liệu NSDocumentDirectorycó phù hợp với tệp nhật ký hay không - nó thường dành cho nội dung do chính người dùng tạo ra, nhưng tệp nhật ký là nội dung hỗ trợ ứng dụng, do đó có thể chúng thuộc NSLibraryDirectorythư mục con / Logs.
JustAMartin

Làm cách nào để xuất chi tiết nhật ký từ Windows PC?
Vineesh TP

1
@Ali nó hoạt động bằng cách liên kết bộ mô tả tệp stderr (đầu ra lỗi chuẩn) (tức là bộ mô tả tệp 2) với một tệp đang mở để ghi. Vì vậy, mỗi khi bạn in sang stderr, nó sẽ in ra tệp. Bằng cách đó, bạn bắt được đầu ra stderr của ứng dụng. Hệ thống nhật ký không biết gì về nó.
Đạn Goettsch

140

Trong Xcode 6.1.1, bạn có thể xem đầu ra NSLog bằng cách thực hiện như sau. Tuy nhiên, tôi không chắc liệu nó có cho phép bạn xem các bản ghi từ quá xa trong quá khứ hay không. Tôi chỉ thấy nó quay trở lại trong vài giờ.

Trong mọi trường hợp, đây là các bước:

  1. Trong Xcode, đi tới Window -> Devices.
  2. Chọn thiết bị của bạn trong bảng điều khiển bên trái.
  3. Nhấp vào mũi tên nhỏ như thể hiện trong ảnh chụp màn hình bên dưới.

nhập mô tả hình ảnh ở đây


3
Đây hẳn là câu trả lời chính xác ... Tôi đã dành nửa giờ để tìm nút nhật ký. Cảm ơn vì đã tiết kiệm thời gian của tôi ...
PrimaryChicken

1
chỉ NSLog. Đừng mong đợi cout hoặc printf ở đó.
Kiran

10
Bạn không thể lấy nhật ký từ các ứng dụng đã sản xuất / đã gửi bằng kỹ thuật này. Nó chỉ hữu ích trong khi gỡ lỗi.
Satyam

7
bạn đã thực hiện trong ngày của tôi, ví dụ hoàn hảo như thế nào không để thiết kế giao diện người dùng có thể họ nên đọc developer.apple.com/library/mac/documentation/UserExperience/...
Hofi

1
Bạn vừa cứu được thịt xông khói của tôi. Đã theo đuổi một lỗi chỉ xuất hiện trong phiên bản phát hành, nhật ký cho thấy vấn đề. Tôi đã xem cùng một hộp thoại đó và chưa bao giờ nghĩ đến việc nhấp vào mũi tên nhỏ, đây rõ ràng là biểu tượng chung cho "hiển thị nhật ký thiết bị trực tiếp". Cảm ơn bạn!
chacmool

23

Trong phiên bản nhanh 3.0, mã của Shyl sẽ thay đổi thành,

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)

tất cả các quy trình khác đều giống như được giải thích bởi Shyl

Chỉ cần thêm khối mã này vào phương thức application: didFinishLaunchingWithOptions trong tệp đại biểu ứng dụng và nó sẽ tạo tệp nhật ký trong thư mục tài liệu ứng dụng trên iPhone để ghi lại tất cả các sự kiện nhật ký bảng điều khiển. Bạn cần nhập tệp này từ iTunes để xem tất cả các sự kiện trên bảng điều khiển.

Lưu ý: Trong tệp .plist, hãy đảm bảo rằng tệp đó Application supports iTunes file sharingtồn tại và được đặt thành để YESbạn có thể truy cập thông qua iTunes.

Để tải Logfiles: Khởi chạy iTunes, sau khi thiết bị của bạn đã kết nối, chọn Ứng dụng - chọn Ứng dụng của bạn - trong Tài liệu Augument, bạn sẽ nhận được tệp của mình. Sau đó, bạn có thể lưu nó vào đĩa của mình


sửa cho tôi nếu tôi sai: Điều này thay đổi thư mục của nhật ký có nghĩa là nó được ghi ban đầu /var/db/diagnostics/. Xem tại đây .
Honey,

@Honey, nhật ký này sẽ được lưu trong thư mục tài liệu ứng dụng.
Kiran P Nair

Mã này luôn tạo tệp mới khi khởi chạy ứng dụng
DURGESH

Bất kỳ ý tưởng nào về cách làm cho điều này hoạt động khi nhật ký được thực thi trong Tiện ích mở rộng đồng hồ?
user2623825

1
@KiranPNair - tôi có thể làm điều này cho các câu lệnh print () hay chỉ NSLog?
Fra

12

NSLog được ghi vào nhật ký thiết bị trong bản phát hành sản xuất và bạn có thể kiểm tra điều này bằng cách kết nối iPhone với hệ thống của bạn và sử dụng Organizer. Chọn iPhone của bạn trong trình tổ chức, nhấp vào Nhật ký thiết bị. Bạn sẽ thấy tất cả các đầu ra NSLog trong nhật ký.


4
Cập nhật: Trong Xcode 6, bạn không thể đọc kết quả NSLog thông qua Nhật ký thiết bị nữa. Window> Organizer không còn liệt kê các thiết bị. Thay vào đó, Window> Devices liệt kê các thiết bị, nhưng chỉ hiển thị nhật ký sự cố.
Robert

1
Robert, trên màn hình Window> Devices của Xcode 6 có một đường kẻ vô hình gần mép dưới của màn hình. Nếu bạn kéo nó lên, bạn sẽ thấy nhật ký giao diện điều khiển của thiết bị bạn đã chọn. Tôi nghĩ rằng nó vô hình vì một lỗi giao diện người dùng trong Xcode.
oradyvan

7

Tôi thấy liên kết này từ APPLE rất thông tin và đầy đủ. Nó cung cấp cho bạn tất cả các tùy chọn để xem hoặc truy cập nhật ký của thiết bị cho dù chúng có được kết nối với máy phát triển của bạn hay không.

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


1
Tài liệu này đã lỗi thời một cách đáng kinh ngạc. Nó chỉ đề cập đến xCode 6. Phương pháp hoàn toàn khác đối với xCode 9 và 10
1800 INFORMATION

2

Có, NSLog xuất trên thiết bị. Bạn có thể thấy đầu ra của nó khi thiết bị của bạn được kết nối với máy Mac và sử dụng công cụ Xcode Organizer.


Người dùng có thể kiểm tra các nhật ký này thông qua iTunes không?
P i

3
Câu trả lời này stackoverflow.com/questions/2334664/… cho biết Tiện ích cấu hình iPhone có thể xuất nhật ký bảng điều khiển từ thiết bị
Denis


2

Tôi biết đây là một chủ đề cũ nhưng bạn cũng có thể có quyền truy cập vào nhật ký thiết bị, truy cập:

Cài đặt -> Bảo mật -> Phân tích -> Dữ liệu

Hy vọng điều này giúp đỡ

Trân trọng


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.