有时候程序出现异常停止,而logcat 的相关信息很快会被冲掉,因而不能够及时的获取异常信息。所以,借鉴别人的代码,写一个工具类,将相关logcat信息及时的保存到文件。
工具类代码:
import
java.io.BufferedReader;
import
java.io.File;
import
java.io.FileNotFoundException;
import
java.io.FileOutputStream;
import
java.io.IOException;
import
java.io.InputStreamReader;
import
java.text.SimpleDateFormat;
import
java.util.Date;
public
class
LogcatFileManager {
private
static
LogcatFileManager INSTANCE =
null
;
private
static
String PATH_LOGCAT;
private
LogDumper mLogDumper =
null
;
private
int
mPId;
private
SimpleDateFormat simpleDateFormat1 =
new
SimpleDateFormat(
"yyyyMMdd");
private
SimpleDateFormat simpleDateFormat2 =
new
SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss"
);
public
static
LogcatFileManager getInstance() {
if
(INSTANCE ==
null
) {
INSTANCE =
new
LogcatFileManager();
}
return
INSTANCE;
}
private
LogcatFileManager() {
mPId = android.os.Process.myPid();
}
private
void
setFolderPath(String folderPath) {
File folder =
new
File(folderPath);
if
(!folder.exists()) {
folder.mkdirs();
}
if
(!folder.isDirectory())
throw
new
IllegalArgumentException(
"The logcat folder path is not a directory: "
+ folderPath);
PATH_LOGCAT = folderPath.endsWith(
"/"
) ? folderPath : folderPath +
"/"
;
}
public
void
start(String saveDirectoy) {
setFolderPath(saveDirectoy);
if
(mLogDumper ==
null
)
mLogDumper =
new
LogDumper(String.valueOf(mPId), PATH_LOGCAT);
mLogDumper.start();
}
public
void
stop() {
if
(mLogDumper !=
null
) {
mLogDumper.stopLogs();
mLogDumper =
null
;
}
}
private
class
LogDumper
extends
Thread {
private
Process logcatProc;
private
BufferedReader mReader =
null
;
private
boolean
mRunning =
true
;
String cmds =
null
;
private
String mPID;
private
FileOutputStream out =
null
;
public
LogDumper(String pid, String dir) {
mPID = pid;
try
{
out =
new
FileOutputStream(
new
File(dir,
"logcat-"
+ simpleDateFormat1.format(
new
Date()) +
".log"
),
true
);
}
catch
(FileNotFoundException e) {
e.printStackTrace();
}
/**
*
* log level:*:v , *:d , *:w , *:e , *:f , *:s
*
* Show the current mPID process level of E and W log.
*
* */
// cmds = "logcat *:e *:w | grep \"(" + mPID + ")\"";
// cmds = "logcat | grep \"(" + mPID + ")\"";//show log of all level
// cmds = "logcat -s way";//Print label filtering information
cmds =
"logcat *:e *:i | grep \"("
+ mPID +
")\""
;
}
public
void
stopLogs() {
mRunning =
false
;
}
@Override
public
void
run() {
try
{
logcatProc = Runtime.getRuntime().exec(cmds);
mReader =
new
BufferedReader(
new
InputStreamReader(logcatProc.getInputStream()),
1024
);
String line =
null
;
while
(mRunning && (line = mReader.readLine()) !=
null
) {
if
(!mRunning) {
break
;
}
if
(line.length() ==
0
) {
continue
;
}
if
(out !=
null
&& line.contains(mPID)) {
out.write((simpleDateFormat2.format(
new
Date()) +
" "
+ line +
"\n"
).getBytes());
}
}
}
catch
(IOException e) {
e.printStackTrace();
}
finally
{
if
(logcatProc !=
null
) {
logcatProc.destroy();
logcatProc =
null
;
}
if
(mReader !=
null
) {
try
{
mReader.close();
mReader =
null
;
}
catch
(IOException e) {
e.printStackTrace();
}
}
if
(out !=
null
) {
try
{
out.close();
}
catch
(IOException e) {
e.printStackTrace();
}
out =
null
;
}
}
}
}
}
然后在相应的application 或 activity中加入如下代码:
private void startLogcatManager() { String folderPath = null; if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {// save in SD card first folderPath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "BDT-Logcat"; } else {// If the SD card does not exist, save in the directory of application. folderPath = this.getFilesDir().getAbsolutePath() + File.separator + "BDT-Logcat"; } LogcatFileManager.getInstance().start(folderPath); } private void stopLogcatManager() { LogcatFileManager.getInstance().stop(); }
在对应application 或 activity 对应onCreate()方法及onTerminate()调用对应接口,代码如下:
@Override public void onCreate() { super.onCreate(); startLogcatManager(); } @Override public void onTerminate() { stopLogcatManager(); super.onTerminate(); }