一步步实现j2me游戏引擎(一),系统日志

    技术2022-05-19  23

    j2me不像j2ee那样,有很多出色的日志框架可以使用,如log4j,slf4j,logback等。现在公司里的代码,混乱着大量的system.out这样的代码,完全让人抓狂,做移植的时候调试完还要注释掉。囧囧囧。。。

     

    所以首先,至少要有个log工具。j2me的类库功能是十分有限的,尤其是MIDP1.0的规范,公司做全机型移植的时候,为了兼顾到比较脑残的手机,基本是在1.0的规范上编程的。经过我查的一些资料,j2se里面可以通过Throw的方法枚举到,方法的调用信息包括行号,方面名,参数等等。早期的log4j就是利用这个思实现的。但对于j2me,只有一个private的printStackTrace,里面封装了一个native方法获取调用信息,我们没办法自己调用。没辙。。。

     

    下面给出我对log类的一个封装:

     

    /** * */ package com.scottcgi.j2me.until; /** * @author scott.cgi * @since 2011-04-06 * * 日志记录 */ public class Log { private static byte DEBUG = 0; private static byte INFO = 1; private static byte WARN = 2; private static byte ERROR = 3; // 日志级别名称 private static Object[] levelName = { "Debug", "Info ", "Warn ", "Error" }; // 当前日志级别 private static byte curLogLevel = INFO; /** * info等级 * * @param text 日志信息 */ public static void info(String text) { Log.checkAndPrint(Log.INFO, text, null); } /** * info等级 * * @param text 日志信息 * @param params 信息占位替符换信息 */ public static void info(String text, Object[] params) { Log.checkAndPrint(Log.INFO, text, params); } /** * warn等级 * * @param text 日志信息 */ public static void warn(String text) { Log.checkAndPrint(Log.WARN, text, null); } /** * warn等级 * * @param text 日志信息 * @param params 信息占位替符换信息 */ public static void warn(String text, Object[] params) { Log.checkAndPrint(Log.WARN, text, params); } /** * debug等级 * * @param text 日志信息 * @param params 信息占位替符换信息 */ public static void debug(String text) { Log.checkAndPrint(Log.DEBUG, text, null); } /** * debug等级 * * @param text 日志信息 * @param params 信息占位替符换信息 */ public static void debug(String text, Object[] params) { Log.checkAndPrint(Log.DEBUG, text, params); } /** * error等级 * * @param text 日志信息 * @param params 信息占位替符换信息 */ public static void error(String text) { Log.checkAndPrint(Log.ERROR, text, null); } /** * error等级 * * @param text 日志信息 * @param params 信息占位替符换信息 */ public static void error(String text, Object[] params) { Log.checkAndPrint(Log.ERROR, text, params); } /** * 根据日志等级输出信息 * * @param level 日志等级 * @param text 日志信息 * @param params 信息占位替符换信息 */ private static void checkAndPrint(byte level, String text, Object[] params) { // 高于当前日志等级才输出信息 if(Log.curLogLevel <= level) { String sb = new StringBuffer() .append("[") .append(Log.levelName[level]) .append("]->> ") .append(text) .toString(); if(params != null) { sb = Log.format(sb.toString(), params); } // error用红色文字 if(level == Log.ERROR) { System.err.println(sb); } else { System.out.println(sb); } } } /** * 格式化带有占位符的信息 * 取自 MIDP2.1, com.sun.j2me.global.MessageFormat.format * * @param message 日志信息 * @param params 占位符信息 * @return 替换占位符后的信息 */ private static String format(String message, Object[] params) { if ((message == null) || (params == null)) { throw new NullPointerException( "Template or parameter array is null."); } boolean inside = false; boolean escaped = false; StringBuffer result = new StringBuffer(); StringBuffer placeholder = null; char lookingFor = '{'; for (int i = 0; i < message.length(); ++i) { char c = message.charAt(i); if (c == lookingFor) { if (escaped) { result.append(c); escaped = false; } else if (c == '{') { if ((i + 1 < message.length()) && (message.charAt(i + 1) == '{')) { escaped = true; } else { inside = true; lookingFor = '}'; placeholder = new StringBuffer(); } } else { inside = false; lookingFor = '{'; try { if (placeholder.length() > 2) { throw new IllegalArgumentException( "Illegal placeholder."); } int index = Integer.parseInt(placeholder.toString()); result.append(params[index]); } catch (ArrayIndexOutOfBoundsException ie) { throw new IllegalArgumentException( "Illegal number of parameters."); } } } else if (inside) placeholder.append(c); else { result.append(c); } } return result.toString(); } // test public static void main(String[] args) { Log.error("this is error text"); Log.info("this is info text"); Log.warn("this is {0}, {1}", new Object[] { "placeHolder", "fuck you !" }); } }  

     

    其实很简单,对于参数化的输出,我是拷贝了MIDP2.1里面的一个实现。 在给个截图:

     

     

     


    最新回复(0)