我想达到以下目的但到目前为止,没有运气
在我的ApplicationClass中扩展了Application onCreate()方法,我这样做
wwLogManager.openLogFile();
这是openLogFile()
中的代码 private static final String LOGCAT_COMMAND = "logcat -v time -f ";
String timestamp = Long.toString(System.currentTimeMillis());
String logFileName = BuildConstants.LOG_LOCATION + "_" + timestamp + ".log";
mLogFile = new File(Environment.getExternalStorageDirectory() + logFileName);
mLogFile.createNewFile();
String cmd = LOGCAT_COMMAND + mLogFile.getAbsolutePath();
Runtime.getRuntime().exec(cmd);
我确实在sd卡中获取了日志文件,但这些文件中的日志输出没有我在活动中放置的Log.i()调用的任何痕迹。我在这里使用的logcat命令是否正确?谢谢!
答案 0 :(得分:6)
如果我误解了你的目标,我很抱歉,但也许你可以使用java.util.logging API而不是使用Logcat或Android Logging机制。
与Android日志记录API类似,java.util.logging API允许您轻松记录各种级别的消息,例如FINE,FINER,WARN,SEVERE等。
但标准日志记录API也有其他优势。例如,您可以使用FileHandler轻松创建日志文件。事实上,FileHandler具有内置的日志轮换机制,因此您不必担心(如此多)清理日志文件。您还可以创建Logger s的层次结构;因此,例如,如果您有两个Logger, com.example.foo 和 com.example.foo.bar ,则更改日志记录级别前者也将改变后者的日志记录级别。如果在不同的类中创建了两个Logger,这甚至可以工作!此外,通过指定日志记录配置文件,可以在运行时更改日志记录行为最后,您可以通过实现自己的Formatter来自定义日志的格式(或者只使用SimpleFormatter来避免使用默认的XML格式。)
要使用标准日志记录API,您可以尝试以下方法:
// Logger logger is an instance variable
// FileHandler logHandler is an instance variable
try {
String logDirectory =
Environment.getExternalStorageDirectory() + "/log_directory";
// the %g is the number of the current log in the rotation
String logFileName = logDirectory + "/logfile_base_name_%g.log";
// ...
// make sure that the log directory exists, or the next command will fail
//
// create a log file at the specified location that is capped 100kB. Keep up to 5 logs.
logHandler = new FileHandler(logFileName, 100 * 1024, 5);
// use a text-based format instead of the default XML-based format
logHandler.setFormatter(new SimpleFormatter());
// get the actual Logger
logger = Logger.getLogger("com.example.foo");
// Log to the file by associating the FileHandler with the log
logger.addHandler(logHandler);
}
catch (IOException ioe) {
// do something wise
}
// examples of using the logger
logger.finest("This message is only logged at the finest level (lowest/most-verbose level)");
logger.config("This is an config-level message (middle level)");
logger.severe("This is a severe-level message (highest/least-verbose level)");
Android日志记录机制当然简单方便。但是,它不是可定制的,并且必须使用标记进行日志过滤,这很容易变得难以处理。通过使用java.uitl.logging API,您可以避免处理大量标记,但可以轻松地将日志文件限制为应用程序的特定部分,从而更好地控制日志的位置和外观,甚至可以自定义日志记录行为在运行时。
答案 1 :(得分:4)
我在这里重新发布我的答案,所以@JPM和其他人可以看到......代码基本上只是执行logcat命令,然后从输入流构建日志。
final StringBuilder log = new StringBuilder();
try {
ArrayList<String> commandLine = new ArrayList<String>();
commandLine.add("logcat");
commandLine.add("-d");
ArrayList<String> arguments = ((params != null) && (params.length > 0)) ? params[0] : null;
if (null != arguments){
commandLine.addAll(arguments);
}
Process process = Runtime.getRuntime().exec(commandLine.toArray(new String[0]));
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = bufferedReader.readLine()) != null){
log.append(line);
log.append(LINE_SEPARATOR);
}
}
catch (IOException e){
//
}
return log;
答案 2 :(得分:3)
尝试手动设置过滤器,如下所述: http://developer.android.com/guide/developing/debugging/debugging-log.html#filteringOutput
类似的东西:
logcat ActivityManager:I MyApp:V *:S
如果将“MyApp”替换为您正在使用的日志标记,那么应该显示来自ActivityManager的所有信息(和更多)日志,以及来自您应用的所有详细(和更高)日志。
答案 3 :(得分:0)
我知道这是问题的最新答案,但我强烈建议使用Logback将消息写入日志文件以及logcat。
%msg
WARN
${LOG_DIR}/log.txt
%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
写日志:
公共类MyActivity扩展了Activity { public static final Logger logger = LoggerFactory.getLogger(MyActivity.class);
protected void onCreate(Bundle b)
{
super(b);
try{
throw new Exception("Test");
}catch(Exception e){
logger.error("Something bad happened",e);
}
}
}