本文介绍log4j的基本概念和将日志输出到控制台的例子。

参考文章:

http://www.jianshu.com/p/464058bdbc76

http://www.hankcs.com/program/java/log4j-2-console-color-configuration-with-intellij-idea.html

Log4J是什么?

Log4J是Apache基金会下一个开源的日志管理项目,可以高度自定义日志的收集过程,和收集粒度,以及收集后日志的输出位置,可以输出到控制台,文件,数据库,甚至是远程服务器,这些操作仅仅只需要通过Log4J的配置文件进行定义后便可实现,是一个非常方便而且强大的日志收集库。除此之外,Log4J提供多语言兼容,可以在Java,Python,.Net等语言环境下的服务器中使用,可以对服务集群的日志进行统一管理。

Log4j 2升级了不少API,拓展性更好。


Log4J学习

Log4J三大组件:
1. Logger(记录器):只管记录日志(根据日志级别记录),不管日志存储在什么地方。
2. Appender(存放器):将Logger记录的日志,存放到配置文件中所指向的地方,只处理日志的存放过程。
3. Layout(布局):将日志进行格式化后再输出,也就是说他是用来让日志看这更顺眼的。当然如何算顺眼,由你在配置文件中设定。

一个Logger可以有多个Appender,可以同时输出到多个设备上,每一个Appender都有一个Layout来格式化输出内容。

Logger 组件

有一个默认的logger——root,如果我们不定义其它logger,就会默认使用这个名为root的logger。

Appender 组件

Appender用来决定日志要输出到什么地方,支持一下目的地:

  1. ConsoleAppender 将信息输出到控制台(*常用)
  2. FileAppender 输出信息到文件中(*常用)
  3. RollingFileAppender 输出信息到文件中,可以根据策略清空文件和备份文件(*常用)
  4. SocketAppender 套接口服务器(Remote Socket Server)
  5. AsyncAppender 将信息输出到其它appender中
  6. CassandraAppender 将信息输出到Apache Cassandra数据库中
  7. FailoverAppender 封装一组Appender,如果前面的Appender失败了,那么就用后面的Appender,直到输出信息成功
  8. FlumeAppender 将信息输出到一个Apache Flume中,用于收集、集成、移动大量的log数据
  9. JDBCAppender 通过JDBC方式,将数据输出到相关数据库中
  10. JMSAppender 将信息输出到一个JMS服务中
  11. JPAAppender 通过Java Persistence API,将数据输出到相关数据库中
  12. KafkaAppender 将信息输出到Apache Kafka中
  13. MemoryMappedAppender 将信息输出到内存中,主要用于减少磁盘IO操作,提升系统性能
  14. NoSQLAppender 将信息输出到一个非SQL数据库中
  15. RewriteAppender 将信息处理后(例如,掩盖账号密码),输出到其它Appender
  16. RoutingAppender 将信息分类,然后分别输出到其它Appender
  17. SMTPAppender 将信息通过邮件发送出来
  18. ScriptAppenderSelector 调用脚本得到一个Appender的名字,并创建这个Appender
  19. Syslogappender 通过BSD Syslog或者RFC5424格式,将信息发送远程服务器中
  20. ZeroMQAppender 将信息发送到ZeroMQ端节点

Layout 组件

Layout组件决定日志的输出格式,有如下几类:

  1. CSVLayout 以CSV格式输出日志
  2. GELF Layout 全称是Graylog Extended Log Format
  3. HTMLLayout 以HTML格式输出日志
  4. JSONLayout 输出信息到JSON字符串中
  5. PatternLayout 以自定义Pattern的模式输出日志(*常用)
  6. RFC5424Layout 加强版的syslog
  7. SerializedLayout 输出信息到字节流
  8. SyslogLayout BSD Syslog方式

日志级别

我们现在要调用logger的方法,不过在这个Logger对象中,有很多方法,所以要先了解log4j的日志级别,log4j规定了默认的几个级别:trace<debug<info<warn<error<fatal等。这里要说明一下:

    1)级别之间是包含的关系,意思是如果你设置日志级别是trace,则大于等于这个级别的日志都会输出。

    2)这不同的级别的含义大家都很容易理解,这里就简单介绍一下:

    trace: 是追踪,就是程序推进以下,你就可以写个trace输出,所以trace应该会特别多,不过没关系,我们可以设置最低日志级别不让他输出。

    debug: 调试么,我一般就只用这个作为最低级别,trace压根不用。是在没办法就用eclipse或者idea的debug功能就好了么。

    info: 输出一下你感兴趣的或者重要的信息,这个用的最多了。

    warn: 有些信息不是错误信息,但是也要给程序员的一些提示,类似于eclipse中代码的验证不是有error 和warn(不算错误但是也请注意,比如以下depressed的方法)。

    error: 错误信息。用的也比较多。

    fatal: 级别比较高了。重大错误,这种级别你可以直接停止程序了,是不应该出现的错误么!不用那么紧张,其实就是一个程度的问题。


入门实例

1、 新建一个Java工程,导入Log4j2包,pom文件中对应的配置代码如下:

注:log4j只用一个jar包,log4j2需要用两个jar包。

        <dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.8</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.8</version>
</dependency>

2、 resources目录下创建log4j2.xml文件

注:log4j使用property文件,log4j2使用xml文件。

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="OFF">
<appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</appenders>
<loggers>
<root level="trace">
<appender-ref ref="Console"/>
</root>
</loggers>
</configuration>

解释一下:

  • configuration后面的status:这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出。一般不用关注内部信息,设定为OFF即可。
  • console是一个Appender,可以将信息输出到控制台。
  • patternlayout是console对应的layout。1)参数%d指日期,H,m,s,S依次为时分秒毫秒;2)%t参数指产生该日志的线程名称。3)%level参数指日志级别,数字5指字符占位5个字符宽度;4)%logger参数指logger的名称,即语句private static final Logger logger = LogManager.getLogger(App.class.getName())中App.class.getName()的值,参数是整数n(只支持正整数),则先将logger名称依照小数点(.)分割成n段,然后取右侧的n段。5)%msg指要记录的信息;6)%n指换行。
  • root是一个默认的logger,如果不定义特定的logger,则都会使用这个logger。level=“trace”表示trace及其以上级别的信息都将被输出。
  • appender-ref指将要使用的Appender。

3、输出日志的例子如下

import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager; public class Hello
{
public static org.apache.logging.log4j.Logger logger = LogManager.getLogger(Hello.class.getName);
public static void main(String[] args)
{
add(1, 2);
} public static int add(int a , int b)
{
logger.entry(a, b);//trace级别的信息,单独列出来是希望你在某个方法或者程序逻辑开始的时候调用,和logger.trace("entry")基本一个意思
logger.info("我是info信息");
logger.warn("我是warn信息");
logger.error("我是error信息");
logger.fatal("我是fatal信息");
logger.printf(Level.TRACE, "%d+%d=%d", a, b, a + b);//这个就是制定Level类型的调用:谁闲着没事调用这个,也不一定哦!
logger.exit(a + b);//和entry()对应的结束方法,和logger.trace("exit");一个意思
return a + b;
}
}

即可在控制台看到

20:39:35.937 [main] TRACE com.hankcs.Hello - entry params(1, 2)
20:39:35.938 [main] INFO com.hankcs.Hello - 我是info信息
20:39:35.938 [main] WARN com.hankcs.Hello - 我是warn信息
20:39:35.938 [main] ERROR com.hankcs.Hello - 我是error信息
20:39:35.938 [main] FATAL com.hankcs.Hello - 我是fatal信息
20:39:35.939 [main] TRACE com.hankcs.Hello - 1+2=3
20:39:35.939 [main] TRACE com.hankcs.Hello - exit with(3)

log4j 2 入门实例(1)的更多相关文章

  1. log4j 2 入门实例(3)

    继承机制 所有logger都继承自root logger. 可以认为名为log4j2learn.Hello的logger继承自名为log4j2learn的logger. log4j会先查找名称是&qu ...

  2. log4j 2 入门实例(2)

    本文介绍将日志输出到文件的例子. log4j 2输出到文件 log4j2.xml文件 这个文件里,定义了三个类型的Appender:Console.File和RollingFile. Console类 ...

  3. mybatis 详解(二)------入门实例(基于XML)

    通过上一小节,mybatis 和 jdbc 的区别:http://www.cnblogs.com/ysocean/p/7271600.html,我们对 mybatis有了一个大致的了解,下面我们通过一 ...

  4. java 日志体系(三)log4j从入门到详解

    java 日志体系(三)log4j从入门到详解 一.Log4j 简介 在应用程序中添加日志记录总的来说基于三个目的: 监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工作: 跟踪代 ...

  5. freemarker入门实例与源码研究准备工作

    首先去freemarker官网下载源码jar包,本文是基于freemarker-2.3.21.tar.gz进行研究的.解压源码包,找到freemarker的源码部分导入eclipse工程中.需要注意的 ...

  6. 1. mybatis 的入门实例

    mybatis 的入门实例 1.创建一个普通的Java项目 1.加入jar包(所有mybatis 和mysql) 2.加入配置文件 src 目录下 (1) db.properties mysql.us ...

  7. mybatis学习一:基于xml与注解配置入门实例与问题

    注:本case参考自:http://www.cnblogs.com/ysocean/p/7277545.html 一:Mybatis的介绍: MyBatis 本是apache的一个开源项目iBatis ...

  8. React 入门实例教程(转载)

    本人转载自: React 入门实例教程

  9. struts入门实例

    入门实例 1  .下载struts-2.3.16.3-all  .不摆了.看哈就会下载了. 2  . 解压  后 找到 apps 文件夹. 3.    打开后将 struts2-blank.war   ...

随机推荐

  1. IOS7开发~NSAttributedString

    从 NSBundle 中读取rtf文本文件的内容,然后用UITextView展示: NSURL *url = [[NSBundle mainBundle] URLForResource:@" ...

  2. http协议中connection头的作用

    在http1.1中request和reponse header中都有可能出现一个connection的头,此header的含义是当client和server通信时对于长链接如何进行处理.   在htt ...

  3. dedecms 留言板中引用模板文件方法

    最近在做一个用dedecms搭建的网站,客户提出要有留言板,dedecms带了一个留言板的模块,安装倒是十分简便,但装完后发现界面十分粗糙.装修比较简单,但是发现遇到一个问题:网站通用的导航栏无法显示 ...

  4. 国家商用password(五)基于SM2的软件授权码生成及校验

    将公开密钥算法作为软件注冊算法的优点是Cracker非常难通过跟踪验证算法得到注冊机.以下.将介绍使用SM2国密算法进行软件注冊的方法. 生成授权码 选择SM2椭圆曲线參数(P,a,b,N,Gx,Gy ...

  5. 2017.2.7 开涛shiro教程-第六章-Realm及相关对象(四)

    原博客地址:http://jinnianshilongnian.iteye.com/blog/2018398 根据下载的pdf学习. 第六章 Realm及相关对象(四) 1.Subject的代码结构 ...

  6. vue2.0 仿手机新闻站(三)通过 vuex 进行状态管理

    1.创建 store 结构 2.main.js  引入 vuex 3. App.vue  组件使用 vuex <template> <div id="app"&g ...

  7. 5.2 calendar--通用日期的相关函数(3)

    prmonth(theyear, themonth, w=0, l=0) 打印指定年和月的日历.格式与formatmonth()函数一样. 样例: #python 3.4 import calenda ...

  8. Node.app让Nodejs平台在iOS和OS X系统上奔跑

    首先呢,欢迎大家去查看相同内容的链接:http://www.livyfeel.com/nodeapp/. 由于那个平台我用的markdown语法,我也懒得改动了,就这样黏贴过来了. 这是一个惊人的恐怖 ...

  9. Oracle 中for update和for update nowait的区别

    http://www.cnblogs.com/quanweiru/archive/2012/11/09/2762223.html 1.for update 和 for update nowait 的区 ...

  10. hdu1081 最大子矩阵

    最大子矩阵自然直在最大连续子序列的升级版  只是其原理都是用到了动态规划思想     仅仅是矩阵用到了枚举 +合并       把非常多列看成是一列的和 #include<stdio.h> ...