现在的位置: 首页 > 综合 > 正文

Android抓取系统日志,然后作为文本附件发送邮件

2013年12月07日 ⁄ 综合 ⁄ 共 3602字 ⁄ 字号 评论关闭

作为开发,我们深深体谅测试的同学。这里将代码嵌入到项目里面,测试只需要两秒钟就可以将抓取系统log并发送给开发了,大大节约了人力成本。

首先创建一个类,取名CustomlLogcat,作用是抓取系统log并写入文件。

public class CustomlLogcat
{
	public static String LOG_PATH = Environment.getExternalStorageDirectory() + File.separator + "custom_log.txt";
	
	public interface OnLogGetListener {
		public void onLogGet();
	}
	public static class MLog
	{
		public static void Log(final Context c ,final OnLogGetListener l)
		{
			final Thread th=new Thread(new Runnable()
			{
				@Override
				public void run()
				{
					getLog();
				}
			});
			Handler hanlder = new Handler();
			hanlder.post(new Runnable() {
				
				@Override
				public void run() {
					try {
						th.start();
					} finally {
						if (l != null) {
							l.onLogGet();
						}
					}
					
				}
			});
		}
		
		private static void getLog()
		{
			try
			{
				 deleteLog();
				ArrayList<String> cmdLine=new ArrayList<String>();   
				cmdLine.add("logcat");
				cmdLine.add("-d");
				cmdLine.add("*:W");
				
				ArrayList<String> clearLog=new ArrayList<String>(); 
				clearLog.add("logcat");
				clearLog.add("-c");
				
				Process process=Runtime.getRuntime().exec(cmdLine.toArray(new String[cmdLine.size()]));   
				BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(process.getInputStream()));

				String str=null;
				while((str=bufferedReader.readLine())!=null)	
				{
					Runtime.getRuntime().exec(clearLog.toArray(new String[clearLog.size()])); 
					writeLog(str);
				}
				
				if(str==null)
				{
				}
			}
			catch(Exception e)
			{
				e.printStackTrace();
			}
		}
		
		private static void deleteLog() {
			File f = new File(LOG_PATH);
			if (f.exists()) {
				f.delete();
			}
		}
		
		private static void writeLog(String str) {
			File f = new File(LOG_PATH);
			try {
				if (!f.exists()) {
					f.createNewFile();
				}
				FileWriter fw = new FileWriter(f ,true);
				fw.write(str);
				fw.write("\r\n");
				fw.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

以上代码需要注意的是,本人只抓取了warnning(W)级别以上的代码,所以传递给系统的命令代码是:

ArrayList<String> cmdLine=new ArrayList<String>();   
				cmdLine.add("logcat");
				cmdLine.add("-d");
				cmdLine.add("*:W");

接着,就可以把系统日志作为附件发送邮件给开发了。

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}

	
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
			menu.add(0, 0, 0, "抓取日志");
			menu.add(0, 1, 0, "发送邮件给小天天");
			menu.add(0, 2, 0, "发送邮件给小马马");
			menu.add(0, 3, 0, "发送邮件给小斌斌");
			menu.add(0, 4, 0, "发送邮件给小尊尊");
			menu.add(0, 5, 0, "发送邮件给小饼饼");
		return super.onCreateOptionsMenu(menu);
	}
	
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
			switch (item.getItemId()) {
			case 0:
				CustomlLogcat.MLog.Log(MainActivity.this, new OnLogGetListener() {
					
					@Override
					public void onLogGet() {
						Toast.makeText(MainActivity.this, "日志抓取完毕,可以发送邮件。", Toast.LENGTH_SHORT).show();
					}
				});
				break;
			case 1:
				sendLogMail(1);
				break;
			case 2:
				sendLogMail(2);
				break;
			case 3:
				sendLogMail(3);
				break;
			case 4:
				sendLogMail(4);
				break;
			case 5:
				sendLogMail(5);
				break;
			
		}
		return super.onOptionsItemSelected(item);
	}
	
	public void sendLogMail(int optionIndex) {
		File file = new File(CustomlLogcat.LOG_PATH); //附件文件地址
		 Intent intent = new Intent(Intent.ACTION_SEND);
		 if (optionIndex == 1) {
			 intent.putExtra(Intent.EXTRA_EMAIL, new String[]{"XXXX@XXXX.com"});  
		 } else if (optionIndex == 2) {
			 intent.putExtra(Intent.EXTRA_EMAIL, new String[]{"XXXX@XXXX.com"});  
		 } else if (optionIndex == 3) {
			 intent.putExtra(Intent.EXTRA_EMAIL, new String[]{"XXXXX@XXX.com"});  
		 } else if (optionIndex == 4) {
			 intent.putExtra(Intent.EXTRA_EMAIL, new String[]{"XXXX@XXXX.com"});  
		 } else if (optionIndex == 5) {
			 intent.putExtra(Intent.EXTRA_EMAIL, new String[]{"XXXX@XXXX.com"});  
		 } else {}
		 intent.putExtra("subject", "Android斗地主log--------------"); //
		 intent.putExtra("body", "详情查看附件-------------"); //正文
		 intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file)); //添加附件,附件为file对象
		            if (file.getName().endsWith(".gz")) {
		                intent.setType("application/x-gzip"); //如果是gz使用gzip的mime
		            } else if (file.getName().endsWith(".txt")) {
		                intent.setType("text/plain"); //纯文本则用text/plain的mime
		            } else {
		                intent.setType("application/octet-stream"); //其他的均使用流当做二进制数据来发送
		            }
		  startActivity(intent); //调用系统的mail客户端进行发送
	}

}

抱歉!评论已关闭.