{"id":19765675,"url":"https://github.com/xuexiangjys/xlog","last_synced_at":"2025-04-30T15:30:38.755Z","repository":{"id":101672398,"uuid":"119240266","full_name":"xuexiangjys/XLog","owner":"xuexiangjys","description":"一个简易的日志打印框架（支持打印策略自定义，默认提供2种策略：logcat打印和磁盘打印）","archived":false,"fork":false,"pushed_at":"2023-12-15T02:53:40.000Z","size":2596,"stargazers_count":37,"open_issues_count":1,"forks_count":8,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-06T02:41:53.051Z","etag":null,"topics":["android","crash","log","x-library","xlog"],"latest_commit_sha":null,"homepage":"http://xuexiangjys.club/XLog/","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/xuexiangjys.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2018-01-28T08:15:19.000Z","updated_at":"2023-12-06T01:43:16.000Z","dependencies_parsed_at":"2024-01-19T16:09:39.048Z","dependency_job_id":"3eb25392-0f6b-4f18-a8a8-cdbea7e46174","html_url":"https://github.com/xuexiangjys/XLog","commit_stats":null,"previous_names":[],"tags_count":9,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xuexiangjys%2FXLog","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xuexiangjys%2FXLog/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xuexiangjys%2FXLog/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xuexiangjys%2FXLog/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/xuexiangjys","download_url":"https://codeload.github.com/xuexiangjys/XLog/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251731881,"owners_count":21634681,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","crash","log","x-library","xlog"],"created_at":"2024-11-12T04:18:59.446Z","updated_at":"2025-04-30T15:30:38.369Z","avatar_url":"https://github.com/xuexiangjys.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# XLog\n[![xl][xlsvg]][xl]  [![api][apisvg]][api]\n\n一个简易的日志打印框架（支持打印策略自定义，默认提供2种策略：logcat打印和磁盘打印）\n\n## 关于我\n\n[![github](https://img.shields.io/badge/GitHub-xuexiangjys-blue.svg)](https://github.com/xuexiangjys)   [![csdn](https://img.shields.io/badge/CSDN-xuexiangjys-green.svg)](http://blog.csdn.net/xuexiangjys)\n\n## 特征\n\n* 支持自定义日志格式策略IFormatStrategy和打印策略ILogStrategy。\n* 提供默认的两种日志打印方式：logcat（PrettyFormatStrategy）和磁盘打印（PrettyFormatStrategy）。\n* 兼容android logcat，VERBOSE、DEBUG、INFO、WARN、ERROR和WTF全都有，一个都不能少\n* 突破了logcat的4000字长度限制\n* 支持打印xml，json，模版String等形式。\n* 支持自定义日志文件存储形式（文件前缀、时间片存储等）。\n* 在日志文件的顶部，XLog提供了很多有用的运行环境相关的信息，比如操作系统信息、设备信息和应用信息\n* 支持时区设置。\n* 支持日志文件信息可选择打印。\n* 支持打印线程信息。\n* 支持打印方法的数量。\n* 支持捕捉并打印崩溃日志。\n* 支持自定义崩溃日志处理【默认提供了3种处理方式】。\n* 支持第三方打印接口适配。\n\n## 1、演示（请star支持）\n\n### 1.1、logcat打印效果\n\n#### 打印debug信息和json日志\n![](https://github.com/xuexiangjys/XLog/blob/master/img/1.jpg)\n\n#### 打印xml信息\n![](https://github.com/xuexiangjys/XLog/blob/master/img/2.jpg)\n\n#### 打印出错信息\n![](https://github.com/xuexiangjys/XLog/blob/master/img/3.jpg)\n\n### 1.2、磁盘打印效果\n\n#### 打印debug信息和json日志\n![](https://github.com/xuexiangjys/XLog/blob/master/img/6.jpg)\n\n#### 打印xml信息\n![](https://github.com/xuexiangjys/XLog/blob/master/img/5.jpg)\n\n#### 打印出错信息\n![](https://github.com/xuexiangjys/XLog/blob/master/img/4.jpg)\n\n## 2、如何使用\n目前支持主流开发工具AndroidStudio的使用，直接配置build.gradle，增加依赖即可.\n\n### 2.1、Android Studio导入方法，添加Gradle依赖\n\n1.先在项目根目录的 build.gradle 的 repositories 添加:\n\n```\nallprojects {\n     repositories {\n        ...\n        maven { url \"https://jitpack.io\" }\n    }\n}\n```\n\n2.然后在dependencies添加:\n\n```\ndependencies {\n   ...\n   implementation 'com.github.xuexiangjys.XLog:xlog-core:1.2.1'\n   //崩溃处理相关（非必要）\n   implementation 'com.github.xuexiangjys.XLog:xlog-crash:1.2.1'\n}\n```\n\n### 2.2、初始化\n\n在Application中初始化\n\n```\nXLog.init(this);\n```\n\n### 2.3、构建Logger\n\n1.构建一个Logger需要一个日志格式化策略`IFormatStrategy`和一个日志打印策略`ILogStrategy`。\n\n其中，日志格式化策略`IFormatStrategy`应当持有日志打印策略`ILogStrategy`。而Logger持有日志格式化策略。\n\n* XLog负责全局日志Logger的调度。\n\n* Logger负责对外提供日志打印的能力（API）。\n\n* IFormatStrategy负责对日志内容进行格式化显示处理。\n\n* ILogStrategy负责进行具体的日志打印。\n\n日志打印的流程如下:\n\n```\nXLog -\u003e Logger -\u003e IFormatStrategy -\u003e ILogStrategy\n```\n\n下面是自定义构建一个磁盘打印Logger的方法：\n```\nILogStrategy diskLogStrategy = DiskLogStrategy.newBuilder()       //日志打印策略\n        .setLogDir(\"xlogDemo\")                                    //设置日志文件存储的根目录\n        .setLogPrefix(\"xlog\")                                     //设置日志文件名的前缀\n        .setLogSegment(LogSegment.FOUR_HOURS)                     //设置日志记录的时间片间隔\n        .setLogLevels(LogLevel.ERROR, LogLevel.DEBUG)             //设置日志记录的等级\n        .build();\nIFormatStrategy formatStrategy = DiskFormatStrategy.newBuilder()  //日志格式策略\n        .setShowThreadInfo(false)                                 //设置是否显示线程信息\n        .setTimeFormat(TimeUtils.LOG_LINE_TIME)                   //设置日志记录时间的时间格式\n        .setMethodCount(1)                                        //设置打印显示的方法数\n        .setLogStrategy(diskLogStrategy)                          //设置日志打印策略\n        .build();\nLogger.newBuilder(\"DiskLogger\")\n        .setFormatStrategy(formatStrategy)                        //设置日志格式策略\n        .build();\n```\n\n2.简约的日志Logger构建方法。\n\n为了方便Logger的构建，我提供了Logger静态生产工厂`LoggerFactory`。它包含了几种常用的Logger构造方法。\n\n* getLogger：获取自定义拼装的logger\n\n* getPrettyLogger： 获取漂亮的logger【打印方式是logcat】\n\n* getPrettyFormatStrategy： 获取漂亮的日志打印格式\n\n* getDiskLogStrategy： 获取磁盘打印的打印策略\n\n* getDiskFormatStrategy： 获取磁盘打印的格式策略\n\n* getSimpleDiskFormatStrategy： 获取简化的磁盘打印的格式策略\n\n* getDiskLogger： 获取磁盘打印的logger\n\n* getSimpleDiskLogger： 获取简化的磁盘打印的logger\n\n下面是使用`LoggerFactory`构建的一个磁盘打印Logger：\n\n```\nDiskLogStrategy diskLogStrategy = LoggerFactory.getDiskLogStrategy(\n        \"xlogDemo\", \"xlog\", LogLevel.ERROR, LogLevel.DEBUG\n);\nLoggerFactory.getSimpleDiskLogger(\"DiskLogger\", diskLogStrategy, 0);\n```\n\n如果需要构建一个日志目录为外部存储的绝对路径的磁盘打印Logger，可参见以下代码：\n\n```\n@Permission(PermissionConsts.STORAGE)\npublic void setDebugLogAbsolutePath() {  //由于设置的是外部自定义的目录，在Android6.0上需要动态申请存储权限\n    LoggerFactory.getDiskLogger(\"DEBUG_LOGGER\", Environment.getExternalStorageDirectory() + \"/xlog/logs/debug_logs\", true, \"debug_log_\", 0, LogLevel.DEBUG);\n}\n```\n\n### 2.4、日志记录\n\n```\nUserInfo userInfo = new UserInfo().setLoginName(\"xuexiang\").setPassword(\"12345678\");\nString json = new Gson().toJson(userInfo);\n\nXLog.get().d(json);                   //打印debug日志\nXLog.get().json(json);                //打印json信息\nXLog.get().xml(ResourceUtils.readStringFromAssert(this, \"AndroidManifest.xml\"));    //打印xml\n\ntry {\n    throw new NullPointerException(\"出错啦！\");\n} catch (Exception e) {\n    XLog.get().e(e);     //打印错误信息\n}\n```\n\n### 2.5、第三方日志接口适配\n\n我们在使用第三方库时，难免需要打印显示第三方库的日志到Logcat或者磁盘，那这个时候该怎么办呢？\n\n这个时候就可以使用Logger的`log`方法进行接口适配。\n\n```\n//适配第三方日志打印接口\nLogger.setLogger(new ILogger() {\n    @Override\n    public void log(int priority, String tag, String message, Throwable t) {\n        XLog.get().getLogger(\"LogUtils\").log(LoggerFactory.logPriority2LogLevel(priority), tag, message, t);\n    }\n});\n```\n\nlog方法的接口如下：\n\n```\n/**\n * 日志打印【提供具体日志打印的功能】\n *\n * @param level     日志打印等级\n * @param tag       日志标签\n * @param message   日志的信息\n * @param throwable 错误信息\n */\nvoid log(@LogLevel String level, String tag, String message, Throwable throwable);\n```\n\n### 2.6、程序崩溃Crash处理\n\n1.目前提供两种默认的Crash处理：\n\n* ToastCrashListener：简单的toast提示 + 程序自动启动。\n\n* SystemEmailCrashListener：系统方式发送崩溃日志邮件。\n\n* AutomaticEmailCrashListener：自动调用API发送崩溃日志邮件。\n\n* ShowActivityCrashListener：显示崩溃信息详情界面，支持崩溃信息的分享。\n\n\n```\nCrashHandler.getInstance().setOnCrashListener(new ToastCrashListener());\nCrashHandler.getInstance().setOnCrashListener(new SystemEmailCrashListener());\nCrashHandler.getInstance().setOnCrashListener(new AutomaticEmailCrashListener());\nCrashHandler.getInstance().setOnCrashListener(new ShowActivityCrashListener());\n```\n\n如果需要使用到邮件发送，需要进行相关邮件信息的配置：\n\n```\nXCrash.getInstance()\n    .setSendEmail(DEFAULT_SEND_EMAIL_ADDRESS)\n    .setAuthorizationCode(DEFAULT_SEND_PASSWORD)\n    .setToEmails(DEFAULT_TO_EMAIL_ADDRESS)\n    .setCcEmails(DEFAULT_CC_EMAIL_ADDRESS);\n```\n\n[通过Zapier绑定邮件和GitHub，自动提交issue的配置](https://github.com/wenmingvs/LogReport#github%E8%87%AA%E5%8A%A8%E6%8F%90%E4%BA%A4issue%E7%9A%84%E9%85%8D%E7%BD%AE)\n\n当然，你也可以实现你自己的崩溃Crash处理，只需要实现OnCrashListener接口即可。\n\n2.设置崩溃日志的输出根目录为外部绝对路径【默认的存储目录地址：/storage/emulated/0/Android/data/com.xxx.xxx/cache/crash_log】\n\n```\n/**\n * 设置崩溃日志输出根目录为绝对路径，路径为外部存储需要申请权限\n */\n@Permission(PermissionConsts.STORAGE)\npublic void setAbsolutePath() {\n    CrashHandler.getInstance().setAbsolutePath(true).setCrashLogDir(Environment.getExternalStorageDirectory() + \"/xlog/crash_logs/);\n}\n```\n\n\n## 特别感谢\n\nhttps://github.com/orhanobut/logger\n\nhttps://github.com/JiongBull/jlog\n\n\n## 联系方式\n\n[![](https://img.shields.io/badge/点击一键加入QQ群-602082750-blue.svg)](http://shang.qq.com/wpa/qunwpa?idkey=9922861ef85c19f1575aecea0e8680f60d9386080a97ed310c971ae074998887)\n\n![](https://github.com/xuexiangjys/XPage/blob/master/img/qq_group.jpg)\n\n\n[xlsvg]: https://img.shields.io/badge/XLog-v1.2.1-brightgreen.svg\n[xl]: https://github.com/xuexiangjys/XLog\n[apisvg]: https://img.shields.io/badge/API-14+-brightgreen.svg\n[api]: https://android-arsenal.com/api?level=14\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxuexiangjys%2Fxlog","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fxuexiangjys%2Fxlog","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxuexiangjys%2Fxlog/lists"}