OK,现在我们来研究下Java相关的日志。

日志记录是应用程序运行中必不可少的一部分。具有良好格式和完备信息的日志记录可以在程序出现问题时帮助开发人员迅速地定位错误的根源。对于开发人员来说,在程序中使用日志API记录日志并不复杂,不过遵循一些最佳实践可以更好的利用日志。本系列介绍了在Java程序中记录日志的最佳实践,同时也介绍了如何使用开源软件对日志进行聚合和分析。

对于现在的应用程序来说,日志的重要性是不言而喻的。很难想象没有任何日志记录功能的应用程序运行在生产环境中。日志所能提供的功能是多种多样的,包括记录程序运行时产生的错误信息、状态信息、调试信息和执行时间信息等。在生产环境中,日志是查找问题来源的重要依据。应用程序运行时的产生的各种信息,都应该通过日志 API 来进行记录。很多开发人员习惯于使用 System.out.println、System.err.println 以及异常对象的 printStrackTrace 方法来输出相关信息。这些使用方式虽然简便,但是所产生的信息在出现问题时并不能提供有效的帮助。这些使用方式都应该改为使用日志

API。使用日志 API 并没有增加很多复杂度,但是所提供的好处是显著的。

尽管记录日志是应用开发中并不可少的功能,在 JDK 的最初版本中并不包含日志记录相关的 API 和实现。相关的 API(java.util.logging 包,JUL)和实现,直到 JDK 1.4 才被加入。因此在日志记录这一个领域,社区贡献了很多开源的实现。其中比较流行的包括 log4j 及其后继者 logback。除了真正的日志记录实现之外,还有一类与日志记录相关的封装 API,如 Apache Commons Logging 和 SLF4J。这类库的作用是在日志记录实现的基础上提供一个封装的 API 层次,对日志记录

API 的使用者提供一个统一的接口,使得可以自由切换不同的日志记录实现。比如从 JDK 的默认日志记录实现 JUL 切换到 log4j。这类封装 API 库在框架的实现中比较常用,因为需要考虑到框架使用者的不同需求。在实际的项目开发中则使用得比较少,因为很少有项目会在开发中切换不同的日志记录实现。本系列博客对于这两类库都会进行具体的介绍。

值得注意和反思的是:记录日志只是有效地利用日志的第一步,更重要的是如何对程序运行时产生的日志进行处理和分析。典型的情景包括当日志中包含满足特定条件的记录时,触发相应的通知机制,比如邮件或短信通知;还可以在程序运行出现错误时,快速地定位潜在的问题源。这样的处理和分析的能力对于实际系统的维护尤其重要。当运行系统中包含的组件过多时,日志对于错误的诊断就显得格外重要。

日志的原理

假如我们现在没有日志系统,那么我们只能system.out.println来输出我们的相关代码来监控我们的项目运行情况了。OK,现在我们来写一个例子:

package org.linkinpark.commons.logtest;

public class Linkin

{

public static void main(String[] args)

{

log();

}

public static void log()

{

for (int i = 0; i < 3; i++)

{

for (int j = 0; j < 3; j++)

{

System.out.println("开始输出日志:第" + i + "*" + j + "次!");

}

}

}

}

2次循环后我们在控制台输出了i*j的效果,这种日志方式非常简单,但是缺点也非常明显。这种输出是不可控制的,对于较复杂的程序,所有的信息都将输出到屏幕,日志的可读性非常差。而且输出到屏幕需要消耗资源,大量的io操作会使程序运行变

慢。那么我们现在来改进一下,代码如下:

package org.linkinpark.commons.logtest;

public class Linkin

{

private static boolean flag = true;

public static void main(String[] args)

{

log();

}

public static void log()

{

for (int i = 0; i < 3; i++)

{

for (int j = 0; j < 3; j++)

{

if (flag)

{

System.out.println("开始输出日志:第" + i + "*" + j + "次!");

}

}

}

}

}

上面的代码没什么好解释的,我们通过了一个旗标来控制日志的输出。虽然这个时候日志的输出已经可控了,但是也只有2个级别,就是输出与不输出。flag旗标为false时不输出,flag旗标是true时输出。

Log4j等日志工具也都是这个原理,但是增加了很多的输出级别。输出级别,输出样式,输出目的地都可以在配置文件中配置,而不是写4在我们的程序中,增加了灵活性。

java 日志的作用_java日志概述和原理相关推荐

  1. java继承的作用_Java继承概述以及Java继承案例和继承的好处

    Java继承概述 1.多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些相同属性和行为,只要继承那个类即可. 2.在Java中通过extends关键字可以实现类与类的 ...

  2. java 日志存储方案_Java 日志缓存机制的实现

    原标题:Java 日志缓存机制的实现 来源:盛江涛, 李思舒, 赵海兵 www.ibm.com/developerworks/cn/java/j-lo-logbuffer/index.html 程序员 ...

  3. java关键字的作用_java关键字及其作用

    java关键字及其作用 java 关键字及其作用 一. 关键字总览:关键字 含义abstract 表明类或者成员方法具有抽象属性assert 用来进行程序调试boolean 基本数据类型之一,布尔类型 ...

  4. java exception 行号_java日志记录错误的文件_方法_行号_报错信息

    1.java日志记录错误的文件.方法.行号.报错信息 StackTraceElement s= e.getStackTrace()[0]; 1.1.记录保存的文件s.getFileName() 1.2 ...

  5. java打印输出 怎么隔开_java日志分开打印

    log4j.rootLogger=DEBUG,CONSOLE #在生产配置下,请关闭应用于控制台CONSOLE选项,仅启用FILE及可 #待验证是否需要 log4j.additivity.com.un ...

  6. java ee domain作用_java EE应用概述

    1.javaEE应用的分层模型 不管是经典的Java EE架构,还是轻量级的Java EE架构,大致上都可以分为以下几层: Damain Object(领域对象)层:该层是由系列的POJO(普通的,传 ...

  7. java 守护线程 作用_java中守护线程的一些概念和用法

    网上的资料中,守护线程的功能一般都是"只要当前JVM实例中尚存任何一个非守护线程没有结束,守护线程就全部工作:只有当最后一个非守护线程结束是,守护线程随着JVM一同结束工作,Daemon作用 ...

  8. mysql日志的作用_MySQL 日志相关知识总结

    数据库中用于存储数据的文件称为data file,日志文件称为log file.此外,如果每次读写都是直接访问磁盘,性能很差,所以数据库是有缓存的,数据缓存是data buffer,日志缓存log b ...

  9. java对象序列化作用_Java学习之——理解对象序列化

    Java的对象序列化就是把对象写入到输出流中,用来存储或传输:反序列化就是从输入流中读取对象.简单的来说是指将那些实现了Serializable接口的对象转换成一个字节序列,并能够在以后将这个字节序列 ...

最新文章

  1. java on RHEL5
  2. USB接口的键盘描述符范例
  3. 【翻译】WF从入门到精通(第六章):加载和卸载实例
  4. python制作自动回复脚本_python itchat实现微信自动回复的示例代码
  5. 架构思维其实就那么回事
  6. JUnit4参数化和理论示例
  7. 自动驾驶路径轨迹规划(三阶曲线spline)
  8. Vmware Workstation 6.5试用之二—支持设备的热插拔功能
  9. DEDECMS使用SQL语句批量删除文章
  10. 线程创建方式3-实现 callable接口(Java)
  11. 一、安装mysql 单机版
  12. 计算机设计思想 —— 类比、建模与隐喻(同构)
  13. 计算机网络实验三思考题,计算机网络实验思考题答案
  14. 华尔街持续唱多美股市场,微美全息发布VR设备领涨科技股
  15. PD快充协议JD6606S资料
  16. Web 自动化神器 TestCafe(二)—元素定位篇
  17. 手把手教用matlab做无人驾驶
  18. 水平型微指令与垂直型微指令
  19. 查看打开物料账期 MMRV 和 MMPV
  20. 【Python】 计算最大回撤率(金融工程)

热门文章

  1. iphone4原理图
  2. pyqt QSpinBox详细用法
  3. 正则之贪婪与非贪婪模式
  4. 写一段程序来随机播放10首歌曲,要求不能重复。
  5. wsl Hyper-V 与 安卓模拟器虚拟机同时共存方案
  6. ajax局部操作,ajax局部刷新是怎么操作的?具体什么步骤呢?
  7. java多层map嵌套取值_java中map的多层遍历
  8. 写最好的Docker安装最新版MySQL8(mysql-8.0.31)教程(参考Docker Hub和MySQL官方文档)
  9. python中计数器函数_Python中使用多个函数的字计数器
  10. iterm2高级应用