java - 在 Android Studio logcat 中显示 java.util.logging.Logger 日志

标签 java android logging logcat

我需要在 Android Studio logcat 中查看来自 socket.io-client-java 的日志。例如:https://github.com/socketio/socket.io-client-java/blob/master/src/main/java/io/socket/client/IO.java#L70

  1. 为什么我在 logcat 中看不到 logger.fine(String.format("ignoring socket cache for %s", source)); 的输出?

  2. 上面例子中的logger设置为Fine,但是在Android Studio logcat中没有Fine级别(只有Verbose调试信息警告错误断言)。如何将级别从 java.util.logging.Logger 转换为 Android Studio logcat?

最佳答案

好的,Logcat 不显示它,因为默认记录器级别是信息。

这是非常适合我的解决方案。我现在在主要 Activity 中调试 socket.io

                import io.socket.client.Manager;
                import io.socket.client.Socket;
                @Override
                    protected void onCreate(Bundle savedInstanceState) {
                        super.onCreate(savedInstanceState);
                        AndroidLoggingHandler.reset(new AndroidLoggingHandler());           
                        java.util.logging.Logger.getLogger(Socket.class.getName()).setLevel(Level.FINEST);
                        java.util.logging.Logger.getLogger(io.socket.engineio.client.Socket.class.getName()).setLevel(Level.FINEST); 
                        java.util.logging.Logger.getLogger(Manager.class.getName()).setLevel(Level.FINEST);
                        }

可能的实用程序类

import android.util.Log;
import java.util.logging.*;
public class AndroidLoggingHandler extends Handler {

    public static void reset(Handler rootHandler) {
        Logger rootLogger = LogManager.getLogManager().getLogger("");
        Handler[] handlers = rootLogger.getHandlers();
        for (Handler handler : handlers) {
            rootLogger.removeHandler(handler);
        }
        LogManager.getLogManager().getLogger("").addHandler(rootHandler);
    }

    @Override
    public void close() {
    }

    @Override
    public void flush() {
    }

    @Override
    public void publish(LogRecord record) {
        if (!super.isLoggable(record))
            return;

        String name = record.getLoggerName();
        int maxLength = 30;
        String tag = name.length() > maxLength ? name.substring(name.length() - maxLength) : name;

        try {
            int level = getAndroidLevel(record.getLevel());
            Log.println(level, tag, record.getMessage());
            if (record.getThrown() != null) {
                Log.println(level, tag, Log.getStackTraceString(record.getThrown()));
            }
        } catch (RuntimeException e) {
            Log.e("AndroidLoggingHandler", "Error logging message.", e);
        }
    }

    static int getAndroidLevel(Level level) {
        int value = level.intValue();
        if (value >= 1000) {
            return Log.ERROR;
        } else if (value >= 900) {
            return Log.WARN;
        } else if (value >= 800) {
            return Log.INFO; 
        } else {
            return Log.DEBUG;
        }
    }
}

这里是原答案: https://stackoverflow.com/a/9047282/5127756

关于java - 在 Android Studio logcat 中显示 java.util.logging.Logger 日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34149542/

相关文章:

java - 模式语法异常 : Unexpected internal error near index 1 for `.split(File.separator)` under windows

android - 用于移动解决方案的 VR 耳机 (iOS\Android)

javascript - ASP.NET MVC - 使用 JavaScript

java - HttpSession 不工作?

java - App Engine爆炸了Gradle的war文件夹问题

java - 所有 Activity 中都可用的选项菜单

android - 如何通过 Android 上的 Wi-Fi 热点以编程方式启动本地网络连接?

android - 通过后退按钮关闭弹出窗口

ruby-on-rails - 如何在我的 ruby​​gem 中写入将在 Rails 应用程序中使用的日志?

docker - 如何从控制台或Docker容器读取日志