Чтение файла, зарегистрированного через slf4android?

Я пишу журналы с помощью slf4android ( https://github.com/bright/slf4android ), но неясно, как их читать (в идеале я просто хотел бы загрузить их на свой компьютер). Внутренняя память приложения недоступна для других приложений. Могу ли я настроить slf4android для входа в общий каталог? Я пробовал это, но я получаю NOENT:

FileLogHandlerConfiguration fileHandler = LoggerConfiguration.fileLogHandler(this); File lol = this.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS); fileHandler.setFullFilePathPattern(fileHandler.toString() + "/my_log.%g.%u.log"); LoggerConfiguration.configuration().addHandlerToRootLogger(fileHandler); 

После того, как вы настроили запись в файл с помощью:

 FileLogHandlerConfiguration fileHandler = LoggerConfiguration.fileLogHandler(this); fileHandler.setFullFilePathPattern("/sdcard/your.package/my_log.log"); LoggerConfiguration.configuration().addHandlerToRootLogger(fileHandler); 

Существует два (оба простых) способа получить файл журнала:

  1. Использование NotifyDeveloperHandler (мой любимый)

    У slf4android есть очень приятная функция (по какой-то причине недокументированная), которая позволяет отправлять электронную почту на заданный адрес с журналами и снимками экрана, включенными в приложение .

     NotifyDeveloperHandler handler = LoggerConfiguration.configuration().notifyDeveloperHandler(this, "example@gmail.com"); handler.notifyWhenDeviceIsShaken(); LoggerConfiguration.configuration().addHandlerToRootLogger(handler); 

Это действительно удобно использовать (буквально), потому что вы можете инициировать действие отправки, встряхивая свое устройство.

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

  1. Использование adb

    Запустите adb pull /sdcard/your.package/my_log.log ~/my_log.log в терминале, чтобы скопировать файл журнала из устройства в домашний каталог.

Официальные документы говорят, что вы можете сделать это:

 FileLogHandlerConfiguration fileHandler = LoggerConfiguration.fileLogHandler(this); fileHandler.setFullFilePathPattern(SOMEPATH); LoggerConfiguration.configuration().addHandlerToRootLogger(fileHandler); 

И файл журнала будет расположен в SOMEPATH. Я бы рекомендовал использовать обычный каталог среды вместо произвольной строки, например

 Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS).getPath()+File.pathSeparator+"appLogs" 

Теперь, если вы хотите скопировать некоторые существующие журналы в пункт назначения outper, вы можете просто скопировать файлы.

 if(BuildConfig.DEBUG) { File logs = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS).getPath(), "logs"); FileLogHandlerConfiguration fileHandler = LoggerConfiguration.fileLogHandler(this); LoggerConfiguration.configuration().addHandlerToRootLogger(fileHandler); File currentLogs = fileHandler.getCurrentFileName(); if (currentLogs.exists()) { FileChannel src = new FileInputStream(currentLogs).getChannel(); FileChannel dst = new FileOutputStream(logs).getChannel(); dst.transferFrom(src, 0, src.size()); src.close(); dst.close(); } } 

Наконец, имейте в виду, что ничего не получится, если вы не получите правильные разрешения на хранение!

Надеюсь, поможет. Счастливое кодирование!

В примере кода, который вы указали, вы фактически не используете «File lol», который вы определили. Поэтому он, вероятно, терпит неудачу, потому что вы пытаетесь создать другой журнал поверх первого (например, в «/sdcard/your.package/my_log.%g.%u.log/my_log.%g.%u.log»);

Пытаться:

 File lol = this.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS); fileHandler.setFullFilePathPattern(lol.getAbsolutePath() + "/my_log.%g.%u.log"); 

Но вы также можете просто добавить пункт меню, который будет искать журналы, может быть zip их (вместе с db или что-то еще) и отправлять по электронной почте , загружать на сервер или просто копировать в другую папку.