Android Запись журналов в текстовый файл

Я пытаюсь записать журналы в пользовательский файл Log.txt на Android файл, используя этот код Mine, но затем этот метод создает файл, но ничего не содержит. В основном я хочу прочитать предыдущее содержимое файла, а затем добавить свои данные с существующим контентом.

Код выглядит следующим образом:

public static void write(String str) 
    {
        InputStream fileInputStream = null;
        FileOutputStream fileOutpurStream = null;
        try
        { 
            fileInputStream = new FileInputStream(file);
            fileOutpurStream = new FileOutputStream(file);
            if(file.exists())
            {
                int ch = 0;
                int current = 0;
                StringBuffer buffer = new StringBuffer();
                while((ch = fileInputStream.read()) != -1)
                {
                    buffer.append((char) ch);
                    current++;
                }
                byte data[]=new byte[(int)file.length()];
                fileInputStream.read(data);   
                fileOutpurStream.write(data);
                fileOutpurStream.write(str.getBytes(),0,str.getBytes().length);
                fileOutpurStream.flush();
            } 
            else
            {   
                file.createNewFile();
                fileOutpurStream.write(str.getBytes(),0,str.getBytes().length);
                fileOutpurStream.flush();
            }
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            try
            {
                fileInputStream.close();
                fileOutpurStream.flush();
                fileOutpurStream.close();
                fileOutpurStream = null;
                fileInputStream = null;
            }
            catch (IOException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

Ответ 1

Надеюсь, это поможет...

public void appendLog(String text)
{       
   File logFile = new File("sdcard/log.file");
   if (!logFile.exists())
   {
      try
      {
         logFile.createNewFile();
      } 
      catch (IOException e)
      {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }
   }
   try
   {
      //BufferedWriter for performance, true to set append to file flag
      BufferedWriter buf = new BufferedWriter(new FileWriter(logFile, true)); 
      buf.append(text);
      buf.newLine();
      buf.close();
   }
   catch (IOException e)
   {
      // TODO Auto-generated catch block
      e.printStackTrace();
   }
}

Ответ 2

Для новичков в регистрации в Java в целом и регистрации Android

  • Log4j является общей реализацией java-протоколирования и теперь является проектом Основа программного обеспечения Apache. Это не особенность Android, и поэтому некоторые несовместимости с Android.
  • SL4J не является логической реализацией, это уровень абстракции. Это помогает избежать таких ситуаций, как, каждая сторонняя библиотека зависимости от проекта, пытаясь использовать собственный журнал как Log4j. Источник.

Некоторые опции для входа в txt в Android ниже

  • Используйте logcat -f, как в этом answer, чтобы войти в файл. Заметим, что из Разрешение Android 4.2, READ_LOGS не имеет никакого влияния, и каждый Приложение (если телефон не укоренен) мог читать только свои журналы. Недостатком здесь является то, что буфер logcat является круглым и имеет размер предел. Возможно, вы не получите более ранние журналы.
  • Используйте microlog4android (для мобильных устройств, таких как Android), как в предыдущем ответе. Может быть, есть способ, но я не мог понять, как использовать microlog4Android для входа в внутреннее хранилище приложения. Единственный вариант для пути к журналам - это внешнее хранилище, такое как sdcard, и поэтому я не мог его использовать.
  • Используйте Log4j с android-logging-log4j. Что значит android-logging-log4j do? Это упрощает использование Log4j в Android давая две функции.

    • возможность отправки журналов в logcat в дополнение к протоколированию файла
    • простой способ установить параметры конфигурации Log4j, такие как путь к файлу, максимальный размер файла, количество резервных копий и т.д., предоставляя класс LogConfigurator.

    Простой пример ниже. Обратите внимание, что объект logger в приведенном ниже примере - это возвращаемый объект Log4j, а не класс android-logging-log4j. Таким образом, android-logging-log4j используется только для настройки Log4j.

  • Тем не менее, попробуйте LogBack. LogBack разработан тем же человеком, который появились библиотеки Log4J 1.x и SL4J. Не относится к Log4j 2.x хотя.

Шаги для использования Log4j в Android.

  • Добавьте log4j-1.2.x.jar и android-logging-log4j-1.0.3.jar папка libs.

  • Добавить разрешения только при использовании внешнего хранилища
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

  • Напишите Log4j вспомогательный класс

    package com.example.logger;
    
    import android.os.Environment;
    import de.mindpipe.android.logging.log4j.LogConfigurator;
    
    public class Log4jHelper {
        private final static LogConfigurator mLogConfigrator = new LogConfigurator();
    
        static {
            configureLog4j();
        }
    
        private static void configureLog4j() {
            String fileName = Environment.getExternalStorageDirectory() + "/" + "log4j.log";
            String filePattern = "%d - [%c] - %p : %m%n";
            int maxBackupSize = 10;
            long maxFileSize = 1024 * 1024;
    
            configure( fileName, filePattern, maxBackupSize, maxFileSize );
        }
    
        private static void configure( String fileName, String filePattern, int maxBackupSize, long maxFileSize ) {
            mLogConfigrator.setFileName( fileName );
            mLogConfigrator.setMaxFileSize( maxFileSize );
            mLogConfigrator.setFilePattern(filePattern);
            mLogConfigrator.setMaxBackupSize(maxBackupSize);
            mLogConfigrator.setUseLogCatAppender(true);
            mLogConfigrator.configure();
    
        }
    
        public static org.apache.log4j.Logger getLogger( String name ) {
            org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger( name );
            return logger;
        }
    }
    
  • В классе Activity

    org.apache.log4j.Logger log= Log4jHelper.getLogger( "YourActivity" );
    log.error("Error");
    log.info("Info");
    log.warn("Warn");
    

Пример источника. Обратите внимание, что log4j 2.x(улучшенные функциональные возможности), переписанные с нуля, не отстает от log4j 1.x. Таким образом, вы должны использовать банку log4j 1.2.x с банком android-logging-log4j. Мне удалось войти в внутренний файл приложения и позже отправить файл с помощью setReadable(true, false)

Ответ 3

У меня работает microlog4android, но документация довольно скудная. Все, что им нужно добавить, это краткое руководство.

Вот краткое руководство, которое я нашел.

  1. Добавьте следующую статическую переменную в ваш основной Activity:

    private static final Logger logger = LoggerFactory.getLogger();
    
  2. Добавьте следующее в ваш onCreate():

    PropertyConfigurator.getConfigurator(this).configure();
    
  3. Создайте файл с именем microlog.properties и сохраните его в каталоге assets

  4. Отредактируйте файл microlog.properties следующим образом:

    microlog.level=DEBUG
    microlog.appender=LogCatAppender;FileAppender
    microlog.formatter=PatternFormatter
    microlog.formatter.PatternFormatter.pattern=%c [%P] %m %T
    
  5. Добавьте операторы регистрации следующим образом:

    logger.debug("M4A");
    

Для каждого класса вы создаете объект регистратора, как указано в 1)

6.Вы можете добавить следующее разрешение:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Вот источник для учебника

Ответ 4

Предупреждение: Возможно, вы совершенно не понимаете, но если все, что вы хотите, это файл журнала, зачем потеть?

Поместите это в файл bat (измените путь к вашему каталогу инструментов, а yourappname - это, конечно, ваше имя приложения):

cd "C:\devAndroid\Software\android-sdk-windows-1.6_r1\android-sdk-windows-1.6_r1\tools"
adb logcat -v time   ActivityManager:W  yourappname:D  *:W >"C:\devAndroid\log\yourappname.log"

Тогда в вашем коде просто сделайте что-то похожее на это:

Log.d("yourappname", "Your message");

Чтобы создать журнал, подключите USB-кабель и запустите файл bat.

Привет

Ответ 6

Это может быть поздно, но надеюсь, что это может помочь. Попробуйте это....

public void writefile()
    {
        File externalStorageDir = Environment.getExternalStorageDirectory();
        File myFile = new File(externalStorageDir , "yourfilename.txt");

        if(myFile.exists())
        {
           try
           {

        FileOutputStream fostream = new FileOutputStream(myFile);
        OutputStreamWriter oswriter = new OutputStreamWriter(fostream); 
        BufferedWriter bwriter = new BufferedWriter(oswriter);   
        bwriter.write("Hi welcome ");
        bwriter.newLine();            
        bwriter.close(); 
        oswriter.close(); 
        fostream.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
        else
        {
            try {
                myFile.createNewFile();
            }
            catch (IOException e) 
            {
                e.printStackTrace();
            }
        }

здесь bfwritter.newline записывает ваш текст в файл. И добавьте разрешение

 <uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE"/>

в файле манифеста обязательно.

Ответ 7

Используйте slf4android lib.
Это простая реализация slf4j api с помощью android java.util.logging. *.

Особенности:

  • запись в файл из коробки
  • запись в любой другой пункт назначения LoggerConfiguration.configuration().addHandlerToLogger
  • встряхните свое устройство, чтобы отправлять журналы со снимком экрана по электронной почте
  • действительно маленький, он взял только ~ 55kB

slf4android поддерживается главным образом @miensol.

Подробнее о slf4android в нашем блоге:

Ответ 8

Я решил эту проблему с помощью следующего куска кода в командной строке:

File outputFile = new File("pathToFile"); 
Runtime.getRuntime().exec("logcat -c");
Runtime.getRuntime().exec("logcat -v time -f " + outputFile.getAbsolutePath())

Где опция "время" добавляет детали поля метаданных для даты, времени вызова, приоритета/тэга и PID процесса, отправляющего сообщение.

Затем в вашем коде просто сделайте что-то похожее на это (используя android.util.Log):

Log.d("yourappname", "Your message");

Ответ 9

В общем, перед открытием потока необходимо иметь дескриптор файла. У вас есть дескриптор fileOutputStream перед createNewFile() в блоке else. Поток не создает файл, если он не существует.

Не очень специфический для Android, но для этого много IO. Что делать, если вы делаете много операций "писать" один за другим? Вы будете читать все содержимое и писать все содержимое, принимая время и, что более важно, время автономной работы.

Я предлагаю использовать java.io.RandomAccessFile, seek() 'до конца, а затем writeChars() для добавления. Это будет намного более чистый код и, вероятно, намного быстрее.

Ответ 10

Я создал простой, легкий класс (около 260 LoC), который расширяет стандартную реализацию android.util.Log с протоколированием на основе файлов:
Каждое сообщение журнала регистрируется через android.util.Log, а также записывается в текстовый файл на устройстве.

Вы можете найти его на github:
https://github.com/volkerv/FileLog

Ответ 11

Этот вариант намного короче

try {
    final File path = new File(
            Environment.getExternalStorageDirectory(), "DBO_logs5");
    if (!path.exists()) {
        path.mkdir();
    }
    Runtime.getRuntime().exec(
            "logcat  -d -f " + path + File.separator
                    + "dbo_logcat"
                    + ".txt");
} catch (IOException e) {
    e.printStackTrace();
}

Ответ 12

Вы можете использовать библиотеку, которую я написал. Это очень легко использовать:

Добавьте эту зависимость в ваш файл Gradle:

dependencies {
    compile 'com.github.danylovolokh:android-logger:1.0.2'
}

Инициализируйте библиотеку в классе Application:

File logsDirectory = AndroidLogger.getDefaultLogFilesDirectory(this);
    int logFileMaxSizeBytes = 2 * 1024 * 1024; // 2Mb
    try {
        AndroidLogger.initialize(
                this,
                logsDirectory,
                "Log_File_Name",
                logFileMaxSizeBytes,
                false
                );
    } catch (IOException e) {
        // Some error happened - most likely there is no free space on the system
    }

Вот как вы используете библиотеку:

AndroidLogger.v("TAG", "Verbose Message");

И вот как получить журналы:

AndroidLogger.processPendingLogsStopAndGetLogFiles(new AndroidLogger.GetFilesCallback() {
        @Override
        public void onFiles(File[] logFiles) {
            // get everything you need from these files
            try {
                AndroidLogger.reinitAndroidLogger();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    });

Вот ссылка на страницу github с дополнительной информацией: https://github.com/danylovolokh/AndroidLogger

Надеюсь, поможет.

Ответ 13

Многие из предыдущих версий log4j не работают (05/2019). Но вы можете использовать Hyperlog - я могу подтвердить, что он работает.

  1. Добавьте эту строку в ваш проект зависимостей и синхронизации

    implementation 'com.hypertrack:hyperlog:0.0.10'
    
  2. Создайте новый класс приложения (создайте новый класс Java и расширьте приложение). Затем в методе onCreate добавьте эти строки:

    HyperLog.initialize(this);
    HyperLog.setLogLevel(Log.VERBOSE);
    
    HyperLog.getDeviceLogsInFile(this);
    
  3. Измените файл манифеста, чтобы определить файл приложения.

    <application
        android:name=".AppClass"
        .....
    
  4. Различные способы входа:

    HyperLog.d(TAG,"debug");
    HyperLog.i(TAG,"information");
    HyperLog.e(TAG,"error");
    HyperLog.v(TAG,"verbose");
    HyperLog.w(TAG,"warning");
    HyperLog.a(TAG,"assert");
    HyperLog.exception(TAG,"exception",throwable);
    
  5. Найдите свои файлы журнала. Перейдите к

    RootFolder/android/data/"appPackageName/LogFiles/