Logcat 使用之-在程序中记录

本文详细介绍了如何使用 Android 的 logcat 工具进行日志记录和读取。通过实例展示了如何配置 logcat 过滤规则并将其应用到程序中,同时提供了在 Android 应用中读取 logcat 日志并保存到 SD 卡的具体实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1:首先讲述一下logcat指令

logcat [<option>] ... [<filter-spec>] ...

* 注意:filter-spec 【过滤规则】必须放在最后

如下

//logcat time -f /sdcard/log.txt *:E //过滤规则放到参数的最后

不能将 -f 指令放到最后

2:在程序中读取日志

思想是:在程序中开启一个Process 启动logcat。

然后开启另一个线程读取logcat中的数据流, 并输出到文件中

完成源码如下

需要的权限,分别是【读取log,操作sdcard】

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


 

package com.mmb.shop.service;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.InputStream;
import java.io.InputStreamReader;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;

/**
 * logcat [<option>] ... [<filter-spec>] ...
 * 注意:filter-spec必须放在最后
 * @author coffee
 */
public class LogService extends Service {
	private static final String TAG = "LogService";


	private String LOG_FILE = "/sdcard/log.txt"; // 

	private LogOutputThread logThread;
	private Process proc;
	@Override
	public IBinder onBind(Intent arg0) {
		return null;
	}
	@Override
	public void onCreate() {
		super.onCreate();
		//logcat time -f /sdcard/log.txt *:E //过滤规则放到参数的最后
		String cmdLine = "logcat -v time"; //-v 是格式化,意思是输出时间   *:E *代表任意TAB, E指的是过滤级别
		try{
			proc = Runtime.getRuntime().exec(cmdLine);
			logThread = new LogOutputThread(proc.getInputStream());
			logThread.start();
			//proc.waitFor();
		}catch(Exception e){
			e.printStackTrace();
		}
	}

	 
	@Override
	public void onDestroy() {
		super.onDestroy();
		if (proc != null) {
			proc.destroy();
		}
		logThread.setOver(true);//结束log线程
	}
	/**
	 * log线程
	 * 负责从stdout流中读取log
	 * @author coffee
	 */
	public  class LogOutputThread extends Thread {
		private BufferedReader reader;
		private BufferedWriter writer;
		private boolean isOver = false;
		
		public LogOutputThread(InputStream in){
			try{
				reader = new BufferedReader(new InputStreamReader(in));
				writer = new BufferedWriter(new FileWriter(new File(LOG_FILE)));
			}catch(Exception e){
				Log.e(TAG, e.getMessage());
			}
		}
		
		@Override
		public void run() {
			String line = null;
			try{
				while(true){
					line = reader.readLine();
					if(line != null){
						writer.write(line);
						writer.write("\n");
						writer.flush();
					}
					if(isOver){
						break;
					}
				}
			}catch(Exception e){
				e.printStackTrace();
			}
		}
		public void setOver(boolean isOver) {
			this.isOver = isOver;
		}
	}

}



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值