log4j 2 入门实例(1)
本文介绍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用来决定日志要输出到什么地方,支持一下目的地:
- ConsoleAppender 将信息输出到控制台(*常用)
- FileAppender 输出信息到文件中(*常用)
- RollingFileAppender 输出信息到文件中,可以根据策略清空文件和备份文件(*常用)
- SocketAppender 套接口服务器(Remote Socket Server)
- AsyncAppender 将信息输出到其它appender中
- CassandraAppender 将信息输出到Apache Cassandra数据库中
- FailoverAppender 封装一组Appender,如果前面的Appender失败了,那么就用后面的Appender,直到输出信息成功
- FlumeAppender 将信息输出到一个Apache Flume中,用于收集、集成、移动大量的log数据
- JDBCAppender 通过JDBC方式,将数据输出到相关数据库中
- JMSAppender 将信息输出到一个JMS服务中
- JPAAppender 通过Java Persistence API,将数据输出到相关数据库中
- KafkaAppender 将信息输出到Apache Kafka中
- MemoryMappedAppender 将信息输出到内存中,主要用于减少磁盘IO操作,提升系统性能
- NoSQLAppender 将信息输出到一个非SQL数据库中
- RewriteAppender 将信息处理后(例如,掩盖账号密码),输出到其它Appender
- RoutingAppender 将信息分类,然后分别输出到其它Appender
- SMTPAppender 将信息通过邮件发送出来
- ScriptAppenderSelector 调用脚本得到一个Appender的名字,并创建这个Appender
- Syslogappender 通过BSD Syslog或者RFC5424格式,将信息发送远程服务器中
- ZeroMQAppender 将信息发送到ZeroMQ端节点
Layout 组件
Layout组件决定日志的输出格式,有如下几类:
- CSVLayout 以CSV格式输出日志
- GELF Layout 全称是Graylog Extended Log Format
- HTMLLayout 以HTML格式输出日志
- JSONLayout 输出信息到JSON字符串中
- PatternLayout 以自定义Pattern的模式输出日志(*常用)
- RFC5424Layout 加强版的syslog
- SerializedLayout 输出信息到字节流
- 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)的更多相关文章
- log4j 2 入门实例(3)
继承机制 所有logger都继承自root logger. 可以认为名为log4j2learn.Hello的logger继承自名为log4j2learn的logger. log4j会先查找名称是&qu ...
- log4j 2 入门实例(2)
本文介绍将日志输出到文件的例子. log4j 2输出到文件 log4j2.xml文件 这个文件里,定义了三个类型的Appender:Console.File和RollingFile. Console类 ...
- mybatis 详解(二)------入门实例(基于XML)
通过上一小节,mybatis 和 jdbc 的区别:http://www.cnblogs.com/ysocean/p/7271600.html,我们对 mybatis有了一个大致的了解,下面我们通过一 ...
- java 日志体系(三)log4j从入门到详解
java 日志体系(三)log4j从入门到详解 一.Log4j 简介 在应用程序中添加日志记录总的来说基于三个目的: 监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工作: 跟踪代 ...
- freemarker入门实例与源码研究准备工作
首先去freemarker官网下载源码jar包,本文是基于freemarker-2.3.21.tar.gz进行研究的.解压源码包,找到freemarker的源码部分导入eclipse工程中.需要注意的 ...
- 1. mybatis 的入门实例
mybatis 的入门实例 1.创建一个普通的Java项目 1.加入jar包(所有mybatis 和mysql) 2.加入配置文件 src 目录下 (1) db.properties mysql.us ...
- mybatis学习一:基于xml与注解配置入门实例与问题
注:本case参考自:http://www.cnblogs.com/ysocean/p/7277545.html 一:Mybatis的介绍: MyBatis 本是apache的一个开源项目iBatis ...
- React 入门实例教程(转载)
本人转载自: React 入门实例教程
- struts入门实例
入门实例 1 .下载struts-2.3.16.3-all .不摆了.看哈就会下载了. 2 . 解压 后 找到 apps 文件夹. 3. 打开后将 struts2-blank.war ...
随机推荐
- IOS7开发~NSAttributedString
从 NSBundle 中读取rtf文本文件的内容,然后用UITextView展示: NSURL *url = [[NSBundle mainBundle] URLForResource:@" ...
- http协议中connection头的作用
在http1.1中request和reponse header中都有可能出现一个connection的头,此header的含义是当client和server通信时对于长链接如何进行处理. 在htt ...
- dedecms 留言板中引用模板文件方法
最近在做一个用dedecms搭建的网站,客户提出要有留言板,dedecms带了一个留言板的模块,安装倒是十分简便,但装完后发现界面十分粗糙.装修比较简单,但是发现遇到一个问题:网站通用的导航栏无法显示 ...
- 国家商用password(五)基于SM2的软件授权码生成及校验
将公开密钥算法作为软件注冊算法的优点是Cracker非常难通过跟踪验证算法得到注冊机.以下.将介绍使用SM2国密算法进行软件注冊的方法. 生成授权码 选择SM2椭圆曲线參数(P,a,b,N,Gx,Gy ...
- 2017.2.7 开涛shiro教程-第六章-Realm及相关对象(四)
原博客地址:http://jinnianshilongnian.iteye.com/blog/2018398 根据下载的pdf学习. 第六章 Realm及相关对象(四) 1.Subject的代码结构 ...
- vue2.0 仿手机新闻站(三)通过 vuex 进行状态管理
1.创建 store 结构 2.main.js 引入 vuex 3. App.vue 组件使用 vuex <template> <div id="app"&g ...
- 5.2 calendar--通用日期的相关函数(3)
prmonth(theyear, themonth, w=0, l=0) 打印指定年和月的日历.格式与formatmonth()函数一样. 样例: #python 3.4 import calenda ...
- Node.app让Nodejs平台在iOS和OS X系统上奔跑
首先呢,欢迎大家去查看相同内容的链接:http://www.livyfeel.com/nodeapp/. 由于那个平台我用的markdown语法,我也懒得改动了,就这样黏贴过来了. 这是一个惊人的恐怖 ...
- Oracle 中for update和for update nowait的区别
http://www.cnblogs.com/quanweiru/archive/2012/11/09/2762223.html 1.for update 和 for update nowait 的区 ...
- hdu1081 最大子矩阵
最大子矩阵自然直在最大连续子序列的升级版 只是其原理都是用到了动态规划思想 仅仅是矩阵用到了枚举 +合并 把非常多列看成是一列的和 #include<stdio.h> ...