logcat日志是Android开发调试的必备手段,由于开发人员水平不均关系,遇到滥用logcat的项目也不在少数。相信大家在开发调试中遇到不少应用即使是发布版本也有超级多的log信息,非常烦人,用处也不大,甚至自己参与的项目内部不同模块之间存在部分模块滥用logcat的情况。对于logcat信息的理解与开发人员的水平和开发观念有非常大关系,本人认为滥用logcat是不好的开发习惯。近期参与的项目就遇到这种情况,部分模块存在滥用logcat的情况。
首先介绍项目的具体情况,最近接收一个项目,项目也不是很大出去引用的第三方开源代码就五万行java代码左右,项目大概是14年开发的,虽然整体架构问题不是很大,但是开发的人多了,加上中间有些人员变动,代码质量有所下降,会出现一些腐朽代码。这次接手要添加几个大的需求修改,需要协调原来的开发人员。在debug模式下apk的Log.d信息特别多,release版本因为proguard脚本会删除Log.d等级日志,所以整体好一点,可是Log.d的日志本来就是开发调试用的,功能开发完成后其实用处不大了,可以删除的。
项目新需求启动前还有一个空窗期,决定利用这个空窗期解决这个问题。先创建一个封装了 Log.d的日志工具类,该工具类打印 的日志能够显示java类名称调用函数的名称以及代码行号;然后就使用文本替换把项目中的Log.d替换为我写的工具类;接下来就是苦力活,运行apk,这时候对应的Log.d都会打印出源码位置,最后根据实际日志的作用适当减少冗余日志。
初步搞定完原来日志后,新项目开始后就对协同开发的同事声明新开发模块的日志要求,不能再打印冗余日志,管理小技巧是git或者svn版本控制工具追踪冗余PLog.d对应的代码,然后找相关同事更正,经过半个月的适应后协同开发的同事终于不会在功能开发完成的模块打印调试冗余日志了。
PLog的实现大概如下:
package com.penny.demo;import android.text.TextUtils;
import android.util.Log;import java.util.Locale;/*** Created by penny on 06/02/2018.*/public class PLog {public static void d(String tag, String log) {boolean reachPLog = false;StackTraceElement element = null;StackTraceElement[] elements = Thread.currentThread().getStackTrace();for (int i = 0; i < elements.length; i++) {element = elements[i];if (! reachPLog) {reachPLog = TextUtils.equals(PLog.class.getName(), element.getClassName());} else {if (! TextUtils.equals(PLog.class.getName(), element.getClassName())) {break;}}}if (null == log) {log = "null";}String finalLog = String.format(Locale.CHINA, "%s::%s(%d)  %s",parseSimpleName(element.getClassName()),element.getMethodName(),element.getLineNumber(),log);Log.d(tag, finalLog);}/*** reserve $*/private static String parseSimpleName(String className) {if (TextUtils.isEmpty(className)) {return "";}int index = className.lastIndexOf(".");if (-1 == index) {return className;}return className.substring(index + 1);}
}
单元测试用例
package com.penny.demo;import android.support.test.runner.AndroidJUnit4;import org.junit.Test;
import org.junit.runner.RunWith;/*** Created by penny on 06/02/2018.*/@RunWith(AndroidJUnit4.class)
public class PLogTest {private static final String TAG = PLogTest.class.getSimpleName();@Testpublic void testPLog() {PLog.d(TAG, "Hello, word.");}@Testpublic void testNestClassLog() {Game game = new Game("The Travelling frog");game.dump();}private class Game {private String name;public Game(String name) {this.name= name;}public void dump() {PLog.d(TAG, "name: " + this.name);}}
}
测试用例运行结果
$ adb logcat -s "PLogTest"
02-06 23:39:40.454 11099 11120 D PLogTest: PLogTest::testPLog(18) Hello, word.
02-06 23:39:40.475 11099 11120 D PLogTest: PLogTest$Game::dump(35) name: The Travelling frog
做这个项目的感慨:一个项目的编码整洁规范程度与主持项目实施的人相关,如果实施人注重编码规范,那么项目整体会规范。反之亦然,主持人不注重规范,再好的框架也会慢慢被随意编码污染。我处理的这个项目原来的框架挺优秀的,简洁明了,模块之间耦合性低,所以才能抵住部分人员短时间不规范编码。

实战 团队项目如何把控log日志输出相关推荐

  1. 华为如何在开发者选项观察错误日志_爬虫scrapy框架--log日志输出配置及使用

    1.在配置文件中设置日志输出文件名和日志等级 1.为什么以日期为文件名? 因为这样可以方便开发者查看每天的日志信息,同时也可以防止单文件log日志信息堆积的越来越多,所以将当天日志信息保存到当天的日志 ...

  2. log日志输出到文件:

    log日志输出到文件: 输出到不同的文件夹:(需要配置xml文件) <?xml version="1.0" encoding="UTF-8"?> & ...

  3. java sl4j 日志_为Java项目添加slf4j的log日志-阿里云开发者社区

    我们今天要给之前编码的一个maven的web项目提供slf4j的日志,这样所有的日志信息可以显示到项目的某个目录的log文件中. 项目的样子如下图: 首先配置pom,我也不知道下面的内容是否必要 or ...

  4. 39、Springboot 项目集成Log日志输出功能,并按每小时分组分割文件

    Logback的引入 之所以引入logback ,最主要原因是因为它非常强大的兼容性,能够自然平滑的支持log4j或者其他日志组件,官方文档非常的充分,对初学者十分友好,能够快速上手,它当前分为三个模 ...

  5. Python3 装饰器进行log日志输出

    前言 使用Python 装饰器decorator来对函数进行日志输出_ 2021年3月 测试可用 环境 Python 3.7 代码 代码目录: logger.py -> 日志装饰器: 用来写lo ...

  6. 多个模块的log日志输出

    今天研究了一下python标准库中的logging模块,在多个模块的情景下输出日志 import logging from logging_test2 import log_test# logging ...

  7. delphi的一款非常迷你+实用的Log日志输出单元

    思路来自:Delphi开发系列(3):日志记录组件_老虾米-CSDN博客_delphi 日志组件 属于站在前人的肩膀上看世界.前作者也是从RealThinClient控件中剥离出日志输出单元,并添加日 ...

  8. 1 项目里面如何打印log日志

    1  首先写一个logging.py文件 import logging from conf import setting #配置文件,里面有日志存放路径def mylog():logger = log ...

  9. java log 断点_项目中常见的log日志调用

    第一种用法:引用org.apache.commons.logging.Log. import org.apache.commons.logging.Log; import org.apache.com ...

  10. JNI Log 日志输出

    1.创建Native 项目 2.在app/src/main/cpp/CMakeLists.txt里会有查找标准log库的代码 find_library( log-liblog ) 然后链接到需要使用日 ...

最新文章

  1. SpringBoot (五) :SpringBoot整合mybatis
  2. python dump函数_python中实现php的var_dump函数功能
  3. ORA-01102: cannot mount database in EXCLUSIVE mode
  4. python读取文件第n行-Python读取文件最后n行的方法
  5. Android Hander机制的理解
  6. leetcode 782. Transform to Chessboard | 782. 变为棋盘(Java)
  7. flask第二十篇——模板【3】
  8. Go36-3-代码包
  9. 清楚form表单数据的便捷jQuery之法
  10. [转]VC工程文件说明
  11. Java实现大数操作
  12. 如何解决微图不能在虚拟机上运行的问题
  13. 解码器常见故障及解决方法
  14. chrome regedit 崩溃_谷歌浏览器网页崩溃的解决方法
  15. Read timed out executing GET (读取执行GET超时)
  16. 台式计算机没办法连接wifi吗,台式机没有无线网络连接该怎么办
  17. 个人记录 | 研二预答辩中的一些记录
  18. Linux---Docker镜像使用cx_Oracle连接Oracle数据库
  19. mybatis代码自动生成工具之maven插件mybatis-generator-maven-plugin(mybatis逆向工程)
  20. 博客园自定义鼠标样式

热门文章

  1. 使用TypoDetect检测相似域名
  2. msf拿shell后中文乱码解决
  3. android打开视频噔_Android、iOS不可错过!10款堪称神器的高质量APP,请低调使用...
  4. 最简单的使用nginx实现动静分离
  5. [源码和报告分享] 基于VC++的MFC类库实现的通讯录管理系统
  6. windows mysql 和linux mysql解决乱码问题
  7. 【C++】指针的引用及面向对象
  8. shell - 常识
  9. IM开发通信协议基础知识(一)---TCP、UDP、HTTP、SOCKET
  10. stl空间配置器alloc