https://github.com/jenly1314/logx
:triangular_flag_on_post: LogX 一个小而美的日志记录框架;好用不解释。
https://github.com/jenly1314/logx
android kotlin log log-printer logcat logger timber
Last synced: about 1 year ago
JSON representation
:triangular_flag_on_post: LogX 一个小而美的日志记录框架;好用不解释。
- Host: GitHub
- URL: https://github.com/jenly1314/logx
- Owner: jenly1314
- License: apache-2.0
- Created: 2024-04-28T15:58:28.000Z (about 2 years ago)
- Default Branch: master
- Last Pushed: 2024-12-10T16:13:25.000Z (over 1 year ago)
- Last Synced: 2025-03-24T16:21:11.522Z (over 1 year ago)
- Topics: android, kotlin, log, log-printer, logcat, logger, timber
- Language: Kotlin
- Homepage: https://jenly1314.github.io/LogX/
- Size: 3.73 MB
- Stars: 17
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
# LogX
[](https://raw.githubusercontent.com/jenly1314/LogX/master/app/release/app-release.apk)
[](https://repo1.maven.org/maven2/com/github/jenly1314/logx)
[](https://jitpack.io/#jenly1314/LogX)
[](https://circleci.com/gh/jenly1314/LogX)
[](https://android-arsenal.com/api?level=21)
[](http://www.apache.org/licenses/LICENSE-2.0)
**LogX** 一个小而美的日志记录框架;既有 **Timber** 的易用性与可扩展性,又具备 **Logger** 的日志格式美观性。
>写这个日志框架的主要原因是为了简化维护流程。在我个人的GitHub开源项目中,有一些需要使用日志功能的库。
>最初,我使用的是一个自维护日志工具类:LogUtils,当开源项目数量较少时,这种方法还比较有效。
>然而,随着开源项目数量的增加,我不得不频繁地复制和维护LogUtils,随着时间的推移,不同开源项目中的LogUtils可能会
>出现一些差异,这大大增加了维护的难度。因此,我开始考虑更加优雅的解决方案。在经过一段时间的思考和研究后,我决定
>结合平时使用的 [Timber](https://github.com/JakeWharton/timber) 和 [Logger](https://github.com/orhanobut/logger) 这
>两个成熟的开源库,取其精华,编写一个新的日志框架,即:**LogX** 。
## 类图

> 从上面的类图可以明确的看出 **LogX** 内部之间的关系与结构。
## 引入
### Gradle:
1. 在Project的 **build.gradle** 或 **setting.gradle** 中添加远程仓库
```gradle
repositories {
//...
mavenCentral()
}
```
2. 在Module的 **build.gradle** 里面添加引入依赖项
```gradle
implementation 'com.github.jenly1314:logx:1.1.0'
```
## 使用
### 基本用法
如果没有特殊的要求,直接使用即可。
> **LogX** 无需初始化,因为 **LogX** 的默认配置就是个人最推荐的配置。(这也是我写 **LogX** 的原因之一)
主要的一些方法调用示例如下:
```java
LogX.v("verbose");
LogX.d("debug");
LogX.i("info");
LogX.w("warn");
LogX.e("error");
LogX.wtf("assert");
```
占位符格式化示例如下:
```java
LogX.d("hello %s", "world");
```
> 当未指定tag时,内部会自动通过线程栈获取对应的简单类名来作为tag,上面的示例皆是如此;不过你也可以自己指定tag;
指定tag示例如下:
```java
// 指定tag(指定的tag是一次性的)
LogX.tag("MyTag").d("debug");
```
> 看了上面的基本用法,相信你已经会使用 **LogX** 了;如果还想了解更多,你可以继续往下看高级用法。
### 高级用法
如果你有特别的需求,你可以自己按照喜好进行配置`DefaultLogger`或自定义实现`Logger`。
```java
// 参数1:是否显示线程信息; 参数1:显示多少方法行,;参数3:方法栈偏移量
Logger logger = new DefaultLogger(true, 2, 0);
LogX.setLogger(logger);
```
全局配置是否记录日志示例如下:
```java
LogX.setLogger(new DefaultLogger() {
@Override
protected boolean isLoggable(int priority, @Nullable String tag) {
// return super.isLoggable(priority, tag);
// 例如:只在开发模式才记录日志
return BuildConfig.DEBUG;
}
});
```
> **LogX** 默认配置就是在debug包下才开启日志记录的,release包默认是关闭日志记录的。
使用`CompositeLogger`管理`Logger`示例如下:
```java
CompositeLogger compositeLogger = new CompositeLogger();
// 添加任意的Logger实现即可;例如:DefaultLogger
compositeLogger.addLogger(new DefaultLogger());
LogX.setLogger(compositeLogger);
```
> 如以上内置的功能都不满足你的需求,你还可以自定义实现一个`Logger`。
### 日志效果
日志的默认输出格式如下:
```
┌──────────────────────────────
│ Thread information
├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
│ Method stack history
├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
│ Log message
└──────────────────────────────
```
在Logcat中的实际效果如下:

### 关于`FormatUtils`(v1.1.0新增)
格式化`json`和`xml`本不属于日志打印的范畴,但为了提升可读性和美观性,决定提供一个工具类`FormatUtils`来支持此功能。至于是否需要格式化,由开发者根据实际需求自行决定。
#### 格式化json示例:
```java
String json = "{\"key\": \"value\", \"array\":[\"item1\",\"item2\"]}";
// 打印格式化后的json
LogX.d(FormatUtils.formatJson(json));
```
#### 格式化xml示例:
```java
String xml = "valueitem1item2";
// 打印格式化后的xml
LogX.d(FormatUtils.formatXml(xml));
```
### 特别说明
既然 **LogX** 的实现主要是参考了:**Timber** 和 **Logger**,那么二者的诸多优点,**LogX** 自然也是支持的。
比如:如果你之前是集成使用的Timber,那么现在你也可以通过如下方式,将最终的日志输出转到 **LogX**,让日志输出格式更具美观性。
```java
Timber.plant(new Timber.Tree() {
@Override
protected void log(int priority, @Nullable String tag, @NonNull String message, @Nullable Throwable throwable) {
// if(tag != null) { // 这里的tag可要可不要
// LogX.tag(tag);
// }
// 在Timber目前层级没发生变化的情况下,方法栈偏移4 即可准确定位到原始Timber调用的代码所在行。(这里不需要throwable,因为message里面已经包含了)
LogX.offset(4).log(priority, message);
}
});
```
> 通过使用`LogX.offset(offset)`进行方法栈的偏移,就算多库混用也互不影响,都可以轻松的定位到日志具体的代码行。
更多使用详情,请查看[app](app)中的源码使用示例或直接查看[API帮助文档](https://jenly1314.github.io/LogX/api/)
## 版本日志
#### v1.1.0:2024-12-10
* 新增格式化工具类:`FormatUtils`
#### [查看更多版本日志](CHANGELOG.md)
## 赞赏
如果你喜欢LogX,或感觉LogX帮助到了你,可以点右上角“Star”支持一下,你的支持就是我的动力,谢谢 :smiley:
您也可以扫描下面的二维码,请作者喝杯咖啡 :coffee:
## 关于我
| 我的博客 | GitHub | Gitee | CSDN | 博客园 |
|:------------------------------------------------------------------------------------|:----------------------------------------------------------------------------------------|:--------------------------------------------------------------------------------------|:------------------------------------------------------------------------------------|:------------------------------------------------------------------------------|
| Jenly's Blog | jenly1314 | jenly1314 | jenly121 | jenly |
## 联系我
| 微信公众号 | Gmail邮箱 | QQ邮箱 | QQ群 | QQ群 |
|:--------------------------------------------------------|:---------------------------------------------------------------------------------|:----------------------------------------------------------------------------------|:--------------------------------------------------------------------------------------------------------------------------|:--------------------------------------------------------------------------------------------------------------------------|
| [Jenly666](http://weixin.qq.com/r/wzpWTuPEQL4-ract92-R) | jenly1314 | jenly1314 | 20867961 | 64020761 |