Skip to content

xuexiangjys/XLog

Repository files navigation

XLog

xl api

一个简易的日志打印框架(支持打印策略自定义,默认提供2种策略:logcat打印和磁盘打印)

关于我

github csdn

特征

  • 支持自定义日志格式策略IFormatStrategy和打印策略ILogStrategy。
  • 提供默认的两种日志打印方式:logcat(PrettyFormatStrategy)和磁盘打印(PrettyFormatStrategy)。
  • 兼容android logcat,VERBOSE、DEBUG、INFO、WARN、ERROR和WTF全都有,一个都不能少
  • 突破了logcat的4000字长度限制
  • 支持打印xml,json,模版String等形式。
  • 支持自定义日志文件存储形式(文件前缀、时间片存储等)。
  • 在日志文件的顶部,XLog提供了很多有用的运行环境相关的信息,比如操作系统信息、设备信息和应用信息
  • 支持时区设置。
  • 支持日志文件信息可选择打印。
  • 支持打印线程信息。
  • 支持打印方法的数量。
  • 支持捕捉并打印崩溃日志。
  • 支持自定义崩溃日志处理【默认提供了3种处理方式】。
  • 支持第三方打印接口适配。

1、演示(请star支持)

1.1、logcat打印效果

打印debug信息和json日志

打印xml信息

打印出错信息

1.2、磁盘打印效果

打印debug信息和json日志

打印xml信息

打印出错信息

2、如何使用

目前支持主流开发工具AndroidStudio的使用,直接配置build.gradle,增加依赖即可.

2.1、Android Studio导入方法,添加Gradle依赖

1.先在项目根目录的 build.gradle 的 repositories 添加:

allprojects {
     repositories {
        ...
        maven { url "https://jitpack.io" }
    }
}

2.然后在dependencies添加:

dependencies {
   ...
   implementation 'com.github.xuexiangjys.XLog:xlog-core:1.2.1'
   //崩溃处理相关(非必要)
   implementation 'com.github.xuexiangjys.XLog:xlog-crash:1.2.1'
}

2.2、初始化

在Application中初始化

XLog.init(this);

2.3、构建Logger

1.构建一个Logger需要一个日志格式化策略IFormatStrategy和一个日志打印策略ILogStrategy

其中,日志格式化策略IFormatStrategy应当持有日志打印策略ILogStrategy。而Logger持有日志格式化策略。

  • XLog负责全局日志Logger的调度。

  • Logger负责对外提供日志打印的能力(API)。

  • IFormatStrategy负责对日志内容进行格式化显示处理。

  • ILogStrategy负责进行具体的日志打印。

日志打印的流程如下:

XLog -> Logger -> IFormatStrategy -> ILogStrategy

下面是自定义构建一个磁盘打印Logger的方法:

ILogStrategy diskLogStrategy = DiskLogStrategy.newBuilder()       //日志打印策略
        .setLogDir("xlogDemo")                                    //设置日志文件存储的根目录
        .setLogPrefix("xlog")                                     //设置日志文件名的前缀
        .setLogSegment(LogSegment.FOUR_HOURS)                     //设置日志记录的时间片间隔
        .setLogLevels(LogLevel.ERROR, LogLevel.DEBUG)             //设置日志记录的等级
        .build();
IFormatStrategy formatStrategy = DiskFormatStrategy.newBuilder()  //日志格式策略
        .setShowThreadInfo(false)                                 //设置是否显示线程信息
        .setTimeFormat(TimeUtils.LOG_LINE_TIME)                   //设置日志记录时间的时间格式
        .setMethodCount(1)                                        //设置打印显示的方法数
        .setLogStrategy(diskLogStrategy)                          //设置日志打印策略
        .build();
Logger.newBuilder("DiskLogger")
        .setFormatStrategy(formatStrategy)                        //设置日志格式策略
        .build();

2.简约的日志Logger构建方法。

为了方便Logger的构建,我提供了Logger静态生产工厂LoggerFactory。它包含了几种常用的Logger构造方法。

  • getLogger:获取自定义拼装的logger

  • getPrettyLogger: 获取漂亮的logger【打印方式是logcat】

  • getPrettyFormatStrategy: 获取漂亮的日志打印格式

  • getDiskLogStrategy: 获取磁盘打印的打印策略

  • getDiskFormatStrategy: 获取磁盘打印的格式策略

  • getSimpleDiskFormatStrategy: 获取简化的磁盘打印的格式策略

  • getDiskLogger: 获取磁盘打印的logger

  • getSimpleDiskLogger: 获取简化的磁盘打印的logger

下面是使用LoggerFactory构建的一个磁盘打印Logger:

DiskLogStrategy diskLogStrategy = LoggerFactory.getDiskLogStrategy(
        "xlogDemo", "xlog", LogLevel.ERROR, LogLevel.DEBUG
);
LoggerFactory.getSimpleDiskLogger("DiskLogger", diskLogStrategy, 0);

如果需要构建一个日志目录为外部存储的绝对路径的磁盘打印Logger,可参见以下代码:

@Permission(PermissionConsts.STORAGE)
public void setDebugLogAbsolutePath() {  //由于设置的是外部自定义的目录,在Android6.0上需要动态申请存储权限
    LoggerFactory.getDiskLogger("DEBUG_LOGGER", Environment.getExternalStorageDirectory() + "/xlog/logs/debug_logs", true, "debug_log_", 0, LogLevel.DEBUG);
}

2.4、日志记录

UserInfo userInfo = new UserInfo().setLoginName("xuexiang").setPassword("12345678");
String json = new Gson().toJson(userInfo);

XLog.get().d(json);                   //打印debug日志
XLog.get().json(json);                //打印json信息
XLog.get().xml(ResourceUtils.readStringFromAssert(this, "AndroidManifest.xml"));    //打印xml

try {
    throw new NullPointerException("出错啦!");
} catch (Exception e) {
    XLog.get().e(e);     //打印错误信息
}

2.5、第三方日志接口适配

我们在使用第三方库时,难免需要打印显示第三方库的日志到Logcat或者磁盘,那这个时候该怎么办呢?

这个时候就可以使用Logger的log方法进行接口适配。

//适配第三方日志打印接口
Logger.setLogger(new ILogger() {
    @Override
    public void log(int priority, String tag, String message, Throwable t) {
        XLog.get().getLogger("LogUtils").log(LoggerFactory.logPriority2LogLevel(priority), tag, message, t);
    }
});

log方法的接口如下:

/**
 * 日志打印【提供具体日志打印的功能】
 *
 * @param level     日志打印等级
 * @param tag       日志标签
 * @param message   日志的信息
 * @param throwable 错误信息
 */
void log(@LogLevel String level, String tag, String message, Throwable throwable);

2.6、程序崩溃Crash处理

1.目前提供两种默认的Crash处理:

  • ToastCrashListener:简单的toast提示 + 程序自动启动。

  • SystemEmailCrashListener:系统方式发送崩溃日志邮件。

  • AutomaticEmailCrashListener:自动调用API发送崩溃日志邮件。

  • ShowActivityCrashListener:显示崩溃信息详情界面,支持崩溃信息的分享。

CrashHandler.getInstance().setOnCrashListener(new ToastCrashListener());
CrashHandler.getInstance().setOnCrashListener(new SystemEmailCrashListener());
CrashHandler.getInstance().setOnCrashListener(new AutomaticEmailCrashListener());
CrashHandler.getInstance().setOnCrashListener(new ShowActivityCrashListener());

如果需要使用到邮件发送,需要进行相关邮件信息的配置:

XCrash.getInstance()
    .setSendEmail(DEFAULT_SEND_EMAIL_ADDRESS)
    .setAuthorizationCode(DEFAULT_SEND_PASSWORD)
    .setToEmails(DEFAULT_TO_EMAIL_ADDRESS)
    .setCcEmails(DEFAULT_CC_EMAIL_ADDRESS);

通过Zapier绑定邮件和GitHub,自动提交issue的配置

当然,你也可以实现你自己的崩溃Crash处理,只需要实现OnCrashListener接口即可。

2.设置崩溃日志的输出根目录为外部绝对路径【默认的存储目录地址:/storage/emulated/0/Android/data/com.xxx.xxx/cache/crash_log】

/**
 * 设置崩溃日志输出根目录为绝对路径,路径为外部存储需要申请权限
 */
@Permission(PermissionConsts.STORAGE)
public void setAbsolutePath() {
    CrashHandler.getInstance().setAbsolutePath(true).setCrashLogDir(Environment.getExternalStorageDirectory() + "/xlog/crash_logs/);
}

特别感谢

https://github.com/orhanobut/logger

https://github.com/JiongBull/jlog

联系方式

About

一个简易的日志打印框架(支持打印策略自定义,默认提供2种策略:logcat打印和磁盘打印)

Topics

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages