1. public class Logger {
  2. /**
  3. * log tag
  4. */
  5. private String tagName = "MoGuLogger";// tag name
  6.  
  7. // private static int logLevel = Log.VERBOSE;
  8.  
  9. private static int logLevel = Log.VERBOSE;
  10.  
  11. private static Logger inst;
  12.  
  13. private Lock lock;
  14.  
  15. private Logger() {
  16. lock = new ReentrantLock();
  17. }
  18.  
  19. public static synchronized Logger getLogger(Class<?> key) {
  20. if (inst == null) {
  21. inst = new Logger();
  22. }
  23.  
  24. return inst;
  25. }
  26.  
  27. private String getFunctionName() {
  28. StackTraceElement[] sts = Thread.currentThread().getStackTrace();
  29.  
  30. if (sts == null) {
  31. return null;
  32. }
  33.  
  34. Log.i("TAG", "start" + "threadName:" + Thread.class.getName() + " className:"
  35. + this.getClass().getName());
  36. for (StackTraceElement st : sts) {
  37. Log.i("TAG", st.getClassName());
  38. }
  39. Log.i("TAG", "end");
  40. for (StackTraceElement st : sts) {
  41. Log.i("TAG", st.getClassName());
  42. if (st.isNativeMethod()) {
  43. continue;
  44. }
  45.  
  46. if (st.getClassName().equals(Thread.class.getName())) {
  47. continue;
  48. }
  49.  
  50. if (st.getClassName().equals(this.getClass().getName())) {
  51. continue;
  52. }
  53. return "[" + st.getFileName() + ":" + st.getLineNumber() + "]";
  54. }
  55.  
  56. return null;
  57. }
  58.  
  59. private String createMessage(String msg) {
  60. String functionName = getFunctionName();
  61. long threadId = Thread.currentThread().getId();
  62. String currentTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS").format(new Date());
  63. String message = (functionName == null ?
  64.  
  65. msg : (functionName + " - "
  66. + String.valueOf(threadId) + " - " + msg));
  67. return currentTime + " - " + message;
  68. }
  69.  
  70. /**
  71. * log.i
  72. */
  73. public void i(String format, Object... args) {
  74. if (logLevel <= Log.INFO) {
  75. lock.lock();
  76. try {
  77. String message = createMessage(getInputString(format, args));
  78. Log.i(tagName, message);
  79. } finally {
  80. lock.unlock();
  81. }
  82. }
  83. }
  84.  
  85. /**
  86. * log.v
  87. */
  88. public void v(String format, Object... args) {
  89. if (logLevel <= Log.VERBOSE) {
  90. lock.lock();
  91. try {
  92. String message = createMessage(getInputString(format, args));
  93. Log.v(tagName, message);
  94. } finally {
  95. lock.unlock();
  96. }
  97. }
  98. }
  99.  
  100. /**
  101. * log.d
  102. */
  103. public void d(String format, Object... args) {
  104. if (logLevel <= Log.DEBUG) {
  105. lock.lock();
  106. try {
  107. String message = createMessage(getInputString(format, args));
  108. Log.d(tagName, message);
  109. } finally {
  110. lock.unlock();
  111. }
  112. }
  113. }
  114.  
  115. /**
  116. * log.e
  117. */
  118. public void e(String format, Object... args) {
  119. if (logLevel <= Log.ERROR) {
  120. lock.lock();
  121. try {
  122. String message = createMessage(getInputString(format, args));
  123. Log.e(tagName, message);
  124. } finally {
  125. lock.unlock();
  126. }
  127. }
  128. }
  129.  
  130. private String getInputString(String format, Object... args) {
  131. if (format == null) {
  132. return "null log format";
  133. }
  134.  
  135. return String.format(format, args);
  136. }
  137.  
  138. /**
  139. * log.error
  140. */
  141. public void error(Exception e) {
  142. if (logLevel <= Log.ERROR) {
  143. StringBuffer sb = new StringBuffer();
  144. lock.lock();
  145. try {
  146. String name = getFunctionName();
  147. StackTraceElement[] sts = e.getStackTrace();
  148.  
  149. if (name != null) {
  150. sb.append(name + " - " + e + "\r\n");
  151. } else {
  152. sb.append(e + "\r\n");
  153. }
  154. if (sts != null && sts.length > 0) {
  155. for (StackTraceElement st : sts) {
  156. if (st != null) {
  157. sb.append("[ " + st.getFileName() + ":" + st.getLineNumber() + " ]\r\n");
  158. }
  159. }
  160. }
  161. Log.e(tagName, sb.toString());
  162. } finally {
  163. lock.unlock();
  164. }
  165. }
  166. }
  167.  
  168. /**
  169. * log.d
  170. */
  171. public void w(String format, Object... args) {
  172. if (logLevel <= Log.WARN) {
  173. lock.lock();
  174. try {
  175. String message = createMessage(getInputString(format, args));
  176. Log.w(tagName, message);
  177. } finally {
  178. lock.unlock();
  179. }
  180. }
  181. }
  182.  
  183. /**
  184. * set log level
  185. */
  186.  
  187. public void setLevel(int l) {
  188. lock.lock();
  189. try {
  190. logLevel = l;
  191. } finally {
  192. lock.unlock();
  193. }
  194. }
  195. }

开源TT框架上的日志类的更多相关文章

  1. 字节开源RPC框架Kitex的日志库klog源码解读

    前言 这篇文章将着重于分析字节跳动开源的RPC框架Kitex的日志库klog的源码,通过对比Go原生日志库log的实现,探究其作出的改进. 为了平滑学习曲线,我写下了这篇分析Go原生log库的文章,希 ...

  2. 高性能日志类KLog(已开源代码)

    项目开源地址:https://github.com/ihambert/KLog  上回介绍了超简易日志类,但他有诸多的局限性,注定了不能作为一个网站的日志类. 那什么样的日志类才能用于网站呢.首先来假 ...

  3. 如何优雅的阅读 GitHub 上开源 js 框架和库的源码

    如何优雅的阅读 GitHub 上开源 js 框架和库的源码 step 先总后分,即先了解一下啊框架的大体架构,又一个全局的认识,在选择某些和感兴趣的部分,仔细阅读,各个击破: 带着问题阅读,用到了什么 ...

  4. python3+selenium框架设计03-封装日志类

    首先我们先来实现日志的功能,日志可以使用python3自带logging模块,不会的可以百度一下相关文章,也可以看我另外一篇文章Python3学习笔记24-logging模块 在封装日志类前,我们需要 ...

  5. python3+requests库框架设计02-封装日志类

    首先我们先来实现日志的功能,日志可以使用python3自带logging模块,不会的可以百度一下相关文章,也可以看我另外一篇文章Python3学习笔记24-logging模块 在封装日志类前,我们需要 ...

  6. Apache Shiro 开源权限框架

    在 Web 项目中应用 Apache Shiro 开源权限框架 Apache Shiro 是功能强大并且容易集成的开源权限框架,它能够完成认证.授权.加密.会话管理等功能.认证和授权为权限控制的核心, ...

  7. 各大开源rpc 框架 比较

    各大开源rpc 框架 比较   1. 前言 随着现在互联网行业的发展,越来越多的框架.中间件.容器等开源技术不断地涌现,更好地来服务于业务,解决实现业务的问题.然而面对众多的技术选择,我们要如何甄别出 ...

  8. 分享一实战性开源MVC框架<Linux、Windows跨平台开发so easy>

    一.引子   开源地址 https://github.com/564064202/Moon.Mvc 欢迎加入开发 .NET Core微软还在发力,但作为商用还有一段距离,很多开发库尚不能用于.NET ...

  9. PHP框架中的日志系统

    现在在一家公司做PHP后台开发程序猿(我们组没有前端,做活动时会做前端的东西),刚开始到公司的时候花2个周赶出了一个前端加后台的活动(记得当时做不出来周末加了两天班...),到现在过去4个多月了,可以 ...

随机推荐

  1. 【VC编程技巧】窗口☞3.5对单文档或者多文档程序制作启动画面

    (一)概要: 文章描写叙述了如何通过Visual C++ 2012或者Visual C++ .NET,为单文档或者多文档程序制作启动画面.在Microsoft Visual Studio 6.0中对于 ...

  2. Blur 算法 (Unity 5.0 Shader)

    一:简单 Blur 算法 一个像素的颜色值由其邻近的若干像素和自己的颜色值的平均值重新定义,以此达到模糊的效果. 如下图,红色的像素点的值将由它和它周围的24个像素的平均值重新定义.计算的范围一般由一 ...

  3. EOJ 3 玩具谜题

    小南有一套可爱的玩具小人,它们各有不同的职业. 有一天,这些玩具小人把小南的眼镜藏了起来.小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的面朝圈外.如下图: 这时 singer 告诉小南一个谜题 ...

  4. C# Keywords - is

    记录一下在日常开发过程中遇到的一些C# 基础编程的知识!希望以后能用的着.知识是在平常的开发过程中去学到的.只有用到了,你才能深入的理解它,并用好它. 本资料来源于:MSND下面是一些相关的code ...

  5. Centos6.5添加Epel和Remi源安装Lamp环境

    想搭建一个Lamp环境,因为编译安装太麻烦,对于我这样的新手来说,太过于复杂.而CentOS自带的Apache.MySql和PHP的版本都太低,不想用.上百度搜了一轮,原来可以通过添加Epel和Rem ...

  6. Beta冲刺提交—星期五

    课程链接: https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2 作业要求链接: https://edu.cnblogs.com/ ...

  7. 队列(FIFO)详解

    写在前面的话: 一枚自学Java和算法的工科妹子. 算法学习书目:算法(第四版) Robert Sedgewick 算法视频教程:Coursera  Algorithms Part1&2 本文 ...

  8. WebApi不支持跨域访问

  9. 阿里云Maven中央仓库配置

    方式一:统一配置 在maven安装目录/conf下的settings.xml 文件里配置mirrors的子节点,添加如下mirror <mirror> <id>alimaven ...

  10. Spinner默认选择问题

    1.需求中使用Spinner,不允许有默认选中,在网上查了好多,有设置 spinner.setSelection(-1,true); 也有设置如下: spinner.setOnItemSelected ...