63

iOS ロギングに cocoaLumberjack ロギング フレームワークを使用しています。ログをファイルに保存するために、このコードを使用しました。

DDFileLogger* fileLogger = [[DDFileLogger alloc] init];
fileLogger.rollingFrequency = 60 * 60 * 24; 
fileLogger.logFileManager.maximumNumberOfLogFiles = 7;

[DDLog addLogger:fileLogger];

DDLogVerbose(@"hello");
NSLog(@"hihihihihi");

このコードによって生成されたログファイルが保存されている正確な場所を見つけることができません。誰かがこの問題を手伝ってくれますか?

4

9 に答える 9

74

接続されたデバイスからログ ファイルをダウンロードするか、アプリから直接送信することができます。両方のアプローチについて以下に説明します。

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 ケーブルを介して、デバイスから直接ログ ファイルを取得します

デバイスでの実行中にアプリが作成したログ ファイルを取得する場合は、

  1. デバイスを Mac に接続する
  2. Xcode で、[ウィンドウ] -> [デバイス] に移動します。
  3. デバイス リストの左上で、接続されているデバイスをクリックします。
  4. メイン パネルの [Installed Apps] セクションで、CocoaLumberjack を実行したアプリケーションをクリックします。
  5. [インストール済みアプリ] リストの下部にある歯車アイコンをクリックし、[コンテナーをダウンロード] をクリックします。
  6. Finder で、保存した .xcappdata ファイルを右クリック (メニューを表示) し、[パッケージの内容を表示] を選択します。
  7. ログファイルは次の場所に保存されます/AppData/Library/Caches/Logs/

これが役に立ったら、賛成票を投じてください!

于 2012-12-22T05:33:17.293 に答える
65

ここでの回答は、複数のログ ファイルが存在する可能性があるという事実を説明していないようです。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];
    }
}
于 2012-07-18T15:16:03.047 に答える
32

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

コンソールとファイルの両方に。

于 2012-07-10T19:45:07.577 に答える
8

これが最新であることがわかりました:

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 プロパティに従って、アーカイブされたログ ファイルは自動的に削除されます。

于 2014-02-18T07:20:30.357 に答える
7

答えを得た

Library/Appication Support/Iphone Simulator/#version no#/applications/#your application#/documents/logs/log-3hex no> に保存されます

于 2011-06-21T08:44:12.103 に答える
6

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

ddLogLevel定数ファイルに設定することを忘れないでください。

Constants.h :

extern NSUInteger const ddLogLevel;

Comstants.m :

NSUInteger const ddLogLevel =
#ifdef DEBUG
LOG_LEVEL_VERBOSE;
#else
LOG_LEVEL_ERROR;
#endif

非常に明白ですが、 AppDelegate.mファイルで CocoaLumberjack を構成することを忘れないでください。

[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];

このコードを貼り付ける最適な場所は- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;AppDelegate.mファイルです。また、 AppDelegate.mヘッダーに次のコード行を追加する必要があります。

#import <CocoaLumberjack/CocoaLumberjack.h>

それが役立つことを願っています。

于 2016-10-04T14:53:20.133 に答える
1

これが他の誰かに役立つかどうかはわかりません...以前の回答を取得してSwift 5に渡しました。すべてのパスを取得するだけでなく、コンテンツを出力します。

let logFileLogger = DDFileLogger()
print(logFileLogger.logFileManager.logsDirectory)

for path in logFileLogger.logFileManager.sortedLogFilePaths {
    do {
        let content = try String(contentsOfFile: path, encoding: .utf8)
        print(content)
    } catch let error as NSError {
        print("Error: \(error.localizedDescription)")
    }
}
于 2020-04-02T16:22:41.440 に答える