2014-01-26 77 views
0

我想设置一个日志处理程序来输出Android日志到文件到外部存储。下面的代码创建日志文件,但没有输出发送到文件,所以处理程序的配置显然是错误的。或者,也许这种安排不能指望工作?使用FileHandler清空Android日志文件()

该函数在主活动的onCreate()中调用。

private void logToFile(String path) { 
    try { 

     // Get package name 
     String packageName = MainActivity.class.getPackage().getName();   
     String logfileName = path + "/" + packageName + ".log";   

     Logger logger = Logger.getLogger(packageName); 
     logger.setLevel(Level.FINE); 

     FileHandler fileTxt = new FileHandler(logfileName); 

     SimpleFormatter formatterTxt = new SimpleFormatter(); 
     fileTxt.setFormatter(formatterTxt); 

     logger.addHandler(fileTxt); 

     Toast.makeText(this, "Logging to " + logfileName, Toast.LENGTH_LONG).show(); 

    } catch (IOException e) { 
     Log.d(TAG, e.getMessage()); 
    } 
    Log.i(TAG, "logging to filesystem enabled"); 
} 

回答

1

要写入上述所声明的记录器(并且因此,所附的处理程序,其写入一个文件),下面应该使用Log.i(TAG,“消息”)

private static final Logger logger = Logger.getLogger(TAG); 

public void someFunction() { 
    logger.info("message") 
} 

这些日志消息也会出现在logCat/debugger中,并提供TAG。 P.S. Java日志记录让我头痛...

0

我很沮丧不得不使用Logger而不是标准的Logcat Log.d(),Log.e()等等,所以我开始使用这个Frankenstein的怪物解读方式将Logcat放入LogRecord并使用FileHandler进行保存。

这意味着您可以轻松限制日志文件大小,并保留您的详细Android日志。

但是,这不会给你连续输出到文件。如果你不介意按下一个按钮或者在一次会话中调用它,那么它应该并不重要,因为Logcat不断更新。

(我强烈建议从非UI线程调用。)

FileHandler fh=null; 
String name; 
if (0 == Environment.getExternalStorageState().compareTo(Environment.MEDIA_MOUNTED)) 
    name = Environment.getExternalStorageDirectory().getAbsolutePath(); 
else 
    name = Environment.getDataDirectory().getAbsolutePath(); 
name += "/yourapp/yourapp"; 

try { 
    fh = new FileHandler(name, 1024*1024, 7, true); //Limit to 7 x 1MB files. 
    fh.setFormatter(new SimpleFormatter()); 

    //Try to read Logcat. 
     try { 
      //Dumps the entire logcat to std output. 
      Process processD = Runtime.getRuntime().exec("logcat -v long -d"); 
      BufferedReader bufferedReaderD = new BufferedReader(new InputStreamReader(processD.getInputStream())); 

      String lineD; 
      while ((lineD = bufferedReaderD.readLine()) != null){ 
       //Send to the file handler. 
       fh.publish(new LogRecord(Level.ALL, lineD)); 
      } 

      //Clear the logcat storage. Don't feel like rewriting old records. 
      Process processC = Runtime.getRuntime().exec("logcat -c"); 

    } catch (IOException e) { 
     Log.e(TAG, "Could not get Logcat logs."); 
     e.printStackTrace(); 
    } 

} catch (Exception e) { 

    Log.e("MyLog", "FileHandler exception", e); 

} finally { 
    if (fh != null) 
     fh.close(); 
}