├── LogCookLibrary
├── build.gradle
└── src
│ └── main
│ ├── AndroidManifest.xml
│ ├── java
│ └── com
│ │ └── whieenz
│ │ └── LogCook.java
│ └── res
│ └── values
│ └── strings.xml
├── README.md
├── app
├── build.gradle
└── src
│ └── main
│ ├── AndroidManifest.xml
│ ├── java
│ └── com
│ │ └── whieenz
│ │ └── logcook
│ │ ├── AppManager.java
│ │ └── MainActivity.java
│ └── res
│ ├── layout
│ └── activity_main.xml
│ ├── mipmap-hdpi
│ └── ic_launcher.png
│ ├── mipmap-mdpi
│ └── ic_launcher.png
│ ├── mipmap-xhdpi
│ └── ic_launcher.png
│ ├── mipmap-xxhdpi
│ └── ic_launcher.png
│ ├── mipmap-xxxhdpi
│ └── ic_launcher.png
│ ├── values-w820dp
│ └── dimens.xml
│ └── values
│ ├── colors.xml
│ ├── dimens.xml
│ ├── strings.xml
│ └── styles.xml
├── build.gradle
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
└── settings.gradle
/LogCookLibrary/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.library'
2 |
3 | android {
4 | compileSdkVersion 27
5 | buildToolsVersion "27.0.1"
6 |
7 | defaultConfig {
8 | minSdkVersion 15
9 | targetSdkVersion 27
10 | versionCode 1
11 | versionName "1.0"
12 |
13 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
14 |
15 | }
16 | buildTypes {
17 | release {
18 | minifyEnabled false
19 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
20 | }
21 | }
22 | }
23 |
24 | dependencies {
25 | compile fileTree(dir: 'libs', include: ['*.jar'])
26 | androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
27 | exclude group: 'com.android.support', module: 'support-annotations'
28 | })
29 | compile 'com.android.support:appcompat-v7:26.0.0-alpha1'
30 | testCompile 'junit:junit:4.12'
31 | }
32 |
--------------------------------------------------------------------------------
/LogCookLibrary/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/LogCookLibrary/src/main/java/com/whieenz/LogCook.java:
--------------------------------------------------------------------------------
1 | package com.whieenz;
2 |
3 | import android.util.Log;
4 |
5 | import java.io.File;
6 | import java.io.FileWriter;
7 | import java.io.IOException;
8 | import java.text.SimpleDateFormat;
9 | import java.util.Date;
10 |
11 | /**
12 | * Created by whieenz on 2017/11/22.
13 | * 作用: Android日志工具类 (支持打印重要日志,报错信息,到指定文件)
14 | */
15 |
16 | public class LogCook implements Thread.UncaughtExceptionHandler {
17 |
18 | private static boolean isOpen; //是否打印日志
19 | private static boolean isSave; //是否保存日志到文件
20 | private static String logPath = null;//log日志存放路径
21 | private static String logName = null;//日志文件名
22 |
23 | private static LogCook instance;
24 |
25 | public static LogCook getInstance() {
26 | if (instance == null) {
27 | instance = new LogCook();
28 | }
29 | return instance;
30 | }
31 |
32 | /**
33 | * 初始化异常奔溃信息监听
34 | */
35 | public void initialize() {
36 | Thread.setDefaultUncaughtExceptionHandler(this);
37 | }
38 |
39 | /**
40 | * 是否开启输出日志功能
41 | * @param isOpen isOpen
42 | * @return LogCook
43 | */
44 | public LogCook isOpen(boolean isOpen) {
45 | LogCook.isOpen = isOpen;
46 | return this;
47 | }
48 | /**
49 | * 是否保存日志到文件
50 | * @param isSave isSave
51 | * @return LogCook
52 | */
53 | public LogCook isSave(boolean isSave) {
54 | LogCook.isSave = isSave;
55 | return this;
56 | }
57 |
58 | /**
59 | * 设置保存log的文件路径
60 | * @param logPath 路径
61 | * @return LogCook
62 | */
63 | public LogCook setLogPath(String logPath) {
64 | LogCook.logPath = logPath;
65 | return this;
66 | }
67 |
68 | /**
69 | * 设置保存log的文件名称
70 | * @param logName 文件名称 如:xxxx_xx_xx.log
71 | * @return LogCook
72 | */
73 | public LogCook setLogName(String logName) {
74 | LogCook.logName = logName;
75 | return this;
76 | }
77 |
78 | public static void v(String tag, String msg) {
79 | if (isOpen)
80 | Log.v(tag, msg);
81 | if (isSave)
82 | writeToFile(tag, msg);
83 | }
84 |
85 | public static void d(String tag, String msg) {
86 | if (isOpen)
87 | Log.d(tag, msg);
88 | if (isSave)
89 | writeToFile(tag, msg);
90 | }
91 |
92 | public static void i(String tag, String msg) {
93 | if (isOpen)
94 | Log.i(tag, msg);
95 | if (isSave)
96 | writeToFile(tag, msg);
97 | }
98 |
99 | public static void w(String tag, String msg) {
100 | if (isOpen)
101 | Log.w(tag, msg);
102 | if (isSave)
103 | writeToFile(tag, msg);
104 | }
105 |
106 | public static void e(String tag, String msg) {
107 | if (isOpen)
108 | Log.e(tag, msg);
109 | if (isSave)
110 | writeToFile(tag, msg);
111 | }
112 |
113 | public static void log(String log) {
114 | if (isOpen)
115 | Log.i("", log);
116 | if (isSave)
117 | writeToFile(log);
118 | }
119 |
120 | public static void f(String tag, String msg) {
121 | if (isSave) {
122 | writeToFile(tag, msg);
123 | }
124 | }
125 |
126 |
127 | /**
128 | * 将log信息写入文件中
129 | *
130 | * @param tag TAG
131 | * @param msg MSG
132 | */
133 | private static void writeToFile(String tag, String msg) {
134 | String info = tag + " " + msg;
135 | writeToFile(info);
136 | }
137 |
138 | /**
139 | * 将log信息写入文件中
140 | *
141 | * @param info info
142 | */
143 | private static void writeToFile(String info) {
144 | if (null == logPath) {
145 | return;
146 | }
147 |
148 | String log = getNowTime() + ":" + info + "\n";//log日志内容,可以自行定制
149 | //如果父路径不存在
150 | File file = new File(logPath);
151 | if (!file.exists()) {
152 | boolean mkdirs = file.mkdirs();//创建父路径
153 | if (!mkdirs) {
154 | return;
155 | }
156 | }
157 | FileWriter fw = null;
158 | try {
159 | fw = new FileWriter(logPath + File.separator
160 | + logName, true);
161 | fw.write(log);
162 | } catch (IOException e) {
163 | e.printStackTrace();
164 | } finally {
165 | try {
166 | if (fw != null) {
167 | fw.close();//关闭缓冲流
168 | }
169 | } catch (IOException e) {
170 | e.printStackTrace();
171 | }
172 | }
173 | }
174 |
175 | /**
176 | * 获取当前时间
177 | *
178 | * @return 当前时间
179 | */
180 | private static String getNowTime() {
181 | SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
182 | Date curDate = new Date(System.currentTimeMillis());//获取当前时间
183 | return formatter.format(curDate);
184 | }
185 |
186 | /**
187 | * 获取当前日期
188 | *
189 | * @return 当前日期
190 | */
191 | private static String getNowDay() {
192 | SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
193 | Date curDate = new Date(System.currentTimeMillis());//获取当前时间
194 | return formatter.format(curDate);
195 | }
196 |
197 | @Override
198 | public void uncaughtException(Thread thread, Throwable throwable) {
199 | if (logPath != null) {
200 | File file = new File(logPath);
201 | if (!file.exists()) {
202 | file.mkdirs();
203 | }
204 | try {
205 | String logName = "AppError" + getNowDay() + ".log";
206 | FileWriter fw = new FileWriter(logPath + File.separator
207 | + logName, true);
208 | String model = android.os.Build.MODEL; //型号
209 | String brand = android.os.Build.BRAND; //品牌
210 | String release = android.os.Build.VERSION.RELEASE; //版本
211 | fw.write("设备型号:" + model + "\n");
212 | fw.write("设备品牌:" + brand + "\n");
213 | fw.write("设备系统版本:" + release + "\n");
214 | fw.write(getNowTime() + "错误原因:");
215 | // 错误信息
216 | StackTraceElement[] stackTrace = throwable.getStackTrace();
217 | fw.write(throwable.getMessage() + "\n");
218 | for (StackTraceElement aStackTrace : stackTrace) {
219 | fw.write(aStackTrace.getFileName() + " CLASS:"
220 | + aStackTrace.getClassName() + " METHOD:"
221 | + aStackTrace.getMethodName() + " LINE:"
222 | + aStackTrace.getLineNumber() + "\n");
223 | }
224 | fw.write("\n");
225 | fw.close();
226 | // 上传错误信息到服务器
227 | // uploadToServer();
228 | } catch (IOException e) {
229 | Log.e("crash handler", "执行保存App运行报错信息加载文件失败...", e.getCause());
230 | }
231 | }
232 | throwable.printStackTrace();
233 | android.os.Process.killProcess(android.os.Process.myPid());
234 | }
235 | }
236 |
--------------------------------------------------------------------------------
/LogCookLibrary/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | LogCookLibrary
3 |
4 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # [](https://jitpack.io/#whieenz/LogCook) LogCook
2 | > 这是一款超超超超超级精简,实用的Android日志管理工具。
3 |
4 | LogCook是一款非常简洁实用的Android日记管理工具。LogCook的中文翻译是日志厨师,你可以把它看作是一个日志美食家。
5 |
6 |
7 | ## 功能介绍
8 | - 支持正常的日志输出
9 | - 支持将日志输出并保存到指定路径的文件
10 | - 支持日志开关可灵活控制是否输出日志
11 | - 支持文件保存开关可灵活控制是否保存日志
12 | - 支持自动将App异常崩溃报错信息保存到指定文件,方便跟踪处理
13 |
14 | ## 特点
15 | 作为一款日志管理工具它最大的特点就是**简单实用**,与Android原生的日志功能相比较它具有以及几个优势:
16 | 1. 支持把日志输出到指定文本文件
17 | 2. 支持捕获App异常奔溃闪退(Crash)并打印输出到指定文件
18 | 3. 支持日志开关可灵活控制是否输出日志
19 | 4. 支持文件保存开关可灵活控制是否保存日志
20 | ## 使用教程
21 | ### 一、添加依赖
22 | **推荐Gradle引用:**
23 |
24 | 在外层build.gradle 文件中添加以下信息:
25 | ```
26 | allprojects {
27 | repositories {
28 | ...
29 | maven { url 'https://jitpack.io' }
30 | }
31 | }
32 | ```
33 |
34 |
35 | 在App文件夹下的build.gradle 文件中添加以下信息:
36 | ```
37 | dependencies {
38 | compile 'com.github.whieenz:LogCook:v1.0'
39 | }
40 | ```
41 | ### 二、添加文件写入权限
42 | 在manifest.xml中添加user permission:
43 | ```
44 |
45 |
46 | ```
47 | ### 三、初始化
48 | 新建一个继承自Application的类,如果项目中已经有的话就不用新建了。
49 | 重写onCreate()方法在onCreate()方法中初始化LogCook,代码如下:
50 |
51 |
52 | ```
53 | @Override
54 | public void onCreate() {
55 | super.onCreate();
56 | String logPath = Environment.getExternalStorageDirectory().getAbsolutePath()+"/com.whieenz.logCook/log";
57 | LogCook.getInstance() // 单例获取LogCook实例
58 | .setLogPath(logPath) //设置日志保存路径
59 | .setLogName("test.log") //设置日志文件名
60 | .isOpen(true) //是否开启输出日志
61 | .isSave(true) //是否保存日志
62 | .initialize(); //完成初始化Crash监听
63 | }
64 | ```
65 | 在manifest.xml中的application标签下添加android:name=".MyApplication"属性,代码如下:
66 | ```
67 |
74 | ```
75 |
76 | 好了,到了这里LogCook的配置问题就全部完成,是不是觉得很简单?
77 | ### 四、开始使用
78 | LogCook 的使用非常简单日志的格式完全兼容Android原生的日志打印方式。用例如下:
79 |
80 | ```
81 | LogCook.v(TAG,"测试日志v");
82 | LogCook.i(TAG,"测试日志i");
83 | LogCook.d(TAG,"测试日志d");
84 | LogCook.w(TAG,"测试日志w");
85 | LogCook.e(TAG,"测试日志e");
86 | LogCook.log("测试日志log");
87 | ```
88 | ### 五、注意事项
89 |
90 | 1. 日志的保存路径和文件名是在使用时自己设置的,请务必注意路径和文件名有效
91 | 2. Crash信息只有在App运行时发生Crash才会有捕获和保存,保存在初始化时指定的路径下
92 | ### 作者信息
93 | ##### whieenz email:whieenz@163.com
94 |
95 | **如果喜欢请给个 ☆ 谢谢!**
96 |
--------------------------------------------------------------------------------
/app/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.application'
2 |
3 | android {
4 | compileSdkVersion 27
5 | buildToolsVersion "27.0.1"
6 | defaultConfig {
7 | applicationId "com.whieenz.logcook"
8 | minSdkVersion 15
9 | targetSdkVersion 27
10 | versionCode 1
11 | versionName "1.0"
12 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
13 | }
14 | buildTypes {
15 | release {
16 | minifyEnabled false
17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
18 | }
19 | }
20 | }
21 |
22 | dependencies {
23 | compile fileTree(include: ['*.jar'], dir: 'libs')
24 | androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
25 | exclude group: 'com.android.support', module: 'support-annotations'
26 | })
27 | testCompile 'junit:junit:4.12'
28 | compile 'com.android.support:appcompat-v7:26.0.0-alpha1'
29 | compile project(':LogCookLibrary')
30 | }
31 |
--------------------------------------------------------------------------------
/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/app/src/main/java/com/whieenz/logcook/AppManager.java:
--------------------------------------------------------------------------------
1 | package com.whieenz.logcook;
2 |
3 | import android.app.Application;
4 |
5 | import com.whieenz.LogCook;
6 |
7 | /**
8 | * Created by whieenz on 2017/11/25.
9 | *
10 | */
11 |
12 | public class AppManager extends Application {
13 | @Override
14 | public void onCreate() {
15 | super.onCreate();
16 | String logPath = "";
17 | String logName = "";
18 | LogCook.getInstance()
19 | .setLogPath(logPath)
20 | .setLogName(logName)
21 | .isOpen(true)
22 | .isSave(true)
23 | .initialize();
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/app/src/main/java/com/whieenz/logcook/MainActivity.java:
--------------------------------------------------------------------------------
1 | package com.whieenz.logcook;
2 |
3 | import android.support.v7.app.AppCompatActivity;
4 | import android.os.Bundle;
5 |
6 | public class MainActivity extends AppCompatActivity {
7 |
8 | @Override
9 | protected void onCreate(Bundle savedInstanceState) {
10 | super.onCreate(savedInstanceState);
11 | setContentView(R.layout.activity_main);
12 |
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
12 |
13 |
17 |
18 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/whieenz/LogCook/049716f9dad07cadcbc38b20b368edaa167bd8f8/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/whieenz/LogCook/049716f9dad07cadcbc38b20b368edaa167bd8f8/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/whieenz/LogCook/049716f9dad07cadcbc38b20b368edaa167bd8f8/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/whieenz/LogCook/049716f9dad07cadcbc38b20b368edaa167bd8f8/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/whieenz/LogCook/049716f9dad07cadcbc38b20b368edaa167bd8f8/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/values-w820dp/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 64dp
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #3F51B5
4 | #303F9F
5 | #FF4081
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/values/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 16dp
4 | 16dp
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | LogCook
3 |
4 |
--------------------------------------------------------------------------------
/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/build.gradle:
--------------------------------------------------------------------------------
1 | // Top-level build file where you can add configuration options common to all sub-projects/modules.
2 |
3 | buildscript {
4 | repositories {
5 | jcenter()
6 | }
7 | dependencies {
8 | classpath 'com.android.tools.build:gradle:2.2.2'
9 |
10 | // NOTE: Do not place your application dependencies here; they belong
11 | // in the individual module build.gradle files
12 | }
13 | }
14 |
15 | allprojects {
16 | repositories {
17 | jcenter()
18 | }
19 | }
20 |
21 | task clean(type: Delete) {
22 | delete rootProject.buildDir
23 | }
24 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/whieenz/LogCook/049716f9dad07cadcbc38b20b368edaa167bd8f8/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Mon Dec 28 10:00:20 PST 2015
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip
7 |
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app', ':LogCookLibrary'
2 |
--------------------------------------------------------------------------------