- 浏览: 391650 次
- 性别:
- 来自: 深圳
-
文章分类
最新评论
-
Nabulio:
写的详细,特殊语法学习到了
jdk1.5-1.9新特性 -
wooddawn:
您好,最近在做个足球数据库系统,用到了betbrain的数据表 ...
javascript深入理解js闭包 -
lwpan:
很受启发 update也可以
mysql 的delete from 子查询限制 -
wuliaolll:
不错,总算找到原因了
mysql 的delete from 子查询限制
程序中记录日志一般有两个目的:Troubleshooting和显示程序运行状态。好的日志记录方式可以提供我们足够多定位问题的依据。日志记录大家都会认为简单,但如何通过日志可以高效定位问题并不是简单的事情。这里列举下面三个方面的内容,辅以代码示例,总结如何写好日志,希望对他人有所启发和帮助:
相关厂商内容
SpringOne首次空降中国·北京Spring&CloudFoundry,12月7~8日,限额免费报名中
QCon北京2013(4月25日~27日),18项精彩专题,现已启动,详情请点击
QCon北京2013(4月25日~27日),海外著名讲师确认,现已六折报名中
创业者之翼为创业新星免费提供甲级办公场所,详情请点击
天地行讲师龚书专访——基于AS3显示列表的2d游戏渲染优化
相关赞助商
SpringOne大会于12月7~8号首次落户北京,免费限额报名中,了解详情!
怎样记日志可以方便Troubleshooting
程序运行状态可以记哪些
应该避免怎样的日志方式
怎样记日志可以方便Troubleshooting?
1. 对外部的调用封装
程序中对外部系统与模块的依赖调用前后都记下日志,方便接口调试。出问题时也可以很快理清是哪块的问题
1. LOG.debug("Calling external system:" + parameters);
2. Object result = null;
3. try {
4. result = callRemoteSystem(params);
5. LOG.debug("Called successfully. result is " + result);
6. } catch (Exception e) {
7. LOG.warn("Failed at calling xxx system . exception : " + e);
8. }
2.状态变化
程序中重要的状态信息的变化应该记录下来,方便查问题时还原现场,推断程序运行过程
1. boolean isRunning;
2.
3. isRunning = true;
4. LOG.info("System is running");
5.
6. //...
7.
8. isRunning = false;
9. LOG.info("System was interrupted by " + Thread.currentThread().getName());
3.系统入口与出口:
这个粒度可以是重要方法级或模块级。记录它的输入与输出,方便定位
1. void execute(Object input) {
2. LOG.debug("Invoke parames : " + input);
3. Object result = null;
4.
5. //business logic
6.
7. LOG.debug("Method result : " + result);
8. }
4.业务异常:
任何业务异常都应该记下来:
1. try {
2. //business logical
3. } catch (IOException e) {
4. LOG.warn("Description xxx" , e);
5. } catch (BusinessException e) {
6. LOG.warn("Let me know anything");
7. } catch (Exception e) {
8. LOG.error("Description xxx", e);
9. }
10.
5.非预期执行:
为程序在“有可能”执行到的地方打印日志。如果我想删除一个文件,结果返回成功。但事实上,那个文件在你想删除之前就不存在了。最终结果是一致的,但程序得让我们知道这种情况,要查清为什么文件在删除之前就已经不存在
1. int myValue = xxxx;
2. int absResult = Math.abs(myValue);
3. if (absResult < 0) {
4. LOG.info("Original int " + myValue + "has nagetive abs " + absResult);
5. }
6.很少出现的else情况:
else可能吞掉你的请求,或是赋予难以理解的最终结果
1. Object result = null;
2. if (running) {
3. result = xxx;
4. } else {
5. result = yyy;
6. LOG.debug("System does not running, we change the final result");
7. }
程序运行状态可以记哪些?
程序在运行时就像一个机器人,我们可以从它的日志看出它正在做什么,是不是按预期的设计在做,所以这些正常的运行状态是要有的。
1. 程序运行时间:
1. long startTime = System.currentTime();
2.
3. // business logical
4.
5. LOG.info("execution cost : " + (System.currentTime() - startTime) + "ms");
2. 大批量数据的执行进度:
1. LOG.debug("current progress: " + (currentPos * 100 / totalAmount) + "%");
3.关键变量及正在做哪些重要的事情:
执行关键的逻辑,做IO操作等等
1. String getJVMPid() {
2. String pid = "";
3. // Obtains JVM process ID
4. LOG.info("JVM pid is " + pid);
5. return pid;
6. }
7.
8. void invokeRemoteMethod(Object params) {
9. LOG.info("Calling remote method : " + params);
10. //Calling remote server
11. }
应该避免怎样的日志方式?
1. 混淆信息的Log
日志应该是清晰准确的: 当看到日志的时候,你知道是因为连接池取不到连接导致的问题么?
1. Connection connection = ConnectionFactory.getConnection();
2. if (connection == null) {
3. LOG.warn("System initialized unsuccessfully");
4. }
2. 记错位置
产品代码中,使用console记录日志,导致没有找到日志。
1. } catch (ConfigurationException e) {
2. e.printStackTrace();
3. }
3. 记错级别
记错级别常常发生,常见的如:混淆代码错误和用户错误,如登录系统中,如果恶意登录,那系统内部会出现太多WARN,从而让管理员误以为是代码错误。可以反馈用户以错误,但是不要记录用户错误的行为,除非想达到控制的目的。
1. LOG.warn("Failed to login by "+username+");
4. 遗漏信息
这里可能包含两种情况:(1)用户自己少写了信息,导致毫无参考价值;(2)用户调用log的方式导致丢失信息,如下例,没有stack trace.
1. } catch (Exception ex) {
2. log.error(ex);
3. }
总结:
日志记录在程序员日常编程实践中必须面对的事情,本文针对这个话题谈了下自己的体会,希望读者能有所收益。多有不足,请多包涵。
相关厂商内容
SpringOne首次空降中国·北京Spring&CloudFoundry,12月7~8日,限额免费报名中
QCon北京2013(4月25日~27日),18项精彩专题,现已启动,详情请点击
QCon北京2013(4月25日~27日),海外著名讲师确认,现已六折报名中
创业者之翼为创业新星免费提供甲级办公场所,详情请点击
天地行讲师龚书专访——基于AS3显示列表的2d游戏渲染优化
相关赞助商
SpringOne大会于12月7~8号首次落户北京,免费限额报名中,了解详情!
怎样记日志可以方便Troubleshooting
程序运行状态可以记哪些
应该避免怎样的日志方式
怎样记日志可以方便Troubleshooting?
1. 对外部的调用封装
程序中对外部系统与模块的依赖调用前后都记下日志,方便接口调试。出问题时也可以很快理清是哪块的问题
1. LOG.debug("Calling external system:" + parameters);
2. Object result = null;
3. try {
4. result = callRemoteSystem(params);
5. LOG.debug("Called successfully. result is " + result);
6. } catch (Exception e) {
7. LOG.warn("Failed at calling xxx system . exception : " + e);
8. }
2.状态变化
程序中重要的状态信息的变化应该记录下来,方便查问题时还原现场,推断程序运行过程
1. boolean isRunning;
2.
3. isRunning = true;
4. LOG.info("System is running");
5.
6. //...
7.
8. isRunning = false;
9. LOG.info("System was interrupted by " + Thread.currentThread().getName());
3.系统入口与出口:
这个粒度可以是重要方法级或模块级。记录它的输入与输出,方便定位
1. void execute(Object input) {
2. LOG.debug("Invoke parames : " + input);
3. Object result = null;
4.
5. //business logic
6.
7. LOG.debug("Method result : " + result);
8. }
4.业务异常:
任何业务异常都应该记下来:
1. try {
2. //business logical
3. } catch (IOException e) {
4. LOG.warn("Description xxx" , e);
5. } catch (BusinessException e) {
6. LOG.warn("Let me know anything");
7. } catch (Exception e) {
8. LOG.error("Description xxx", e);
9. }
10.
5.非预期执行:
为程序在“有可能”执行到的地方打印日志。如果我想删除一个文件,结果返回成功。但事实上,那个文件在你想删除之前就不存在了。最终结果是一致的,但程序得让我们知道这种情况,要查清为什么文件在删除之前就已经不存在
1. int myValue = xxxx;
2. int absResult = Math.abs(myValue);
3. if (absResult < 0) {
4. LOG.info("Original int " + myValue + "has nagetive abs " + absResult);
5. }
6.很少出现的else情况:
else可能吞掉你的请求,或是赋予难以理解的最终结果
1. Object result = null;
2. if (running) {
3. result = xxx;
4. } else {
5. result = yyy;
6. LOG.debug("System does not running, we change the final result");
7. }
程序运行状态可以记哪些?
程序在运行时就像一个机器人,我们可以从它的日志看出它正在做什么,是不是按预期的设计在做,所以这些正常的运行状态是要有的。
1. 程序运行时间:
1. long startTime = System.currentTime();
2.
3. // business logical
4.
5. LOG.info("execution cost : " + (System.currentTime() - startTime) + "ms");
2. 大批量数据的执行进度:
1. LOG.debug("current progress: " + (currentPos * 100 / totalAmount) + "%");
3.关键变量及正在做哪些重要的事情:
执行关键的逻辑,做IO操作等等
1. String getJVMPid() {
2. String pid = "";
3. // Obtains JVM process ID
4. LOG.info("JVM pid is " + pid);
5. return pid;
6. }
7.
8. void invokeRemoteMethod(Object params) {
9. LOG.info("Calling remote method : " + params);
10. //Calling remote server
11. }
应该避免怎样的日志方式?
1. 混淆信息的Log
日志应该是清晰准确的: 当看到日志的时候,你知道是因为连接池取不到连接导致的问题么?
1. Connection connection = ConnectionFactory.getConnection();
2. if (connection == null) {
3. LOG.warn("System initialized unsuccessfully");
4. }
2. 记错位置
产品代码中,使用console记录日志,导致没有找到日志。
1. } catch (ConfigurationException e) {
2. e.printStackTrace();
3. }
3. 记错级别
记错级别常常发生,常见的如:混淆代码错误和用户错误,如登录系统中,如果恶意登录,那系统内部会出现太多WARN,从而让管理员误以为是代码错误。可以反馈用户以错误,但是不要记录用户错误的行为,除非想达到控制的目的。
1. LOG.warn("Failed to login by "+username+");
4. 遗漏信息
这里可能包含两种情况:(1)用户自己少写了信息,导致毫无参考价值;(2)用户调用log的方式导致丢失信息,如下例,没有stack trace.
1. } catch (Exception ex) {
2. log.error(ex);
3. }
总结:
日志记录在程序员日常编程实践中必须面对的事情,本文针对这个话题谈了下自己的体会,希望读者能有所收益。多有不足,请多包涵。
发表评论
-
将json格式的字符数组转为List对象
2015-08-10 15:18 910使用的是json-lib.jar包 将json格式的字符数组 ... -
用httpPost对JSON发送和接收的例子
2015-08-10 11:16 1106HTTPPost发送JSON: private static ... -
zookeeper适用场景:zookeeper解决了哪些问题
2015-07-31 18:01 766问题导读: 1.master挂机 ... -
java泛型
2015-07-29 10:48 774什么是泛型? 泛型(Ge ... -
Java线程Dump分析工具--jstack
2015-06-23 11:09 731jstack用于打印出给定的java进程ID或core fil ... -
什么是spark?
2015-04-10 09:37 499关于Spark: Spark是UC Berkeley AM ... -
dubbo 教程
2015-04-09 19:21 785先给出阿里巴巴dubbo的 ... -
jre/bin目录下面工具说明
2015-03-20 16:45 638jre/bin目录下面工具说明 ... -
JVM系列三:JVM参数设置、分析
2015-01-30 11:18 705不管是YGC还 ... -
jstat使用
2015-01-27 11:11 682jstat 1. jstat -gc pid ... -
查看java堆栈情况(cpu占用过高)
2015-01-27 11:10 7491. 确定占用cpu高的线程id: 方法一: 直接使用 ps ... -
慎用ArrayList的contains方法,使用HashSet的contains方法代替
2015-01-20 14:14 1151在启动一个应用的时候,发现其中有一处数据加载要数分钟,刚开始 ... -
Java虚拟机工作原理详解
2015-01-16 10:00 724一、类加载器首先来 ... -
jdk1.5-1.9新特性
2014-11-11 10:22 83661.51.自动装箱与拆箱:2.枚举(常用来设计单例模式 ... -
java动态代理(JDK和cglib)
2014-09-24 15:51 480JAVA的动态代理 代理模式 代理模式是常用的java设计 ... -
Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM)
2014-09-24 15:45 703class文件简介及加载 Java编译器编译 ... -
怎么用github下载资源
2014-09-24 11:18 4581、下载github:到http://windows. ... -
maven项目时jar包没有到lib目录下
2014-09-01 20:05 2605在建项目时路径都设置好了,为什么在eclipse中运行mav ... -
使用并行计算大幅提升递归算法效率
2014-08-27 15:04 608前言: 无论什么样的 ... -
JAVA 实现FTP
2014-08-22 14:41 709一个JAVA 实现FTP功能的代码,包括了服务器的设置模块, ...
相关推荐
在CRT中设置日志记录的方法主要分为两个步骤:配置全局选项和配置会话选项。以下是详细的设置步骤: 1. 配置全局选项: 打开CRT软件,进入“选项”菜单,选择“全局选项”。在这个界面,你会看到一系列可以自定义...
这个名为“日志记录组件”的项目,包含了一些核心文件,我们可以逐一解析它们的作用: 1. **reg.bat**:这是一个批处理文件,通常用于执行一系列命令行操作,比如注册动态链接库(DLL)到系统。在这个场景中,可能...
《网络游戏-无线网络控制器日志记录系统及其方法》 在当今的网络游戏环境中,无线网络控制器起着至关重要的作用。它们负责管理和协调网络资源,确保玩家能够流畅地进行游戏。本资料详细介绍了无线网络控制器日志...
在IT行业中,日志记录是不可或缺的一个环节,它对于软件的调试、监控和问题排查具有重要作用。"非常简单实用的日志记录软件,按天存放为txt文本" 是一种常见的日志管理方式,它便于我们组织和查找日志信息。下面我们...
本资源"安卓日志分析崩溃拦截相关-日志记录开源项目使用方法见说明.zip"提供了一个开源的日志记录工具,旨在帮助开发者更有效地收集和分析日志,以及拦截应用崩溃情况。 1. **日志记录**: 在Android系统中,开发者...
在软件开发领域,日志记录是不可或缺的一环,它对于程序的监控...随着技术的不断进步,日志记录的方法和工具也在不断地更新迭代,作为开发者,我们需要不断地学习和掌握这些新工具和新方法,以提高我们开发的软件质量。
通过上述介绍,我们了解了Oracle数据库中几种主要日志文件的作用及其查看方法。这些日志对于维护数据库系统的稳定性和解决故障具有重要意义。实际操作中,根据具体需求灵活运用上述方法,可以有效提高问题解决效率。...
Win7操作系统配置管理IIS日志记录的方法 IIS日志记录对于任何一个服务器来说都是至关重要的。在Windows7操作系统中,对于IIS日志记录来说有了很大的改进。不仅仅是日志的格式,还是其他的一些可选项上,操作系统...
此外,它们还支持多线程环境,确保在并发情况下日志记录的正确性和一致性。 日志框架通常具有以下几个关键特性: 1. **日志级别**:允许设置不同的日志级别,便于筛选需要关注的信息。 2. **日志定位**:通过类名、...
本发明提出了一种基于Linux内核的日志记录方法及系统,通过对日志记录流程的优化,实现了不同应用程序日志信息的有效分离,极大地提高了日志管理的便捷性和问题排查的效率。这对于大型服务器集群环境下的日志管理尤...
Log4j是一个强大的日志记录框架,它为Java应用程序提供了灵活的日志记录机制。通过合理配置Logger、Appender和Layouts,开发者可以有效地管理和控制日志输出,从而提高程序的可维护性和调试效率。此外,通过对日志...
在IT行业中,SpringMVC和AOP(面向切面编程)是两个非常重要的概念,尤其在企业级Web应用开发中广泛...在实际项目中,这样的日志记录方案能够帮助我们追踪和分析系统的运行状态,对问题排查和性能优化具有重要作用。
3. `DatabaseLoggerFactory.cs`和`FileLoggerFactory.cs`:这两个类是`LoggerFactory`的具体实现,分别代表数据库日志记录器工厂和文件日志记录器工厂。它们继承自`LoggerFactory`,并实现了`CreateLogger()`方法,...
4. 修改系统配置:可以通过修改服务设置,暂时停止日志记录服务,然后删除日志文件,但这种方法可能会影响系统的正常运行。 5. 外部工具:有些第三方软件提供日志清理功能,可以安全地清除或压缩日志,同时不会影响...
本文将详细讲解如何使用 FireDAC 的 Delta 功能来记录操作日志以及如何将 Delta 转换为 SQL 语句,这对于数据库的版本控制、数据审计和错误恢复具有重要意义。 首先,让我们了解什么是 Delta。在 FireDAC 中,Delta...
在这篇文章中,我们将深入探讨如何在Windows环境下高效地使用C/C++进行日志记录,以及这两个库的作用和使用方法。 首先,`log.dll` 是一个动态链接库,它包含预编译的函数和代码,用于实现日志功能。当程序运行时,...
施工日志和安全日志是建筑工程施工管理中至关重要的文档,它们详实记录了工程的进度、质量和安全状况,对于工程的监督、检查和后期分析具有不可替代的作用。 首先,施工日志的填写规范要求明确,必须按照单位工程...
首先,作为最基础的文本记录工具,记事本在记录开发日志、资料和代码方面发挥了重要作用。开发日志是软件开发过程中不可或缺的组成部分。它记录着开发者的工作进度、遇到的困难、解决问题的方法以及对程序改进的思考...
log4j 框架是实现日志规范和级别的不错的选择,它提供了灵活的日志记录机制,能够满足不同的日志记录需求。通过使用 log4j,我们可以轻松地实现日志的记录、分析和管理,提高程序的可靠性和稳定性。
文章主要探讨了西门子S7-1200可编程逻辑控制器(PLC)在数据日志记录方面的作用及其应用优势。随着工业自动化与信息化的不断深入,PLC已成为控制系统的核心组件。PLC不仅能够采集工艺与仪表测量数据,还能进行数据...