Android записи логов в текстовый файл - PullRequest
118 голосов
/ 18 ноября 2009

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

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

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();
            }
        }

Ответы [ 13 ]

236 голосов
/ 02 июня 2011

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

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();
   }
}
26 голосов
/ 26 ноября 2014

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

  1. Log4j - это стандартная реализация ведения журнала Java, и в настоящее время это проект Apache Software Foundation. Это не специфично для Android и поэтому имеет некоторые несовместимости с Android.
  2. SL4J - это не реализация логирования, это уровень абстракции. Это помогает избежать ситуаций, подобных каждой сторонней библиотеке зависимости от проекта, пытаясь использовать собственную регистрацию реализация как Log4j. Источник .

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

  1. Используйте logcat -f, как в этом ответе , чтобы войти в файл. Обратите внимание, что из Android 4.2, разрешение READ_LOGS не оказывает никакого влияния и каждый Приложение (если только телефон не рутирован) может только читать свои логи. Недостатком здесь является то, что буфер logcat является круглым и имеет размер предел. Возможно, вы не получите более ранние журналы.
  2. Используйте microlog4android (написано для мобильных устройств, таких как Android) как в предыдущем ответе . Там может быть способ, но я не мог понять, как использовать microlog4Android для входа во внутреннюю память приложения. Единственным вариантом для пути журналов было внешнее хранилище, такое как SDCard, и поэтому я не мог использовать это.
  3. Используйте Log4j с android-logging-log4j . Что значит android-logging-log4j делать? Это облегчает использование Log4j в Android давая две функции.

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

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

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

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

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

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

  3. Запись 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;
        }
    }
    
  4. В классе занятий

    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 jar с android-logging-log4j jar. Мне удалось войти во внутренний файл приложения, а затем отправить по электронной почте файл с setReadable(true, false)

23 голосов
/ 20 ноября 2012

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

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

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

    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" />

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

11 голосов
/ 20 ноября 2009

Предупреждение: я могу быть совершенно недопонимаю вас, но если все, что вам нужно, это файл журнала, почему пот?

Поместите это в 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.

Привет

8 голосов
/ 15 января 2015

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

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

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

slf4android поддерживается в основном @miensol.

Узнайте больше о slf4android в нашем блоге:

7 голосов
/ 06 февраля 2014

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

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 голосов
/ 20 мая 2010

Вы должны взглянуть на microlog4android. У них есть готовое решение для входа в файл.

http://code.google.com/p/microlog4android/

5 голосов
/ 22 сентября 2014

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

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

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

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

Log.d("yourappname", "Your message");
2 голосов
/ 10 февраля 2015

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

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

2 голосов
/ 18 ноября 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...