是否有使用blackberry api创建日志文件的方法?
像log4j?
我想在运行模拟器的电脑上保存这个日志文件,这可能吗?
答案 0 :(得分:3)
BlackBerry有自己的日志工具 - EventLogger,但我发现它很难看。您可以写信至EventLogger
,但you can not view it as easily as you might with other logs或者您无法以编程方式提取内容以通过http /电子邮件发送。
我认为使用自定义记录器类将日志条目直接写入SD卡上的日志文件会更加舒适。由于模拟器上的SD卡是PC上的文件夹,因此您可以使用任何PC日志查看器实时监控应用程序。
此外,作为这种方法的奖励,您可以使用一些代码通过http /电子邮件发送日志。在真实设备上进行此类登录会显着降低应用程序的速度,因此通常不应该在生产中使用它,但您的应用程序可能具有此类选项(以启用调试程序),因此它将允许知道否则将保留的原因未知的。
答案 1 :(得分:3)
在Antair,在开发我们的BlackBerry应用程序期间,我们经常在我们的应用程序的开发版中包含一个调试控制台。
使用调试控制台,当dev版本在模拟器中运行时,所有调试输出都会到达输出屏幕,当dev构建在物理测试设备上运行时,调试输出会自动保持并可在专用屏幕,可通过菜单选项或按钮上拉。通过一些代码修改,您可以轻松地将调试日志重新路由到文件,通过电子邮件发送或通过网络连接发送。
以下代码是我们公司使用的调试控制台的精简版本。
使用控制台很简单。在项目中包含代码,为您的应用程序填写 PERSISTENCE_GUID ,设置 TAGID 字符串以在调试日志中标识您的应用程序名称,以及何时输出调试语句,只需调用 Debug.print(“这里发生的事情......”);
调试输出的每一行,在模拟器中运行时在输出窗口中,在设备上查看时都在调试控制台屏幕中,将包含调试消息,即调用的线程号(有用) for thread / ui debugging),以及日志语句的日期/时间,以及用于性能分析的毫秒时间戳。
要在真实设备上查看调试控制台,只需调用 pushScreen(new AntairLogScreen())即可。屏幕有一个内置的菜单项来清除持久的日志消息,并且会像常规应用程序屏幕一样自行解除。
如果您正在运行RIM编译器预处理器以在开发,QA和生产版本之间切换,您可以简单地调用以设置 Debug.ENABLED = false 以用于除开发构建之外的所有内容,当您需要调试时,调试控制台将在那里,并在您不需要时安静地离开。
代码如下。
// ---------------------------------------------------------------------------
// Antair Debug Log (for the BlackBerry API)
// http://www.antair.com
// ---------------------------------------------------------------------------
package com.antair.examples.debug;
import net.rim.device.api.i18n.SimpleDateFormat;
import java.util.Date;
import net.rim.device.api.collection.util.BigVector;
import net.rim.device.api.system.PersistentObject;
import net.rim.device.api.system.PersistentStore;
import net.rim.device.api.ui.MenuItem;
import net.rim.device.api.ui.component.Menu;
import net.rim.device.api.ui.component.RichTextField;
import net.rim.device.api.ui.container.MainScreen;
import net.rim.device.api.util.Persistable;
final class Debug implements Persistable
{
final static boolean ENABLED = true;
final static String TAGID = "MY_PROJECT";
final static long PERSISTENCE_GUID = /* YOUR OWN PERSISTENCE GUID */;
private BigVector _messages = new BigVector();
static String print(String str)
{
if ( Debug.ENABLED )
{
StringBuffer sb = new StringBuffer();
sb.append(TAGID);
sb.append("\n");
sb.append(Thread.currentThread().toString());
sb.append("\n");
sb.append(new SimpleDateFormat("MM/dd/yy HH:mm:ss:SSS").format(
new Date()));
sb.append("\n");
sb.append(str); sb.append("\n");
str = sb.toString();
System.out.println(str);
System.out.flush();
Debug d = load();
d._messages.addElement(str);
save(d);
}
return str;
}
static BigVector getPersistedMessages()
{
return load()._messages;
}
static void clearPersistedMessages()
{
save(new Debug());
}
private static Debug load()
{
Debug d = null;
try
{
PersistentObject po =
PersistentStore.getPersistentObject(Debug.PERSISTENCE_GUID);
synchronized(po)
{
Object obj = po.getContents();
d = (obj == null) ? new Debug() : (Debug)obj;
}
}
catch ( Exception e )
{
d = new Debug();
}
return d;
}
private static void save(Debug d)
{
try
{
PersistentObject po =
PersistentStore.getPersistentObject(Debug.PERSISTENCE_GUID);
synchronized(po)
{
po.setContents(d);
po.commit();
}
}
catch ( Exception e )
{
}
}
}
final class ClearAntairLogScreenMenuItem extends MenuItem
{
ClearAntairLogScreenMenuItem(int position)
{
super("Clear Log", position, 0);
}
public void run()
{
Debug.clearPersistedMessages();
}
}
final class AntairLogScreen extends MainScreen
{
AntairLogScreen()
{
super(MainScreen.DEFAULT_CLOSE|MainScreen.DEFAULT_MENU);
StringBuffer text = new StringBuffer();
BigVector logItems = Debug.getPersistedMessages();
for ( int i = 0 ; i < logItems.size() ; ++i )
{
text.append((String)logItems.elementAt(i) + "\n");
}
add(new RichTextField(text.toString()));
}
protected void makeMenu ( Menu menu, int instance )
{
menu.add(new ClearAntairLogScreenMenuItem(100000));
}
}