প্রয়োগের মধ্যে লগক্যাট প্রোগ্রামগতভাবে পড়ুন


116

আমি আমার অ্যাপ্লিকেশনটিতে লগক্যাট লগগুলি পড়তে এবং প্রতিক্রিয়া জানাতে চাই।

আমি নিম্নলিখিত কোডটি পেয়েছি:

try {
  Process process = Runtime.getRuntime().exec("logcat -d");
  BufferedReader bufferedReader = new BufferedReader(
  new InputStreamReader(process.getInputStream()));

  StringBuilder log=new StringBuilder();
  String line = "";
  while ((line = bufferedReader.readLine()) != null) {
    log.append(line);
  }
  TextView tv = (TextView)findViewById(R.id.textView1);
  tv.setText(log.toString());
  } 
catch (IOException e) {}

এই কোডটি প্রকৃতপক্ষে অ্যাপ্লিকেশন শুরু হওয়া অবধি লগক্যাট লগগুলি প্রদান করে -

তবে কি নতুন লগক্যাট লগগুলি একটানা শুনতে পারা সম্ভব?


1
-D বিকল্পটি লগটিকে ডাম্প করবে এবং প্রস্থান করবে। কেবল -d বিকল্পটি সরিয়ে ফেলুন এবং লগক্যাটটি প্রস্থান করবে না।
Frohnzie

1
আমি কীভাবে এটি পরিষ্কার করতে পারি? - আমার অ্যাপ্লিকেশন সম্পর্কিত আমার একটি নির্দিষ্ট লাইন খুঁজে পাওয়া দরকার
ডেভিড

1
কোন রুট প্রয়োজন।
লুইস

2
যদি রুটের প্রয়োজন হয় না, কেবল উন্নয়ন বিল্ড তার নিজস্ব লগ অ্যাক্সেস করতে পারে? এবং ঠিক এই কোডটি কার্যকর করা হয় যেখানে? APK অ্যাপ্লিকেশন সহ?
আইয়াপ্পা

2
আমি একটি পরীক্ষা করার চেষ্টা করেছি। আমি কেবল আমার নিজের প্রক্রিয়ার ইভেন্টগুলি পড়তে সক্ষম হয়েছি। আমি মনে করি আপনার অন্যান্য প্রক্রিয়া ইভেন্টগুলি পড়তে রুট দরকার।
তবুওtiti99

উত্তর:


55

উপরের আপনার কোডটিতে "-d" পতাকাটি সরিয়ে আপনি লগগুলি পড়া চালিয়ে যেতে পারেন।

"-D" পতাকাটি লগ ক্যাটকে লগ সামগ্রী প্রদর্শন করতে এবং প্রস্থান করার নির্দেশ দেয়। আপনি পতাকাটি সরিয়ে ফেললে লগক্যাটটি শেষ হবে না এবং এতে যুক্ত হওয়া কোনও নতুন লাইন প্রেরণ করা চালিয়ে যাবে।

ঠিক মনে রাখবেন যে সঠিকভাবে ডিজাইন না করা থাকলে এটি আপনার অ্যাপ্লিকেশনটিকে ব্লক করতে পারে।

শুভকামনা


আমি যদি অ্যাপ্লিকেশনটিকে "-d" মুছে ফেলি এবং আমি জোর করে বন্ধ কথোপকথন পেয়ে যাচ্ছি।
ডেভিড

21
আমি উপরে যেমন বলেছি, এটির জন্য একটি যত্নশীল অ্যাপ্লিকেশন ডিজাইন প্রয়োজন। আপনার উপরের কোডটি পৃথক থ্রেডে চালিত হওয়া দরকার (ইউআইকে ব্লক করা এড়াতে) এবং আপনি লগের তথ্য সহ ইউআইতে পাঠ্যদর্শনটি আপডেট করতে চান, আপনাকে তথ্যটি ইউআইতে পোস্ট করার জন্য একটি হ্যান্ডলার ব্যবহার করতে হবে।
লুইস

2
হাই লুইস, দয়া করে আপনি আলাদা থ্রেডের উদাহরণ কোড পোস্ট করতে পারেন?
img.simone

উত্তর স্ট্যাকওভারফ্লো. com/a/59511458/1185087 দেখুন এটি কর্টাইন ব্যবহার করছে যা ইউআই থ্রেডকে অবরুদ্ধ করে না।
ব্যবহারকারী 1185087

8

সদৃশ লাইনগুলি এড়ানোর জন্য কোনও ফাইলটিতে লগক্যাট লেখার পরে সাফ করার জন্য আপনি এই পদ্ধতিটি ব্যবহার করে আপনার লগক্যাটটি সাফ করতে পারেন:

public void clearLog(){
     try {
         Process process = new ProcessBuilder()
         .command("logcat", "-c")
         .redirectErrorStream(true)
         .start();
    } catch (IOException e) {
    }
}

আমি সবেমাত্র আবিষ্কার করেছি যে লগ সাফ করতে কিছুটা সময় নিতে পারে। সুতরাং আপনি যদি লগটি সাফ করেন এবং তারপরে তাত্ক্ষণিকভাবে লগটি পড়েন তবে কিছু পুরানো এন্ট্রি এখনও সাফ করা হয়নি। এছাড়াও, কিছু নতুন যুক্ত হওয়া লগ এন্ট্রিগুলি মুছে ফেলা যেতে পারে কারণ তারা পরিষ্কার হয়ে যাওয়ার আগে যুক্ত হয় added আপনি প্রক্রিয়া কল করেও কোনও পার্থক্য রাখে না wa
টম রথিক

6

কর্টিনগুলি এবং অফিসিয়াল লাইফসাইকেল-লাইভডাটা-কেটিএক্স এবং লাইফসাইকেল-ভিউমডেল-কেটিএক্স লাইব্রেরি সহ এটি সহজ:

class LogCatViewModel : ViewModel() {
    fun logCatOutput() = liveData(viewModelScope.coroutineContext + Dispatchers.IO) {
        Runtime.getRuntime().exec("logcat -c")
        Runtime.getRuntime().exec("logcat")
                .inputStream
                .bufferedReader()
                .useLines { lines -> lines.forEach { line -> emit(line) }
        }
    }
}

ব্যবহার

val logCatViewModel by viewModels<LogCatViewModel>()

logCatViewModel.logCatOutput().observe(this, Observer{ logMessage ->
    logMessageTextView.append("$logMessage\n")
})

দুর্দান্ত পরামর্শ। আমি ভাবছি এর WebViewপরিবর্তে এই কাজটি করার কোনও উপায় আছে কিনা TextView
ফাতেহ

4

এখানে একটি দ্রুত পুট-টুগেদার / ড্রপ-ইন রয়েছে যা সমস্ত বর্তমান বা সমস্ত নতুন (শেষ অনুরোধের পরে) লগ আইটেম ক্যাপচারের জন্য ব্যবহার করা যেতে পারে।

আপনার এটিকে সংশোধন / প্রসারিত করা উচিত, কারণ আপনি লগক্যাপচারের পরিবর্তে অবিচ্ছিন্ন ধারাটি ফিরে আসতে চাইতে পারেন।

অ্যান্ড্রয়েড লগগ্যাট "ম্যানুয়াল": https://developer.android.com/studio/command-line/logcat.html

import android.util.Log;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Stack;

/**
* Created by triston on 6/30/17.
*/

public class Logger {

  // http://www.java2s.com/Tutorial/Java/0040__Data-Type/SimpleDateFormat.htm
  private static final String ANDROID_LOG_TIME_FORMAT = "MM-dd kk:mm:ss.SSS";
  private static SimpleDateFormat logCatDate = new SimpleDateFormat(ANDROID_LOG_TIME_FORMAT);

  public static String lineEnding = "\n";
  private final String logKey;

  private static List<String> logKeys = new ArrayList<String>();

  Logger(String tag) {
    logKey = tag;
    if (! logKeys.contains(tag)) logKeys.add(logKey);
  }

  public static class LogCapture {
    private String lastLogTime = null;
    public final String buffer;
    public final List<String> log, keys;
    LogCapture(String oLogBuffer, List<String>oLogKeys) {
      this.buffer = oLogBuffer;
      this.keys = oLogKeys;
      this.log = new ArrayList<>();
    }
    private void close() {
      if (isEmpty()) return;
      String[] out = log.get(log.size() - 1).split(" ");
      lastLogTime = (out[0]+" "+out[1]);
    }
    private boolean isEmpty() {
      return log.size() == 0;
    }
    public LogCapture getNextCapture() {
      LogCapture capture = getLogCat(buffer, lastLogTime, keys);
      if (capture == null || capture.isEmpty()) return null;
      return capture;
    }
    public String toString() {
      StringBuilder output = new StringBuilder();
      for (String data : log) {
        output.append(data+lineEnding);
      }
      return output.toString();
    }
  }

  /**
   * Get a list of the known log keys
   * @return copy only
   */
  public static List<String> getLogKeys() {
    return logKeys.subList(0, logKeys.size() - 1);
  }

  /**
   * Platform: Android
   * Get the logcat output in time format from a buffer for this set of static logKeys.
   * @param oLogBuffer logcat buffer ring
   * @return A log capture which can be used to make further captures.
   */
  public static LogCapture getLogCat(String oLogBuffer) { return getLogCat(oLogBuffer, null, getLogKeys()); }

  /**
   * Platform: Android
   * Get the logcat output in time format from a buffer for a set of log-keys; since a specified time.
   * @param oLogBuffer logcat buffer ring
   * @param oLogTime time at which to start capturing log data, or null for all data
   * @param oLogKeys logcat tags to capture
   * @return A log capture; which can be used to make further captures.
   */
  public static LogCapture getLogCat(String oLogBuffer, String oLogTime, List<String> oLogKeys) {
    try {

      List<String>sCommand = new ArrayList<String>();
      sCommand.add("logcat");
      sCommand.add("-bmain");
      sCommand.add("-vtime");
      sCommand.add("-s");
      sCommand.add("-d");

      sCommand.add("-T"+oLogTime);

      for (String item : oLogKeys) sCommand.add(item+":V"); // log level: ALL
      sCommand.add("*:S"); // ignore logs which are not selected

      Process process = new ProcessBuilder().command(sCommand).start();

      BufferedReader bufferedReader = new BufferedReader(
        new InputStreamReader(process.getInputStream()));

      LogCapture mLogCapture = new LogCapture(oLogBuffer, oLogKeys);
      String line = "";

      long lLogTime = logCatDate.parse(oLogTime).getTime();
      if (lLogTime > 0) {
        // Synchronize with "NO YEAR CLOCK" @ unix epoch-year: 1970
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date(oLogTime));
        calendar.set(Calendar.YEAR, 1970);
        Date calDate = calendar.getTime();
        lLogTime = calDate.getTime();
      }

      while ((line = bufferedReader.readLine()) != null) {
        long when = logCatDate.parse(line).getTime();
        if (when > lLogTime) {
          mLogCapture.log.add(line);
          break; // stop checking for date matching
        }
      }

      // continue collecting
      while ((line = bufferedReader.readLine()) != null) mLogCapture.log.add(line);

      mLogCapture.close();
      return mLogCapture;
    } catch (Exception e) {
      // since this is a log reader, there is nowhere to go and nothing useful to do
      return null;
    }
  }

  /**
   * "Error"
   * @param e
   */
  public void failure(Exception e) {
    Log.e(logKey, Log.getStackTraceString(e));
  }

  /**
   * "Error"
   * @param message
   * @param e
   */
  public void failure(String message, Exception e) {
    Log.e(logKey, message, e);
  }

  public void warning(String message) {
    Log.w(logKey, message);
  }

  public void warning(String message, Exception e) {
    Log.w(logKey, message, e);
  }

  /**
   * "Information"
   * @param message
   */
  public void message(String message) {
    Log.i(logKey, message);
  }

  /**
   * "Debug"
   * @param message a Message
   */
  public void examination(String message) {
    Log.d(logKey, message);
  }

  /**
   * "Debug"
   * @param message a Message
   * @param e An failure
   */
  public void examination(String message, Exception e) {
    Log.d(logKey, message, e);
  }

}

আপনার প্রকল্পে যা ক্রিয়াকলাপ লগিং সম্পাদন করে:

Logger log = new Logger("SuperLog");
// perform logging methods

আপনি যখন "লগার" এর মাধ্যমে লগ করেছেন এমন সমস্ত কিছু ক্যাপচার করতে চান

LogCapture capture = Logger.getLogCat("main");

আপনি যখন ক্ষুধার্ত হন এবং আপনি আরও লগ স্নাক করতে চান

LogCapture nextCapture = capture.getNextCapture();

স্ট্রিং হিসাবে আপনি ক্যাপচারটি পেতে পারেন

String captureString = capture.toString();

অথবা আপনি ক্যাপচার লগ আইটেম সঙ্গে পেতে পারেন

String logItem = capture.log.get(itemNumber);

বিদেশী লগ কীগুলি ক্যাপচার করার জন্য সঠিক কোনও স্থিতিশীল পদ্ধতি নেই তবে এর উপায়ও কম নয়

LogCapture foreignCapture = Logger.getLogCat("main", null, foreignCaptureKeyList);

উপরের ব্যবহারটি আপনাকে Logger.this.nextCaptureবিদেশী ক্যাপচারের জন্য কল করার অনুমতি দেবে ।


লো-ওভারহেড [প্রক্রিয়াকরণে] কৌশলটির কারণে লগিং এবং বিশ্লেষণ সম্পাদন করার জন্য এটি সর্বোত্তম পদ্ধতি। এই কোডটিতে একটি বাগ থাকতে পারে বা নাও থাকতে পারে। সঠিক ম্যাচের জন্য সময় নির্বাচনের লগক্যাট চিকিত্সা অবশ্যই সময়ের চেয়ে বড় হতে হবে be সঠিক সময় নির্বাচনের অ্যালগরিদমের অভাবের সাথে পরবর্তী ক্যাপচারের প্রথম উপাদানটিতে একটি সদৃশ লগ এন্ট্রি তৈরি করা হবে।
হাইপারসোফট সিস্টেমগুলি

সময়ের ফর্ম্যাট এবং অ্যান্ড্রয়েড-লগকটের সময় বাছাইকারী বিকল্পের সাথে সম্পর্কিত লোকালগুলিতে নথির অভাব হতে পারে এমন বাগগুলি তৈরি করতে পারে যা সময়-ফর্ম্যাট-ইন্টারপোলেশন-পরিবর্তনগুলির প্রয়োজন হবে।
হাইপারসোফট সিস্টেমগুলি

হাই .. আমি আপনার কোড ব্যবহার করেছি তবে ফলাফলটি সর্বদা খালি থাকে। এখনও বৈধ?
img.simone

@ img.simone; আমি আমার কোড পুনর্বিবেচনার সাথে এটি আপডেট করেছি। অ্যান্ড্রয়েডের লগক্যাটটি কয়েকটি উপায়ে ভেঙে গেছে। প্রথমটি হ'ল লগক্যাটের তারিখ বিন্যাসের আউটপুটে কোনও বছরের উপাদান নেই, যা ১৯ 1970০ সালে একটি তারিখ তুলনা ফালব্যাক করে; দ্বিতীয়ত, তারিখের সাথে -t এবং -T বিকল্পটি নির্দিষ্ট তারিখে লগগুলি স্পিট করা শুরু করে না, তাই আমাদের তারিখটি পার্স করতে হবে এবং এটি ১৯ 1970০ সালে সংশ্লেষিত একটি সংখ্যাসূচক তারিখের সাথে তুলনা করতে হবে I আমি এটি পরীক্ষা করতে পারছি না আপনার জন্য আপডেট করুন, তবে এটি অবশ্যই কাজ করবে; কোডটি এই প্রসঙ্গে নির্দিষ্ট সংশোধনী সহ একটি ওয়ার্কিং রিপোজিটরি থেকে আসে।
হাইপারসোফট সিস্টেমগুলি

1
আপনি এখানে ওয়ার্কিং কোডের অধীনে খুঁজে পেতে পারেন git.hsusa.core.log.controller.AndroidLogController.java; আপনি এই "দ্রুত এবং নোংরা" সমাধানের পরিবর্তে আমার hscore লাইব্রেরিটি ব্যবহার করতে চাইতে পারেন। Hscore দিয়ে লগিং করতে আপনি ব্যবহার করবেন: public final static SmartLogContext log = SmartLog.getContextFor("MyLogContext");শুরু করার জন্য। এটি আরও ভাল API এর সাথে একইভাবে কাজ করে। আপনার যদি এর সাথে কোনও সাহায্যের প্রয়োজন হয় তবে আপনি আমার গিট হাব ইস্যু ট্র্যাকার ব্যবহার করতে পারেন।
হাইপারসোফট সিস্টেমগুলি

3

"-সি" পতাকাটি বাফারকে সাফ করে।

-সি পুরো লগ ক্লিয়ার করে (ফ্লাশ করে) এবং প্রস্থান করে।


উপরের কোডে -c কীভাবে ব্যবহার করতে হয়.আইফের লগে কিছু পাওয়া গেছে আমি এটি সাফ করতে চাই
যুব ツ

যুবা, ঠিক করুন: প্রক্রিয়া = রানটাইম.জেটআরটাইম ()। এক্সিকিউশন ("লগক্যাট-সি"); বাফারড্রেডার = নতুন বাফারড্রেডার (নতুন ইনপুটস্ট্র্রিম রিডার (প্রসেস.জেটইনপুটস্ট্রিম ()), 1024); লাইন = বাফারড্রেডার.ড্রেডলাইন ();
djdance

1
            //CLEAR LOGS
            Runtime.getRuntime().exec("logcat -c");
            //LISTEN TO NEW LOGS
            Process pq=Runtime.getRuntime().exec("logcat v main");
            BufferedReader brq = new BufferedReader(new InputStreamReader(pq.getInputStream()));
            String sq="";
            while ((sq = brq.readLine()) != null)
            {
              //CHECK YOUR MSG HERE 
              if(sq.contains("send MMS with param"))
              {
              }
            }

আমি এটি আমার অ্যাপ্লিকেশনটিতে ব্যবহার করছি এবং এটি কার্যকর হয়। এবং আপনি টাইমার টাস্কে উপরের কোডটি ব্যবহার করতে পারেন যাতে এটি আপনার মূল থ্রেডটি বন্ধ করে দেয়

        Timer t;
        this.t.schedule(new TimerTask()
        {
          public void run()
          {
            try
            {
                ReadMessageResponse.this.startRecord();//ABOVE METHOD HERE

            }
            catch (IOException ex)
            {
              //NEED TO CHECK SOME VARIABLE TO STOP MONITORING LOGS 
              System.err.println("Record Stopped");
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            finally
            {
                ReadMessageResponse.this.t.cancel();
            }
          }
        }, 0L);
      }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.