cocoaLumberjack을 사용하여 로그 파일이 저장되는 위치
iOS 로깅을 위해 cocoaLumberjack 로깅 프레임 워크를 사용하고 있습니다. 로그를 파일에 저장하기 위해이 코드를 사용했습니다.
DDFileLogger* fileLogger = [[DDFileLogger alloc] init];
fileLogger.rollingFrequency = 60 * 60 * 24;
fileLogger.logFileManager.maximumNumberOfLogFiles = 7;
[DDLog addLogger:fileLogger];
DDLogVerbose(@"hello");
NSLog(@"hihihihihi");
이 코드로 생성 된 로그 파일이 정확히 어디에 저장되어 있는지 찾을 수 없습니다. 누군가이 문제로 나를 도울 수 있습니까?
연결된 장치에서 로그 파일을 다운로드하거나 앱에서 직접 보낼 수 있습니다. 두 가지 방법 모두 아래에 설명되어 있습니다.
Swift에서 이메일을 통해 앱에서 로그 파일 보내기
DDFileLogger에 대한 참조가있는 클래스에 이것을 작성하십시오. 나는 이것을 사용자 정의 로거 클래스에 넣을 것입니다.MyLogger.swift
var ddFileLogger: DDFileLogger!
var logFileDataArray: [NSData] {
get {
let logFilePaths = ddFileLogger.logFileManager.sortedLogFilePaths() as! [String]
var logFileDataArray = [NSData]()
for logFilePath in logFilePaths {
let fileURL = NSURL(fileURLWithPath: logFilePath)
if let logFileData = try? NSData(contentsOfURL: fileURL, options: NSDataReadingOptions.DataReadingMappedIfSafe) {
// Insert at front to reverse the order, so that oldest logs appear first.
logFileDataArray.insert(logFileData, atIndex: 0)
}
}
return logFileDataArray
}
}
그런 다음 사용자가 버튼을 탭하여 로그를 보내고 싶다고 표시하면
// Required by MFMailComposeViewController
import MessageUI
@IBAction func writeEmailTapped(sender: AnyObject) {
if MFMailComposeViewController.canSendMail() {
let composeVC = MFMailComposeViewController()
composeVC.mailComposeDelegate = self
// Configure the fields of the interface.
composeVC.setToRecipients(["your-email@company.com"])
composeVC.setSubject("Feedback for app")
composeVC.setMessageBody("", isHTML: false)
let attachmentData = NSMutableData()
for logFileData in MyLogger.sharedInstance.logFileDataArray {
attachmentData.appendData(logFileData)
}
composeVC.addAttachmentData(attachmentData, mimeType: "text/plain", fileName: "diagnostic.log")
self.presentViewController(composeVC, animated: true, completion: nil)
} else {
// Tell user about not able to send email directly.
}
}
그 결과 diagnostic.log
함께 연결된 모든 로그 파일 인 라는 첨부 파일이있는 이메일 작성 팝업이 표시 됩니다.
특별 감사-이것은 다른 답변에서 제공하는 Objective-C 버전의 Swift 번역입니다.
USB 케이블을 통해 장치에서 직접 로그 파일 가져 오기
기기에서 실행하는 동안 앱이 생성 한 로그 파일을 가져 오려면
- 기기를 Mac에 연결
- Xcode에서 창-> 장치로 이동하십시오.
- 장치 목록의 왼쪽 상단에서 연결된 장치를 클릭합니다.
- 메인 패널의 설치된 앱 섹션에서 CocoaLumberjack을 실행 한 애플리케이션을 클릭합니다.
- 설치된 앱 목록 하단에서 기어 아이콘을 클릭 한 다음 컨테이너 다운로드를 클릭합니다.
- Finder에서 저장된 .xcappdata 파일을 마우스 오른쪽 버튼으로 클릭 (메뉴 표시)하고 패키지 내용 표시를 선택합니다.
- 로그 파일은 다음에 저장됩니다.
/AppData/Library/Caches/Logs/
이것이 도움이된다면 찬성 투표가 좋을 것입니다!
여기에 대한 대답은 여러 로그 파일이있을 수 있다는 사실을 설명하지 않는 것 같습니다. DDFileLogger 인스턴스의 logFileManager 속성을 사용하여 파일 정보를 반복 할 수 있습니다. 공용 메서드 및 속성에 대해서는 DDFileLogger.h를 확인하십시오. 다음을 사용할 수 있습니다.
- (NSString *)logsDirectory; - (NSArray *)unsortedLogFilePaths; - (NSArray *)unsortedLogFileNames; - (NSArray *)unsortedLogFileInfos; - (NSArray *)sortedLogFilePaths; - (NSArray *)sortedLogFileNames; - (NSArray *)sortedLogFileInfos;
다음은 로그 데이터를 가져오고 이메일로 보내기위한 솔루션입니다. 이 작성 시점에서 기본 로그 파일 수는 5 개입니다.
- (NSMutableArray *)errorLogData {
NSUInteger maximumLogFilesToReturn = MIN([KRLogManager sharedInstance].fileLogger.logFileManager.maximumNumberOfLogFiles, 10);
NSMutableArray *errorLogFiles = [NSMutableArray arrayWithCapacity:maximumLogFilesToReturn];
DDFileLogger *logger = [KRLogManager sharedInstance].fileLogger;
NSArray *sortedLogFileInfos = [logger.logFileManager sortedLogFileInfos];
for (int i = 0; i < MIN(sortedLogFileInfos.count, maximumLogFilesToReturn); i++) {
DDLogFileInfo *logFileInfo = [sortedLogFileInfos objectAtIndex:i];
NSData *fileData = [NSData dataWithContentsOfFile:logFileInfo.filePath];
[errorLogFiles addObject:fileData];
}
return errorLogFiles;
}
- (void)composeEmailWithDebugAttachment {
if ([MFMailComposeViewController canSendMail]) {
MFMailComposeViewController *mailViewController = [[MFMailComposeViewController alloc] init];
mailViewController.mailComposeDelegate = self;
NSMutableData *errorLogData = [NSMutableData data];
for (NSData *errorLogFileData in [self errorLogData]) {
[errorLogData appendData:errorLogFileData];
}
[mailViewController addAttachmentData:errorLogData mimeType:@"text/plain" fileName:@"errorLog.txt"];
[mailViewController setSubject:NSLocalizedString(@"Good Subject", @"")];
[mailViewController setToRecipients:[NSArray arrayWithObject:@"some@email.com"]];
[self presentModalViewController:mailViewController animated:YES];
}
else {
NSString *message = NSLocalizedString(@"Sorry, your issue can't be reported right now. This is most likely because no mail accounts are set up on your mobile device.", @"");
[[[UIAlertView alloc] initWithTitle:nil message:message delegate:nil cancelButtonTitle:NSLocalizedString(@"OK", @"") otherButtonTitles: nil] show];
}
}
CocoaLumberjack을 사용하는 경우 이미 구현 된 메서드를 가지고 DDFileLogger.h
있으며 노출 할 수 있습니다 currentLogFileInfo:
.
@interface DDFileLogger : DDAbstractLogger <DDLogger>
...
- (DDLogFileInfo *)currentLogFileInfo;
@end
그런 다음 다음을 사용하여 현재 파일의 경로에 프로그래밍 방식으로 액세스 할 수 있습니다.
// configure logger
DDFileLogger *fileLogger = [DDFileLogger new];
[DDLog addLogger:fileLogger];
[DDLog addLogger:[DDTTYLogger sharedInstance]];
DDLogInfo(@"log file at: %@", [[fileLogger currentLogFileInfo] filePath]);
내 iPhone에서 다음과 같이 인쇄되었습니다.
log file at: /var/mobile/Applications/3BE1219F-78BE-491C-B68C-74D6FA0C2EF1/Library/Caches/Logs/log-5D1286.txt
콘솔과 파일 모두에.
예를 들어, 쉽게 검색 할 수 있도록 iTunes 폴더에 저장하는 것과 같이 저장 위치를 제어 할 수 있습니다. fileLogger를 설정할 때 AppDelegate에서 이것을 사용하십시오.
NSString * applicationDocumentsDirectory = [[[[NSFileManager defaultManager]
URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject] path];
DDLogFileManagerDefault *documentsFileManager = [[DDLogFileManagerDefault alloc]
initWithLogsDirectory:applicationDocumentsDirectory];
DDFileLogger *fileLogger = [[DDFileLogger alloc]
initWithLogFileManager:documentsFileManager];
이것이 최신임을 발견했습니다.
DDFileLogger *fileLogger = [[DDFileLogger alloc] init];
fileLogger.logFileManager.logsDirectory;//THIS
공식 코드에서 :
기본 로그 파일 관리자.
모든 로그 파일은 logsDirectory 내에 있습니다. 특정 logsDirectory가 지정되지 않은 경우 기본 디렉터리가 사용됩니다. Mac에서는 ~ / Library / Logs /에 있습니다. iPhone에서는 ~ / Library / Caches / Logs에 있습니다. 로그 파일의 이름은 "log-.txt"이며, 여기서 uuid는 [0123456789ABCDEF] 집합으로 구성된 6 자의 16 진수입니다. 보관 된 로그 파일은 maximumNumberOfLogFiles 속성에 따라 자동으로 삭제됩니다.
답을 얻었다
Library / Appication Support / Iphone Simulator / # version no # / applications / # your application # / documents / logs / log-3hex no>에 저장됩니다.
Objective-C에서 이메일을 통해 앱의 로그 파일 보내기
Objective-C 코드 :
헤더에서 :
#import <MessageUI/MessageUI.h>
#import "DDLog.h"
#import "DDFileLogger.h"
구현에서 :
- (NSMutableArray *)errorLogData {
DDFileLogger *ddFileLogger = [DDFileLogger new];
NSArray <NSString *> *logFilePaths = [ddFileLogger.logFileManager sortedLogFilePaths];
NSMutableArray <NSData *> *logFileDataArray = [NSMutableArray new];
for (NSString* logFilePath in logFilePaths) {
NSURL *fileUrl = [NSURL fileURLWithPath:logFilePath];
NSData *logFileData = [NSData dataWithContentsOfURL:fileUrl options:NSDataReadingMappedIfSafe error:nil];
if (logFileData) {
[logFileDataArray insertObject:logFileData atIndex:0];
}
}
return logFileDataArray;
}
- (void)composeEmailWithDebugAttachment {
if ([MFMailComposeViewController canSendMail]) {
MFMailComposeViewController *mailViewController = [[MFMailComposeViewController alloc] init];
mailViewController.mailComposeDelegate = self;
NSMutableData *errorLogData = [NSMutableData data];
for (NSData *errorLogFileData in [self errorLogData]) {
[errorLogData appendData:errorLogFileData];
}
[mailViewController addAttachmentData:errorLogData mimeType:@"text/plain" fileName:@"filename.log"];
[mailViewController setSubject:NSLocalizedString(@"LogFile Subject", @"")];
[mailViewController setToRecipients:[NSArray arrayWithObject:@"email@email.com"]];
[self presentViewController:mailViewController animated:YES completion:nil];
} else {
NSString *message = NSLocalizedString(@"Sorry, your issue can't be reported right now. This is most likely because no mail accounts are set up on your mobile device.", @"");
[[[UIAlertView alloc] initWithTitle:nil message:message delegate:nil cancelButtonTitle:NSLocalizedString(@"OK", @"") otherButtonTitles: nil] show];
}
}
- (void)mailComposeController:(MFMailComposeViewController *)mailer didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error {
[self becomeFirstResponder];
[mailer dismissViewControllerAnimated:YES completion:nil];
}
로그 파일에 무언가를 추가하는 방법은 다음과 같습니다.
DDLogError(@"This is an error.");
DDLogWarn(@"This is a warning.");
DDLogInfo(@"This is just a message.");
DDLogVerbose(@"This is a verbose message.");
Don't forget to set your ddLogLevel
in your Constants-file.
Constants.h :
extern NSUInteger const ddLogLevel;
Comstants.m :
NSUInteger const ddLogLevel =
#ifdef DEBUG
LOG_LEVEL_VERBOSE;
#else
LOG_LEVEL_ERROR;
#endif
It is very obvious but don't forget to configure CocoaLumberjack in your AppDelegate.m file.
[DDLog addLogger:[DDASLLogger sharedInstance]];
[DDLog addLogger:[DDTTYLogger sharedInstance]];
DDFileLogger *fileLogger = [[DDFileLogger alloc] init];
[fileLogger setMaximumFileSize:(1024 * 1024)];
[fileLogger setRollingFrequency:(3600.0 * 24.0)];
[[fileLogger logFileManager] setMaximumNumberOfLogFiles:7];
[DDLog addLogger:fileLogger];
The best place to paste this code is - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
in your AppDelegate.m file. Also you should add this line of code in your AppDelegate.m header:
#import <CocoaLumberjack/CocoaLumberjack.h>
Hope it will help.
I had to rewrite it a little to be compatible with Swift 4...
var logFileDataArray: [Data] {
let logFilePaths = delegate.fileLogger.logFileManager.sortedLogFilePaths
var logFileDataArray = [Data]()
for logFilePath in logFilePaths {
let fileURL = URL(fileURLWithPath: logFilePath)
if let logFileData =
try? Data(contentsOf: fileURL, options: Data.ReadingOptions.mappedIfSafe) {
logFileDataArray.insert(logFileData, at: 0)
}
}
return logFileDataArray
}
func sendApplicationLog(text: String) {
if MFMailComposeViewController.canSendMail() {
let controller = MFMailComposeViewController()
controller.mailComposeDelegate = self
controller.setToRecipients(["dohan.rene@gmail.com"])
controller.setSubject("Log of motorkari iOS")
controller.setMessageBody(text, isHTML: false)
var attachmentData = Data()
for logFileData in logFileDataArray { attachmentData.append(logFileData) }
controller.addAttachmentData(attachmentData, mimeType: "text/plain",
fileName: "motorkari_ios_application.log")
present(controller, animated: true, completion: nil)
} else {
showMessage("Log cannot be send !")
}
}
ReferenceURL : https://stackoverflow.com/questions/6411549/where-is-logfile-stored-using-cocoalumberjack
'programing' 카테고리의 다른 글
.emacs에 무엇이 있습니까? (0) | 2021.01.16 |
---|---|
중복을 찾기 위해 T-SQL 코드를 얻는 방법은 무엇입니까? (0) | 2021.01.16 |
왜 new String (“”)은 컴파일되지만 char c = ''는 컴파일되지 않습니까? (0) | 2021.01.16 |
httpd 서버가 시작되지 않음 : (13) 권한이 거부 됨 : make_sock : 주소 [::] : 88에 바인딩 할 수 없습니다. (0) | 2021.01.16 |
JSF 페이지에서 요청 및 세션 매개 변수 및 속성 가져 오기 (0) | 2021.01.16 |