黑莓日志文件

时间:2011-04-10 13:25:00

标签: blackberry

是否有使用blackberry api创建日志文件的方法?

像log4j?

我想在运行模拟器的电脑上保存这个日志文件,这可能吗?

2 个答案:

答案 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));
    }
}