日志的设计
首先说明, 这里的日志, 是指用于的调试,查错的系统日志, 而不是应用日志。
应用日志可以看作是产品功能的一部分, 因为他会被用户使用。 比如帐户的明细。
系统日志是调试和维护程序非常有用的工具。因为经常会被用到, 所以我总结了一下日志设计时的一些经验。
首先, 对日志的需求:
1. 日志接口必须尽量简单,比如java 中的Log.log(Object ob)。不要throw 任何exception, 因为日志不因对程序的运行逻辑产生任何影响,
因此, 返回值也是不需要的
2. 日志作为程序的最底层模块, 必须是最可靠, 依赖性最小, 以保证在任何环境中, 在系统运行在任何状态时都能产生日志供程序员查看。
3. 为了提高performance, 日志模块的所有接口的实现都应该是异步的,并且使用cache, 避免日志的I/O操作占用主程序的运行时间
 如果eable cache, 日志接口被调用时,都只是被写进cache, 另外有一个线程负责定时把cache刷新到文件
 该线程每隔一定时间查看cache满足下列两个条件之一的话就flush cache
 1. cache里有日志内容, 并且长度超过了设定的cache的最大值.
 2. cache里有内容, 但是没有超过cache max size, 但是已经超过了一定时间没有flush cache了, 这时也要刷新cache,
 这是为了不让日志被cache太长时间,从而用户无法从文件中看到最后的日志(这是新的feature, 再也不用担心一定要手工flush日志了, 呵呵)

4。 为了灵活性,日志应分成log, event, warning, error, trace, 每一种都可以被单独关闭和打开。对于trace, 还有一个level作为参数,如果trace的level
低于系统运行的level, 则被记录, 否则不被记录。系统运行时的trace level应该在系统启动时从配置文件中载入。
5。 为了增加日志的可用性。日志模块在写日志时应该自动输出时间,日志类型, 级别,线程ID, 发生该日志的文件, 行号,类名(java可以)和函数名(java和gcc可以)。
例如:
2005-04-14 15:58:51.477 [trace-100 CXI] thread:SAPEngine_Application_Thread[impl:3]_4   enter(com.sap.aci.lom.cxi.CXIHandler.handleRequest(CXIHandler.java:25))
2005-04-14 15:58:51.487 [log CXI]       thread:SAPEngine_Application_Thread[impl:3]_4   username=Administrator(com.sap.aci.lom.cxi.CXIHandler.handleRequest(CXIHandler.java:35))
2005-04-12 15:32:23.211 [error SolMgrCon]       thread:SAPEngine_System_Thread[impl:5]_56       com.sap.mw.jco.JCO$Exception: (101) RFC_ERROR_PROGRAM: 'ashost' is missing^M
****stack***^M
com.sap.mw.jco.JCO$Exception: (101) RFC_ERROR_PROGRAM: 'ashost' is missing^M
com.sap.mw.jco.MiddlewareJRfc.generateJCoException(MiddlewareJRfc.java:413)^M
com.sap.mw.jco.MiddlewareJRfc$Client.connect(MiddlewareJRfc.java:823)^M
com.sap.mw.jco.JCO$Client.connect(JCO.java:2923)^M
com.sap.mw.jco.JCO$Pool.initPool(JCO.java:4380)^M
com.sap.mw.jco.JCO$PoolManager.getClient(JCO.java:5758)^M
com.sap.mw.jco.JCO$PoolManager.getClient(JCO.java:5713)^M
com.sap.mw.jco.JCO.getClient(JCO.java:7995)^M
com.sap.mw.jco.JCO$Repository.queryFunctionInterface(JCO.java:19517)^M
com.sap.mw.jco.JCO$Repository.getFunctionInterface(JCO.java:19641)^M
com.sap.mw.jco.JCO$BasicRepository.getFunctionTemplate(JCO.java:18709)^M
com.sap.aci.lom.SolManConnect.Messenger.createFunction(Messenger.java:178)^M
com.sap.aci.lom.SolManConnect.Messenger.RegisterACPage(Messenger.java:292)^M
com.sap.aci.lom.SolManConnect.Messenger.RegisterACPage(Messenger.java:329)^M
com.sap.aci.lom.SolManConnect.SolManConnect.initialize(SolManConnect.java:56)^M
com.sap.aci.lom.Lom.Init(Lom.java:61)^M
com.sap.aci.DAL.ACCService.containerStarted(ACCService.java:340)^M
com.sap.engine.core.service630.container.ContainerEventListenerWrapper.processEvent(ContainerEventListenerWrapper.java:141)^M
com.sap.engine.core.service630.container.ContainerEventListenerWrapper.run(ContainerEventListenerWrapper.java:101)^M
com.sap.engine.frame.core.thread.Task.run(Task.java:60)^M
com.sap.engine.core.thread.impl5.SingleThread.execute(SingleThread.java:73)^M
com.sap.engine.core.thread.impl5.SingleThread.run(SingleThread.java:145)^M
^M
****end of stack***^M
(com.sap.aci.base.log.Log.error(Log.java:112))^M
6。当系统有很多模块组成时, 日志的接口可以提供模块名称作为参数, 把不同的模块产生的日志写到不同的文件中。这样可以方便调试单个模块。
7. 日志模块可以提供一些utility的方法, 比如getStack, WriteToFile供用户使用。
8。日志文件最好以日期区分, 比如ACC-20050102.LOG, ACC-20050103.LOG
9. 日志模块的设置和行为可以在运行时被改变, 比如是否使用cache, 日志文件的路径, 日志的级别等等。
10. 注意日志模块关闭时停止cache的管理线程。

日志文件设计学习(一)相关推荐

  1. 别人的Linux私房菜(19)认识与分析日志文件

    日志文件通常只有root可以读取,解决系统和网络方面的问题. /var/log/boot.log本次开机系统检测和启动硬件,和内核支持的相关功能的信息记录. /var/log/cron计划任务有没有被 ...

  2. 日志库EasyLogging++学习系列(10)—— 日志文件滚动

    在很多应用场合,我们是需要实现日志文件滚动的,特别是在一些长期运行的服务器程序中,如果把所有的日志都记录在一个文件之中,势必会造成日志文件越来越大.当日志内容很多的时候,万一哪天突然需要查询某个日志信 ...

  3. oracle的脚本日志,学习笔记:Oracle alert日志文件巡检脚本

    天萃荷净 分享一篇Oracle alert日志文件巡检脚本 每天都检查oracle日志,所以写了一个比较完善的shell,让其自动处理,在运行程序之前,需要在该脚本目录下新建tmp目录 #!/usr/ ...

  4. 【实操日记】使用 PyQt5 设计下载远程服务器日志文件程序

    最近通过 PyQt5 设计了一个下载服务器指定日期日志文件的程序,里面有些有意思的技术点,现在做一些分享. PyQt5 是一套 Python 绑定 Digia Qt5 应用的框架,是最强大的 GUI ...

  5. UI设计学习:UI 设计师文件命名规范

    UI设计学习:UI 设计师文件命名规范 命名,是困扰很多 UI设计师的常见问题之一.从我们开始在软件中设计内容时,就要对图层.图层文件夹进行命名,到对接开发的时候,还要对切图进行命名,再到管理我们的版 ...

  6. mysql dba系统学习(8)查询日志文件功能 mysql dba系统学习(9)slow query log慢查询日志功能

    查询日志的作用是记录所有客户端发来的sql语句,也就是记录客户端的所有操作 Log参数将要过时,现在用general_log来代替 打开查询日志功能 mysql> showvariables l ...

  7. 查看mysql8日志_mysql dba系统学习(8)查询日志文件功能

    查询日志的作用是记录所有客户端发来的sql语句,也就是记录客户端的所有操作 Log参数将要过时,现在用general_log来代替 打开查询日志功能 mysql> showvariables l ...

  8. 怎么查看linux日志里请求量最高的url访问最多的_LoaRunner性能测试系统学习教程:日志文件分析(8)...

    上期我们讲到LoaRunner性能测试MPM相关参数,这期我们讲LoaRunner性能测试日志文件分析. 日志文件分析 为了有效地管理web服务器,以及获取有关服务器活动和性能相关的数据反馈.Apac ...

  9. mysql dba系统学习(8)查询日志文件功能

    查询日志的作用是记录所有客户端发来的sql语句,也就是记录客户端的所有操作 Log参数将要过时,现在用general_log来代替 打开查询日志功能 mysql> showvariables l ...

最新文章

  1. WPF之DataGrid篇:DataGridComboBoxColumn
  2. 007_JavaScript关键字和保留字
  3. 关于PR转PO的注意事项
  4. Caused by: java.net.BindException: Could not start rest endpoint on any port in port range 8085
  5. 27个机器学习图表翻译_使用机器学习的信息图表信息组织
  6. android懒加载单实例,【 Android 10 设计模式 】系列 -- 单例
  7. java enummap_Java EnumMap values()方法与示例
  8. python3爬取网易云歌单数据清洗_如何利用Python网络爬虫爬取网易云音乐歌词
  9. [leetcode]Longest Consecutive Sequence
  10. ionic 图片显示在屏幕中间_iPad屏幕坏点亮点怎么看 自查iPad屏幕坏点亮点方法【详解】...
  11. 修改user-agent爬取数据 遇到的问题
  12. php tp框架验证,tp5.1验证 - thinkphp5.1框架学习 - php中文网博客
  13. 马尔科夫区制转移向量自回归模型,MSVAR模型,MS-VAR模型的使用和操作过程
  14. 你还记得大明湖畔的oop原则吗?
  15. 动态路由ospf、DR和BDR
  16. STM32通过IIC读取MPU6050原始数据过程详解
  17. 第五天实验---MGRE环境下的OSPF实验
  18. (数据科学学习手札37)ggplot2基本绘图语法介绍
  19. java中io流,Reader和Writer,InputStream和OutputStream,转换流 InputStreamReader 和 OutputStreamWriter
  20. 基于JavaScript的网页版【定期存款计算器 - DepositCaculator v1.0】

热门文章

  1. 繁体字_如何简单快速地批量认识繁体字?
  2. 三种强大的物体识别算法——SIFT/SURF、haar特征、广义hough变换的特性对比分析
  3. Python网络编程基础
  4. tomcat加上了https后访问不了_西部数码使用指南:部署https后访问提示存在安全隐患的排查解决方法...
  5. iPad Air 2完全评测:可怕的三核CPU、六核GPU
  6. 计算机中的数学【线性代数】向量空间的概念
  7. dubbo之分组聚合
  8. Spring、Spring Boot和TestNG测试指南 - 测试@Configuration
  9. codeforces798C - Mike and gcd problem (数论+思维)
  10. js 定时器用法详解——setTimeout()、setInterval()、clearTimeout()、clearInterval()