atitit. 日志系统的原则and设计and最佳实践总结.

1. 日志系统是一种不可或缺的单元测试,跟踪调试工具 1

2. 日志系统框架通常应当包括如下基本特性 1

1. 所输出的日志拥有自己的分类。 2

2. 日志按照某种标准分成不同级别。 2

3. 支持多线程。 2

4. 稳定性。 2

3. 一个理想的日志模式 2

4. 判断指定的方法是否被调用了 3

5. 给方法的输入输出加上日志通过Aop 3

6. 日志易读,易解析  对日志感兴趣的可以分为两类: 3

7. 输出日志使用的性能 3

8. 日志的level debug太详细,又恐怕影响性能,Info又不足够,动态切换又麻烦的,怎么办了??? 4

9. magic log". 4

10. 正确的日志输出级别使用法 4

11. 日志数据会包括描述和上下文两部分, 比如下面的日志: 4

12. 日志放得个文本文件不好查询怎么办?? 5

13. 动态切换日志输出 5

14. 在日志中输出集合(collection), 5

15. 操作数据id 做为索引,,方便查询 6

16. 重要模块使用自己的日志文件,分模块日志 6

17. 获得 request或session对象数据通过编写过滤器(ResFilter.java)  MDC 6

18. 参考 7

1. 日志系统是一种不可或缺的单元测试,跟踪调试工具

,特别是在任何无人职守的后台程序以及那些没有跟踪调试环境的系统中有着广泛的应用。 长期以来, 日志系统作为一种应用程序服务,对于跟踪调试、程序状态记录、崩溃数据恢复都有非常现实的意义

可以将日志看成一种单元测试. 输出的日志将像单元测试一样, 会覆盖到整个方法的执行过程.

作者:: 老哇的爪子 Attilax 艾龙,  EMAIL:1466519819@qq.com

转载请注明来源: http://blog.csdn.net/attilax

2.  日志系统框架通常应当包括如下基本特性

1. 所输出的日志拥有自己的分类。

这样在调试时便于针对不同系统的不同模块进行查询,从而快速定位到发生日志事件的代码。

2. 日志按照某种标准分成不同级别。

分级以后的日志,可以用于同一分类下的日志筛选。

3. 支持多线程。

日志系统通常会在多线程环境中使用,特别是在 Java 系统当中,因此作为一种系统资源,日志系统应当保证是线程安全的。

支持不同的记录媒介。

不同的工程项目往往对日志系统的记录媒介要求不同,因此日志系统必须提供必要的开发接口,以保证能够比较容易的更换记录介质。

高性能。

志系统通常要提供高速的日志记录功能以应对大系统下大请求流量下系统的正常运转。

4. 稳定性。

日志系统必须是保持高度的稳定性,不能因为日志系统内部错误导致主要业务代码的崩溃。

3. 一个理想的日志模式

将包含下列信息:

· 当前时间(不需要包含日志, 精确到毫秒)

· 日志级别(如果你关心这个)

· 线程名称

· 简单的日志名(非全限定名的那种)

· 日志描述信息

包含下列内容也许造成性能问题:

· 文件名

· 类名(我想这个应该是全限定名吧)

· 代码行号

4. 判断指定的方法是否被调用了

log.info("");

因为知道, 在日志模式中会指定行号, 因此他就可以根据日志输的行号出判断指定的方法是否被调用了

5. 给方法的输入输出加上日志通过Aop

如果你能根据一些简单的规则来输出每个方法的输入和输出(参数和返回值). 你基本上可以扔掉调试器了.

对于这种日志, 一般采用DEBUG/TRACE级别. 当某些方法的调用非常频繁,

不过一般情况下, 还是建议大家多输出一些日志. 另外也可以将日志看成一种单元测试. 输出的日志将像单元测试一样, 会覆盖到整个方法的执行过程. 没有日志的系统是不可想象的. 因此通过观察日志的输出将是我们了解系统是在正确的运行还是挂了的唯一方式.

6. 日志易读,易解析

对日志感兴趣的可以分为两类:

· 人(比如程序员)

· 机器(系统管理员写的shell脚本)

7. 输出日志使用的性能

通常情形下,5% 的占用是可以的...

要是系统比较重要......30%都可以...

8.  日志的level debug太详细,又恐怕影响性能,Info又不足够,动态切换又麻烦的,怎么办了???

Level 韩式配置成个debug....日志本身走十扩展测试的...详细了不怕不怕

9. magic log".

会在日志中随手敲上"&&&!#"这样一串字符, 用来帮助他们定位.推荐使用ati短时间格式

10. 正确的日志输出级别使用法

INFO:重要的业务逻辑处理完成. 在理想情况下, INFO的日志信息要能让高级用户和系统管理员理解, 并从日志信息中能知道系统当前的运行状态. 比如对于一个机票预订系统来说, 当一个用户完成一个机票预订操作之后, 提醒应该给出"谁预订了从A到B的机票". 另一个需要输出INFO信息的地方就是一个系统操作引起系统的状态发生了重大变化(比如数据库更新, 过多的系统请求).

11. 日志数据会包括描述和上下文两部分, 比如下面的日志:

log.debug("Message processed");log.debug(message.getJMSMessageID()); log.debug("Message with id '{}' processed", message.getJMSMessageID());

第一条只有描述, 第二条只有上下文, 第三条才算完整的一条日志, 还有下面这种日志

12. 日志放得个文本文件不好查询怎么办??

虽然有grep工具能查询.不过韩式麻烦的...假如大的文件困难打开...

最好同时不个日志插入数据库..中间能使用强大的sql   ..查询容易的.一瓦工具能使用了. ..

不个文件做为历史文档...因为数据库也许定时器清理...

13. 动态切换日志输出

日志工具,,脚本化。

 ---->log4cpp

一个用于日志记录的c++函数库,可以将内容以定制的方式记录到不同的目的地,比如:文件、控制台syslog等,同时还可以通过控制记录级别来屏蔽掉某些无关记录。从http://log4cpp.sourceforge.net可以找到有关log4cpp的详细信息。

14. 在日志中输出集合(collection),

有时候我们输出的集合内容可能是由Hibernate从数据库中取出来的, 比如下面这条日志信息:

log.debug("Returning users: {}", users);

这里最佳的处理方式是仅仅输出domain对象的id或者集合的大小(size), 而对Java来说, 不得不要吐槽几句, 要遍历访问集合中每一个元素的getId方法非常繁琐. 这一点Groovy就做的非常简单(users*.id), 不过我们可以借助Commons Beanutils工具包来帮我们简化:

log.debug("Returning user ids: {}", collect(users, "id"));

这里的collect方法的实现如下:

public static Collection collect(Collection collection, String propertyName) {    return CollectionUtils.collect(collection, new BeanToPropertyValueTransformer(propertyName));}

后是关于toString()方法. 为了让日志更容易理解, 最好为每一个类提供合适的toString()方法. 这里可以借助ToStringBuilder工具类. 另外一个就是关于数组和某些集合类型. 因为数组是使用的默认的toString方法. 而某些集合没有很好的实现toString方法. 对于数组我们可以使用JDK的Arrays.deepToString()方法

15. 操作数据id 做为索引,,方便查询

不个这个数据的操作流程澄清..

16. 重要模块使用自己的日志文件,分模块日志

17. 获得 request或session对象数据通过编写过滤器(ResFilter.java)  MDC

日志框架中比较高级的功能: Mapped Diagnostic Context. MDC 主要用来简化基于thread-local的map参数管理. 你可以往这个map中增加任何key-value内容, 然后在随后的日志输出中作为模式的一部分, 与当前线程一起输出.

log4j为我们提供了MDC(MDC是log4j种非常有用类,它们用于存储应用程序的上下文信息(context infomation),从而便于在log中使用这些上下文信息。MDC内部使用了类似map的机制来存储信息,上下文信息也是每个线程独立地储存,所不 同的是信息都是以它们的key值存储在”map”中。相对应的方法,

MDC.put(key, value); MDC.remove(key); MDC.get(key);

在配置PatternLayout的时候使用:%x{key}来输出对应的value)。有了MDC,我们可以在过滤器中先获得用户信息,再用MDC.Put(“key”)方法,log在执行sql语句时通过%x{key}来输出对应的value。

18. 参考

Java日志系统:不可或缺的跟踪调试工具_数据库-开发_比特网

准确使用日志的10个技巧 - 编程

Log4j写入数据库详解 - ziruobing的专栏 - 博客频道 - CSDN.NET.htm

了解Java日志系统框架的设计与实现(1) - 51CTO.COM.htm

atitit. 日志系统的原则and设计and最佳实践(1)-----原理理论总结.相关推荐

  1. Prometheus Metrics 设计的最佳实践和应用实例,看这篇够了!

    Prometheus 是一个开源的监控解决方案,部署简单易使用,难点在于如何设计符合特定需求的 Metrics 去全面高效地反映系统实时状态,以助力故障问题的发现与定位.本文即基于最佳实践的 Metr ...

  2. atitit.人脸识别的应用场景and使用最佳实践 java .net php

    atitit.人脸识别的应用场景and使用最佳实践 java .net php 1. 人脸识别的应用场景 1 2. 框架选型 JNI2OpenCV.dll and JavaCV 1 3. Url ap ...

  3. mysql数据库设计实践_MYSQL教程分享20个数据库设计的最佳实践

    <MYSQL教程分享20个数据库设计的最佳实践>要点: 本文介绍了MYSQL教程分享20个数据库设计的最佳实践,希望对您有用.如果有疑问,可以联系我们. MYSQL教程数据库设计是整个程序 ...

  4. 基于海量日志和时序数据的质量建设最佳实践

    简介: 在云原生和DevOps研发模式的挑战下,一个系统从开发.测试.到上线的整个过程中,会产生大量的日志.指标.事件以及告警等数据,这也给企业质量平台建设带来了很大的挑战.本议题主要通过可观测性的角 ...

  5. 卡片式设计的最佳实践分享

    2017-02-17 三达不留点gpj CocoaChina 卡片本质上是一个简单的信息容器,信息量有限,但设计干净整洁.现如今,在保证界面具有优秀可用性的同时,卡片式的设计甚至成为了平衡界面美学的默 ...

  6. 搜索引擎优化网页设计:最佳实践

    作为一名网页设计师.网页的设计是我们一个最直观的辨认.我们如今的生活依赖于网络,依赖于这个高速让我们互知和沟通的工 具.它早已不不过一个静态的页面,而是一个有思想有文化无国界的一个内容涵盖量丰富的还有 ...

  7. 如何设计日志系统_架构 - 如何设计一个百亿级日志系统

    " 日志是记录系统中各种问题信息的关键,也是一种常见的海量数据. 日志平台为集团所有业务系统提供日志采集.消费.分析.存储.索引和查询的一站式日志服务. 主要为了解决日志分散不方便查看.日志 ...

  8. 业务单据进行领域驱动设计的最佳实践

    作者:少岚 阿里同城履约物流技术团队 本文以电商购物场景为例,介绍了领域驱动设计的应用实践.你会发现,DDD的核心目标就是通过各种实用性的方法和技巧提炼出具有体现问题实质的领域模型,协作解决领域问题, ...

  9. 22条API设计的最佳实践

    译者:刘志超,软件工程师.DevOpsDays.HDZ深圳核心组织者,目前供职于华为,从事云计算工作,专注于K8s.微服务领域. 来源:dockone.io/article/2434604 原文:ht ...

  10. 20个数据库设计的最佳实践

    数据库设计是整个程序的重点之一,为了支持相关程序运行,最佳的数据库设计往往不可能一蹴而就,只能反复探寻并逐步求精,这是一个复杂的过程,也是规划和结构化数据库中的数据对象以及这些数据对象之间关系的过程. ...

最新文章

  1. 【译】 WebSocket 协议第十一章——IANA 注意事项(IANA Considerations)
  2. android 常用混淆,Android常用的代码混淆整理【原创】
  3. android单选对话框代码,Android实现单选与多选对话框的代码
  4. 简单实例讲解为何深度学习有效
  5. [原创]C#之探索发现:在WinForm上写的一个模拟分页小程序
  6. 射频微波芯片设计4:耦合器芯片
  7. Tomcat官网下载对应版本
  8. .NetCore分布式部署中的DataProtection密钥安全性
  9. 目标优化之帕累托最优
  10. 亓官劼的2020年度总结
  11. c++基础题:判断某整数是正整数、负整数还是零
  12. 雷蛇zGold与Nexon America建立全球合作伙伴关系
  13. 会员管理-小程序-免费使用体验
  14. kettle性能及效率提升
  15. hexo搭建博客的几种方式(入门级)
  16. html5 | 通过js实现对网页文本内容语音朗读 | 教程
  17. 真正解决TextView行间距、字间距的问题
  18. softmax与sigmoid的区别
  19. python_torch_加载数据集_构建模型_构建训练循环_保存和调用训练好的模型
  20. argc和argv的说明

热门文章

  1. CherryPy 入门
  2. Cookie中设置了 HttpOnly,Secure 属性,有效的防止XSS攻击,X-Frame-Options 响应头避免点击劫持...
  3. 2018年的人工智能将如何发展?看看专家怎么说
  4. Postgresql、MySQL相关的四种索引类型:B-Tree,Hash,Gist,GIN
  5. rectiveCocoa进阶
  6. [转精]IO_STACK_LOCATION与IRP的一点笔记
  7. 人民币真的升值了吗?
  8. 关于嵌入式学习随笔-2《GPIO基础知识》
  9. python3访问map
  10. Repeater 控件的嵌套使用