atitit. 日志系统的原则and设计and最佳实践(1)-----原理理论总结.
atitit. 日志系统的原则and设计and最佳实践总结.
8. 日志的level debug太详细,又恐怕影响性能,Info又不足够,动态切换又麻烦的,怎么办了???
4
11. 日志数据会包括描述和上下文两部分, 比如下面的日志: 4
17. 获得 request或session对象数据通过编写过滤器(ResFilter.java) MDC 6
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)-----原理理论总结.的更多相关文章
- Atitit.日志系统slf4j的使用
Atitit.日志系统slf4j的使用 SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar ...
- Atitit.软件开发概念说明--io系统区--特殊文件名称保存最佳实践文件名称编码...filenameEncode
Atitit.软件开发概念说明--io系统区--特殊文件名称保存最佳实践文件名称编码...filenameEncode 不个网页title保存成个个文件的时候儿有无效字符的问题... 通常两个处理方式 ...
- Prometheus Metrics 设计的最佳实践和应用实例,看这篇够了!
Prometheus 是一个开源的监控解决方案,部署简单易使用,难点在于如何设计符合特定需求的 Metrics 去全面高效地反映系统实时状态,以助力故障问题的发现与定位.本文即基于最佳实践的 Metr ...
- atitit.人脸识别的应用场景and使用最佳实践 java .net php
atitit.人脸识别的应用场景and使用最佳实践 java .net php 1. 人脸识别的应用场景 1 2. 框架选型 JNI2OpenCV.dll and JavaCV 1 3. Url ap ...
- atitit.人脸识别的应用场景and使用最佳实践 java .net php
atitit.人脸识别的应用场景and使用最佳实践 java .net php 1. 人脸识别的应用场景1 2. 标准化的api1 3. 框架选型 JNI2OpenCV.dll and JavaCV ...
- Atitit.列表页面and条件查询的实现最佳实践(1)------设置查询条件and提交查询and返回json数据
Atitit.列表页面and条件查询的实现最佳实践(1)------设置查询条件and提交查询and返回json数据 1. 1. 配置条件字段@Conditional 1 1 2. 2. 配置条件字段 ...
- Atitit 数据库view视图使用推荐规范与最佳实践与方法
Atitit 数据库view视图使用推荐规范与最佳实践与方法 1. 视图的优点:1 1.1. **提升可读性 定制用户数据,聚焦特定的数据1 1.2. 使用视图,可以简化数据操作. 1 ...
- 从0系统学Android--2.6 Activity 的最佳实践
从0系统学Android--2.6 Activity 的最佳实践 本系列文章目录:更多精品文章分类 本系列持续更新中.... 实践中的技巧 2.6.1 知晓当前是在哪个 Activity 这个其实很简 ...
- QingStor 对象存储架构设计及最佳实践
对象存储概念及特性 在介绍 QingStor️对象存储内部的的架构和设计原理之前,我们首先来了解一下对象存储的概念,也就是从外部视角看,对象存储有什么特性,我们应该如何使用. 对象存储本质上是一款存储 ...
随机推荐
- BigDecimal最基础用法
BigDecimal最基础用法 用字符串生成的BigDecimal是不会丢精度的. 简单除法. public class DemoBigDecimal { public static void mai ...
- C# 命令绑定
在构建WinForm程序中,为了使系统的结构清晰,有好的用户交互体验,实现不同按钮之间的交互,不使主窗体里面的代码臃肿.将按钮的命令通过类进行绑定,实现命令的管理使很有必要的. 该文章是将如何实现Bu ...
- Selenium2+python自动化14-iframe
前言 有很多小伙伴在拿163作为登录案例的时候,发现不管怎么定位都无法定位到,到底是什么鬼呢,本篇详细介绍iframe相关的切换 以http://mail.163.com/登录页面10为案例,详细介绍 ...
- knockout.js $index 做列表索引小技巧
我们都知道,在foreach binding中,使用$index可以得到基于0的索引序号,但在列表显示中,我们更希望这个索引是从1开始的,怎么处理呢? 这里,有个小技巧:使用$index() + 1, ...
- 使用Servlet实现图片下载
package chensi.com; import java.io.FileInputStream; import java.io.IOException; import java.net.URLE ...
- DB2不记录事务日志
1. DB2大数据处理不记录事务日志步骤: 建表需要添加属性“NOT LOGGED INITIALLY” 在大批量更改操作的同一个事务开始时执行:“ALTER TABLE tabname ACTI ...
- sqlserver,mysql,oracle通用的模拟和改进的全文搜索算法
问:数据库效率最低的地方是什么? 答:表扫描 问:表扫描常见的情况是 答:like '%a%' 这类查询 如果使用全文检索引擎,又无法满足我们的需求的时候怎么办,比如要从 一个商品名称 "农 ...
- BZOJ3173 TJOI2013最长上升子序列(Treap+ZKW线段树)
传送门 Description 给定一个序列,初始为空.现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置.每插入一个数字,我们都想知道此时最长上升子序列长度是多少? Input ...
- JavaWeb学习总结(三)——Tomcat服务器学习和使用(二)
一.打包JavaWeb应用 在Java中,使用"jar"命令来对将JavaWeb应用打包成一个War包,jar命令的用法如下:
- 【整理】--VC 编译整理
.h用于编译阶段的审核,如在math.h中有函数声明:int abs(int);但是在使用中写为#include <math.h>...abs(3,5);编译器阶段就会检测出错误. .dl ...