Поток вывода Android LogCat на SD-карту - PullRequest
6 голосов
/ 07 августа 2011

Я хочу добиться следующего, но пока безуспешно

  • Открыть файл на SD-карте при первом запуске приложения для Android.
  • Потоковый вывод logcat нафайл.
  • При выходе из приложения остановите потоковую передачу logcat.

В моем ApplicationClass расширяется метод Application onCreate (), я делаю это

wwLogManager.openLogFile();

, а вот код в openLogFile ()

        private static final String LOGCAT_COMMAND = "logcat -v time -f ";
        String timestamp = Long.toString(System.currentTimeMillis());
        String logFileName = BuildConstants.LOG_LOCATION + "_" + timestamp + ".log";                    
        mLogFile = new File(Environment.getExternalStorageDirectory() + logFileName);
        mLogFile.createNewFile();
        String cmd = LOGCAT_COMMAND + mLogFile.getAbsolutePath();
        Runtime.getRuntime().exec(cmd);

Iя получаю файлы журнала на SD-карте, но выходные данные журнала в этих файлах не содержат никаких следов вызовов Log.i (), которые я поместил в свои действия.Правильно ли здесь использована команда logcat?Спасибо!

Ответы [ 4 ]

6 голосов
/ 07 августа 2011

Я прошу прощения, если я неправильно понимаю ваши цели, но, возможно, вы могли бы использовать java.util.logging API вместо использования Logcat или механизма регистрации Android.

Как регистрация AndroidAPI, java.util.logging API позволяет легко регистрировать сообщения на различных уровнях, таких как FINE, FINER, WARN, SEVERE и т. Д.

Но стандартный API журналирования имеет дополнительныепреимущества тоже.Например, вы можете легко создать файл журнала , используя FileHandler .На самом деле, FileHandler имеет встроенный механизм ротации журналов, поэтому вам не нужно беспокоиться (так много) об очистке файлов журналов.Вы также можете создать иерархию Logger s;так, например, если у вас есть два Logger s, com.example.foo и com.example.foo.bar , изменив уровень ведения журналаПервый также изменит уровень регистрации последнего.Это будет даже работать, если два Logger созданы в разных классах!Кроме того, вы изменяете поведение ведения журнала во время выполнения, указывая файл конфигурации ведения журнала.Наконец, вы можете настроить формат журнала, внедрив свой собственный Formatter (или просто использовать SimpleFormatter , чтобы избежать формата XML по умолчанию).

Чтобы использоватьстандартное API ведения журнала, вы можете попробовать что-то вроде этого:

    // Logger logger is an instance variable
    // FileHandler logHandler is an instance variable

    try {
        String logDirectory =
            Environment.getExternalStorageDirectory() + "/log_directory";

        // the %g is the number of the current log in the rotation
        String logFileName = logDirectory + "/logfile_base_name_%g.log";

        // ...
        // make sure that the log directory exists, or the next command will fail
        // 

        // create a log file at the specified location that is capped 100kB.  Keep up to 5 logs.
        logHandler = new FileHandler(logFileName, 100 * 1024, 5);
        // use a text-based format instead of the default XML-based format
        logHandler.setFormatter(new SimpleFormatter());
        // get the actual Logger
        logger = Logger.getLogger("com.example.foo");
        // Log to the file by associating the FileHandler with the log
        logger.addHandler(logHandler);
    }
    catch (IOException ioe) {
        // do something wise
    }

    // examples of using the logger
    logger.finest("This message is only logged at the finest level (lowest/most-verbose level)");
    logger.config("This is an config-level message (middle level)");
    logger.severe("This is a severe-level message (highest/least-verbose level)");

Механизм ведения журнала Android, безусловно, прост и удобен.Это не очень настраиваемо, хотя, и фильтрация журнала должна быть сделана с тегами, которые могут легко стать громоздкими.Используя API java.uitl.logging , вы можете избежать работы с множеством тегов, но при этом легко ограничить файл журнала конкретными частями своего приложения, получить больший контроль над расположением и внешним видом журнала.и даже настроить поведение при ведении журнала во время выполнения.

4 голосов
/ 28 января 2012

Я публикую здесь свой ответ, чтобы @JPM и другие могли видеть ... Код в основном просто выполняет команду logcat, а затем создает журнал из входного потока.

final StringBuilder log = new StringBuilder();
try {        
    ArrayList<String> commandLine = new ArrayList<String>();
    commandLine.add("logcat");
    commandLine.add("-d");
    ArrayList<String> arguments = ((params != null) && (params.length > 0)) ? params[0] : null;
    if (null != arguments){
        commandLine.addAll(arguments);
    }

    Process process = Runtime.getRuntime().exec(commandLine.toArray(new String[0]));
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));

    String line;
    while ((line = bufferedReader.readLine()) != null){ 
        log.append(line);
        log.append(LINE_SEPARATOR); 
    }
} 
catch (IOException e){
        //
} 

return log;
3 голосов
/ 07 августа 2011

Попробуйте вручную установить фильтр, как описано здесь: http://developer.android.com/guide/developing/debugging/debugging-log.html#filteringOutput

Что-то вроде:

logcat ActivityManager:I MyApp:V *:S

Если вы замените «MyApp» на используемые вами теги журнала, это должнопоказать все информационные (и более) журналы из ActivityManager и все подробные (и более) журналы из вашего приложения.

0 голосов
/ 14 декабря 2013

Я знаю, что это поздний ответ на вопрос, но я настоятельно рекомендую использовать Logback для записи сообщений в файл журнала, а также logcat.

  1. Copy logback-android-1.0.10-2.jar и slf4j-api-1.7.5.jar в папку libs.
  2. Щелкните правой кнопкой мыши на обеих библиотеках ив меню выберите Путь сборки -> Добавить к пути сборки.
  3. Создайте файл logback.xml в папке с активами и введите следующее:


  

  
  
    
      %msg
    
  

  
  
    
      WARN
    

    ${LOG_DIR}/log.txt

    
      %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
      
  

  
  
    
    
  
  1. Для записи журнала:

    открытый класс MyActivity extends Activity {public static final Logger logger = LoggerFactory.getLogger (MyActivity.class);

    protected void onCreate(Bundle b)
    {
        super(b);
        try{
            throw new Exception("Test");
        }catch(Exception e){
            logger.error("Something bad happened",e);
        }
    }
    

    }

...