├── 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/v/whieenz/LogCook.svg)](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 | --------------------------------------------------------------------------------