热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java日志系列(一)log4j

java日志是开发过程中一个绕不过的坎,优雅的日志是开发一个优秀系统必不可少的。java日志组件有很多种,比如经常用到的log4j。却一直没有对java

java日志是开发过程中一个绕不过的坎,优雅的日志是开发一个优秀系统必不可少的。java日志组件有很多种,比如经常用到的log4j。

却一直没有对java日志系列进行一个系统的学习与整理。本文将详细整理java日志系列组件。

1.从零开始

日志记录是应用程序运行中必不可少的一部分。具有良好格式和完备信息的日志记录可以在程序出现问题时帮助开发人员迅速地定位错误的根源。

就像我们在简单代码里加入System.out.println();是一样的。我们需要看到一些输出来让我们看到这个程序正在跑着。当然,如果程序出现问题,我们也需要一些输出来

告诉我们,程序挂了,我们更想知道的是程序挂在哪个地方了。当程序比较复杂,运行时间比较长的时候,我们可能需要记录程序运行过程中发生过的事件,便于我们在程序

出现问题的时候去查找历史记录从而发现问题。总之,日志在程序开发过程中是非常重要的。

2.log4j

log4j的重要性不言而喻。很多java开发人员的第一次日志应用就给了log4j。代码是程序员最好的交流方式,话不多说直接上。

1 package com.lf.testLog4j;
2
3 import org.apache.log4j.Logger;
4
5 /**
6 * Created by lufei3 on 2015/7/5.
7 */
8 public class HelloLog4j {
9 private static Logger logger = Logger.getLogger(HelloLog4j.class);
10
11 /**
12 * @param args
13 */
14 public static void main(String[] args) {
15 // System.out.println("This is println message.");
16
17 // 记录debug级别的信息
18 logger.debug("This is debug message.");
19 // 记录info级别的信息
20 logger.info("This is info message.");
21 // 记录error级别的信息
22 logger.error("This is error message.");
23 }
24 }

再看输出:

像System.out.println();一样把信息打印在了控制台。

这就是log4j的主要功能,很简单吧,当然,要实现这样简单的功能还有两个必不可少的步骤

(1).引入log4j的包。不多说,通过maven管理,或者自行下载引入皆可。  

(2).添加log4j.perporties或者log4j.xml配置文件。内容如下:

log4j.perporties,这个配置文件非常简单的展示了log4j的配置信息。它表明把日志信息以简单的SimpleLayout格式展示到控制台。就向上图所示那样。

#可以设置级别:debug>info>error
#debug:显示debug、info、error
#info:显示info、error
#error:只error
log4j.rootLogger
=debug,appender1
#log4j.rootLogger
=info,appender1
#log4j.rootLogger
=error,appender1#输出到控制台
log4j.appender.appender1
=org.apache.log4j.ConsoleAppender
#样式为TTCCLayout
log4j.appender.appender1.layout
=org.apache.log4j.SimpleLayout

不过如果只是这样的话你就太小看log4j了,它还有许多其他的功能,下面log4j.xml给出了详细的配置

<log4j:configuration xmlns:log4j&#61;"http://jakarta.apache.org/log4j/" debug&#61;"false"> <appender name&#61;"myConsole" class&#61;"org.apache.log4j.ConsoleAppender"> <param name&#61;"Target" value&#61;"System.out"/> <param name&#61;"Threshold" value&#61;"INFO"/> <layout class&#61;"org.apache.log4j.PatternLayout"> <param name&#61;"ConversionPattern" value&#61;"%d{ABSOLUTE} %-5p [%c{1}] %m%n"/> layout> appender> <appender name&#61;"myFile" class&#61;"org.apache.log4j.DailyRollingFileAppender"> <param name&#61;"File" value&#61;"../logs/mylog.log"/> <param name&#61;"Append" value&#61;"true"/> <param name&#61;"DatePattern" value&#61;"&#39;.&#39;yyyy-MM-dd&#39;.log&#39;"/> <layout class&#61;"org.apache.log4j.PatternLayout"> <param name&#61;"ConversionPattern" value&#61;"%d %-5p [%c] %m%n"/> layout> appender> <appender name&#61;"ERROR_LOG" class&#61;"org.apache.log4j.DailyRollingFileAppender"> <errorHandler class&#61;"org.apache.log4j.helpers.OnlyOnceErrorHandler"/> <param name&#61;"File" value&#61;"error.log"/> <param name&#61;"Append" value&#61;"true"/> <param name&#61;"Threshold" value&#61;"INFO"/> <param name&#61;"DatePattern" value&#61;"&#39;.&#39;yyyy-MM-dd&#39;.log&#39;"/> <layout class&#61;"org.apache.log4j.PatternLayout"> <param name&#61;"ConversionPattern" value&#61;"%d %-5p [%c] %m%n"/> layout> appender> <logger name&#61;"DSErrorLog" additivity&#61;"false"> <level class&#61;"org.apache.log4j.Level" value&#61;"DEBUG"/> <appender-ref ref&#61;"ERROR_LOG"/> logger> <category name&#61;"org.hibernate.SQL"> <priority value&#61;"DEBUG"/> category> <root> <priority value &#61;"INFO"/> <appender-ref ref&#61;"myConsole"/> <appender-ref ref&#61;"myFile"/> root>
log4j:configuration>

 

 为了增加效率我们通常会增加判断

// 记录debug级别的信息
if (logger.isDebugEnabled()) {logger.debug("This is debug message from Dao.");
}
// 记录info级别的信息
if (logger.isInfoEnabled()) {logger.info("This is info message from Dao.");
}
// 记录error级别的信息
logger.error("This is error message from Dao.");

这里来探讨一下为什么增加个判断就可以提高效率呢&#xff0c;其实没有logger.isDebugEnabled()这类的判断&#xff0c;日志也会输出的&#xff0c;只是&#xff0c;在输出之前也会判断日志级别&#xff0c;如果满足条件则输出&#xff0c;否则&#xff0c;不输出&#xff0c;然而&#xff0c;如果不在方法之前做日志级别判断的话&#xff0c;进入方法前会把并不需要输出的字符串进行拼接&#xff0c;显然这样效率是底下的。

 本文地址&#xff1a;http://www.cnblogs.com/danseqianbi/p/4623092.html

转:https://www.cnblogs.com/danseqianbi/p/4623092.html



推荐阅读
  • 本文探讨了在使用JavaMail发送电子邮件时,抄送功能未能正常工作的问题,并提供了详细的代码示例和解决方法。 ... [详细]
  • 问题场景用Java进行web开发过程当中,当遇到很多很多个字段的实体时,最苦恼的莫过于编辑字段的查看和修改界面,发现2个页面存在很多重复信息,能不能写一遍?有没有轮子用都不如自己造。解决方式笔者根据自 ... [详细]
  • 在Java开发中,保护代码安全是一个重要的课题。由于Java字节码容易被反编译,因此使用代码混淆工具如ProGuard变得尤为重要。本文将详细介绍如何使用ProGuard进行代码混淆,以及其基本原理和常见问题。 ... [详细]
  • Maven + Spring + MyBatis + MySQL 环境搭建与实例解析
    本文详细介绍如何使用MySQL数据库进行环境搭建,包括创建数据库表并插入示例数据。随后,逐步指导如何配置Maven项目,整合Spring框架与MyBatis,实现高效的数据访问。 ... [详细]
  • 本文探讨了如何通过优化 DOM 操作来提升 JavaScript 的性能,包括使用 `createElement` 函数、动画元素、理解重绘事件及处理鼠标滚动事件等关键主题。 ... [详细]
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
  • 问题描述现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中 ... [详细]
  • 本文将详细介绍如何使用Java编程语言生成指定数量的不重复随机数,包括具体的实现方法和代码示例。适合初学者和有一定基础的开发者参考。 ... [详细]
  • spring boot使用jetty无法启动 ... [详细]
  • 本文探讨了如何通过Service Locator模式来简化和优化在B/S架构中的服务命名访问,特别是对于需要频繁访问的服务,如JNDI和XMLNS。该模式通过缓存机制减少了重复查找的成本,并提供了对多种服务的统一访问接口。 ... [详细]
  • Jupyter Notebook多语言环境搭建指南
    本文详细介绍了如何在Linux环境下为Jupyter Notebook配置Python、Python3、R及Go四种编程语言的环境,包括必要的软件安装和配置步骤。 ... [详细]
  • 本文介绍了一个使用Spring框架和Quartz调度器实现每周定时调用Web服务获取数据的小项目。通过详细配置Spring XML文件,展示了如何设置定时任务以及解决可能遇到的自动注入问题。 ... [详细]
  • JUC并发编程——线程的基本方法使用
    目录一、线程名称设置和获取二、线程的sleep()三、线程的interrupt四、join()五、yield()六、wait(),notify(),notifyAll( ... [详细]
  • 本文详细介绍了HashSet类,它是Set接口的一个实现,底层使用哈希表(实际上是HashMap实例)。HashSet不保证元素的迭代顺序,并且是非线程安全的。 ... [详细]
  • 在尝试加载支持推送通知的iOS应用程序的Ad Hoc构建时,遇到了‘no valid aps-environment entitlement found for application’的错误提示。本文将探讨此错误的原因及多种可能的解决方案。 ... [详细]
author-avatar
asdvuj
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有