Log4j日志框架使用
Log4j是Apache下的一款开源的日志框架,能够满足我们在项目中对于日志记录的需求。一般来讲,在项目中,我们会结合slf4j和log4j一起使用。Log4j提供了简单的API调用,强大的日志格式定义以及灵活的扩展性。我们可以自己定义Appender来满足我们对于日志输出的需求。
什么是日志框架
我们在系统中对于记录日志的需求并不单纯。首先,我们希望日志要能持久化到磁盘,最基本的就是要能够保存到文件中;其次,我们希望在开发和生产环境中记录的日志并不相同,明显开发环境的日志记录会更多方便调试,但放到生产环境下大量的日志很容易会撑爆服务器,因此在生产环境我们希望只记录重要信息。
基于不单纯的目的,System.out.println是直接不能满足我们的要求,因此抛弃它,选择功能更强的日志框架。而log4j是apache下一款著名的开源日志框架,log4j满足上面的一切需求。
记录日志的框架并不仅仅只有log4j,比较有名的还有logback等,现在比较火的SpringBoot默认集成的日志就是logback。不管哪种日志框架,一般都能够实现日志的持久化功能。
集成slf4j-log4j到系统
slf4j-log4j的使用也是非常简单的,几个jar包,一个配置文件(log4j.properties)就可以了。把jar包和配置文件都放到classpath下就可以了。那么配置文件都写些什么,一会再说,这是一个重点。
如果使用Maven来管理就更方便了,只需要导入如下依赖即可
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-log4j12</artifactId>
- <version>1.7.25</version>
- </dependency>
log4j的日志级别
早就听说有日志级别这么回事,日志级别到底是个什么鬼?刚才提到了两个需求,一个是保存日志到不同的地方,另一个是开发和生产环境打印不同的日志,那么如何在不同的环境打印不同的日志,就是由日志级别来实现的。
日志一般分5个等级,从低到高分别是 DEBUG INFO WARN ERROR FATAL。对应中文的意思就是 调试信息 一般信息 警告信息 错误信息 严重错误信息。在记录日志的时候,就可以根据不同的日志级别来进行记录。比如,你要监控一下用户提交上来的注册信息,我们认为这是在开发环境才需要的,因此可以使用DEBUG级别记录。再比如一个支付场景,系统抛出了一个未知的异常,这肯定是一个非常严重的问题了,那么可以用FATAL或者ERROR来记录。
了解清楚等级划分之后,再来控制生成环境和开发环境输出的信息不同就很简单了,我可以配置一个最低的日志输出级别,在开发环境我设置为DEBUG,也就是所有的日志信息都能输出。在生产环境我可以设置为WARN,也就是只有WARN及以上级别的日志才会被输出,这样是不是就可以在不同的环境控制不同的日志输出了。
对于开发者,学习如何记录各等级的日志非常简单,日志框架一般都提供了非常人性化的API。比如记录debug信息就是 logger.debug(String msg) 记录 info信息就是 logger.info(String msg) 等等,logger是实例化的日志对象。复杂的在于什么场景下使用哪一个级别的日志信息,关于这个问题,在阿里的《java开发手册》的日志规约部分写的非常好,有兴趣的朋友可以参考一下。文档地址在《Java开发手册》
log4j的appender
Appender是log4j的另一大优势,解决的就是日志输出目的地的问题。我们可以自己实现Appender来决定让日志输出到哪里。当然框架默认给我们已经提供了一些常用的Appender,比如输出到控制台的org.apache.log4j.ConsoleAppender,输出到文件的org.apache.log4j.DailyRollingFileAppender等。系统已经默认给我们提供了大量的Appender,基本上可以满足我们的日常需求,当然如果你的需求比较特殊,可以自己实现Appender,也是非常简单的。只需要定义一个类,实现Appender接口就可以了。Appender接口中定义了一系列记录日志的方法,按照自己的规则实现这些方法即可。系统提供的Appender如下
log4j的配置
了解了log4j的两大核心,一个是日志级别,一个是Appender 之后,我们开始看看配置文件到底是什么样子的,下面一个截图,介绍了关于配置的大部分常用内容
注意,这里有一个日志的格式,也就是 ConversionPattern,那么这个值到底该如何配置呢?
- %p:输出日志信息的优先级,即DEBUG,INFO,WARN,ERROR,FATAL。
- %d:输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,如:%d{yyyy/MM/dd HH:mm:ss,SSS}。
- %r:输出自应用程序启动到输出该log信息耗费的毫秒数。
- %t:输出产生该日志事件的线程名。
- %l:输出日志事件的发生位置,相当于%c.%M(%F:%L)的组合,包括类全名、方法、文件名以及在代码中的行数。例如:test.TestLog4j.main(TestLog4j.java:10)。
- %c:输出日志信息所属的类目,通常就是所在类的全名。
- %M:输出产生日志信息的方法名。
- %F:输出日志消息产生时所在的文件名称。
- %L::输出代码中的行号。
- %m::输出代码中指定的具体日志信息。
- %n:输出一个回车换行符,Windows平台为"/r/n",Unix平台为"/n"。
- %x:输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
- %%:输出一个"%"字符。
- 另外,还可以在%与格式字符之间加上修饰符来控制其最小长度、最大长度、和文本的对齐方式。如:
- %20c:指定输出category的名称,最小的长度是20,如果category的名称长度小于20的话,默认的情况下右对齐。
- %-20c:"-"号表示左对齐。
- %.30c:指定输出category的名称,最大的长度是30,如果category的名称长度大于30的话,就会将左边多出的字符截掉,但小于30的话也不会补空格。
到这里,log4j的配置就完成了。
一个简单的log4j配置文件的案例如下
- ### 设置###
- log4j.rootLogger=DEBUG,stdout,E
- log4j.logger.io.netty=WARN
- log4j.logger.com.mchange=WARN
- ### 输出信息到控制抬 ###
- log4j.appender.stdout=org.apache.log4j.ConsoleAppender
- log4j.appender.stdout.Target=System.out
- log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
- log4j.appender.stdout.layout.ConversionPattern=%p %d{HH:mm:ss} [%c:%L] %m%n
- ### 输出DEBUG 级别以上的日志到=E://logs/error.log ###
- log4j.appender.D=org.apache.log4j.DailyRollingFileAppender
- log4j.appender.D.File=E://logs/log.log
- log4j.appender.D.Append=true
- log4j.appender.D.Threshold=DEBUG
- log4j.appender.D.layout=org.apache.log4j.PatternLayout
- log4j.appender.D.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
- ### 输出ERROR 级别以上的日志到=E://logs/error.log ###
- log4j.appender.E=org.apache.log4j.DailyRollingFileAppender
- log4j.appender.E.File=E://logs/error.log
- log4j.appender.E.Append=true
- log4j.appender.E.Threshold=ERROR
- log4j.appender.E.layout=org.apache.log4j.PatternLayout
- log4j.appender.E.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
slf4j日志框架
Slf4j是一款日志记录框架,我们的项目中可能会用到很多的日志,比如commons-logging,又或者是log4j等等,那么不同的日志工具提供了不同的日志接口,我们的项目如果想换一个日志框架,可能需要改动许多的代码,这样slf4j就给我们提供了一种便捷的方式。它提供了一种对日志工具更高一层的抽象,只要导入slf4j的包和slf4j和采用日志工具整合的包,我们就可以使用slf4j来记录日志了,不用去考虑具体的日志工具的接口。那么以后如果要改变日志工具,我们就可以直接将要使用日志工具加到我们的项目中,而不需要改动代码。
日志跟踪(MDC)
高并发环境下,日志输出很容易出现找不到的情况,在传统阻塞模型下,针对每次请求都是一个线程,因此在输出格式的时候,输出线程名就可以实现了,那么跟日志的时候,就可以根据线程的名字进行跟踪。
当然这种跟踪方式有很多的弊端,首先线程是在线程池中的,来来回回也就那么几个线程,所有如果并发量很大,这种方式并不合适。另外对于多机环境,使用线程名的方式也并不靠谱。
为了解决线程名方式带来的问题,可以在当前线程中放置一个变量的形式,而这个变量的值可以是订单号,也可以随机。在日志输出的时候,将这个值输出出来,就可以保证每个线程的每次请求值是相同的。根据这个值就可以跟踪日志了。
这个值的存储可以使用ThreadLocal来存储,但实现还是比较麻烦,而日志又都有这个需求,因此日志框架就给我们提供了这个便捷的操作。MDC!
可以直接通过MDC.set(String key, String value)来设置。比如设置一个uid,值为UUID随机生成。就可以写成MDC.set("uid",UUID.randomUUID().toString());
在日志的配置文件中,加上 %uid 就可以输出这个值了。
转载自:https://blog.csdn.net/king_kgh/article/details/80430002#comments_13990017
Log4j日志框架使用的更多相关文章
- Slf4j+Log4j日志框架入门
(一).日志系统介绍 slf4j,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统.简答的讲就是slf4j是一系列的 ...
- Log4j日志框架小记
人啊,总是在学习中发现不足,不足中学习,学习中成长. 今天来系统记录一下对于常用日志组件的理解.配置.使用. 仅供参考, 错误之处请各路好汉不吝笔墨批评指正. 转载请注明出处 Log4j日志框架是Ap ...
- SpringBoot系列之切换log4j日志框架
SpringBoot系列之使用切换log4j日志框架 ok,在pom文件右键->Diagrams->show Dependencies....,如图,找到spring-boot-start ...
- 一、log4j日志框架的理论和不同场景使用
1.日志框架: 工作中要进行Java输出日志时,你需要一个或者多个日志框架.框架能提供对象.方法和必要的配置来发送日志信息.Java语言本身有自带的日志实现包java.util.logging.还有很 ...
- log4j日志框架学习
初识Log4j: log4j有三个部分: 1.loggers 负责捕获日志信息. 2.appenders 负责输出信息到不同的目的地 ...
- Spring源码学习:第2步--使用SLF4j+Log4j日志框架替换掉其自身的commons-logging日志框架
正如Spring官方文档所述,其底层的实现选择了commons-logging作为日志框架.这一"失足"性的选择,竟连Spring自身都抱怨.但是,谁叫Spring如此优秀呢,即使 ...
- Log4j日志框架学习零到壹(一)
日志是系统开发过程中用于排查问题重要的记录.通常使用日志来记录系统运行的行为,什么时间点发生了什么 事情.Java中常用的莫过于Log4j框架了.下面主要围绕Log4j的基础知识.Log4j的使用方式 ...
- SpringBoot整合log4j日志框架
Spring Boot 2.x默认使用Logback日志框架,要使用 Log4j2必须先排除 Logback. 加入修改依赖 <dependency> <groupId>org ...
- log4j日志框架的使用
java.util.logging.Logger——java 中提供的日志类 实际开发 90% 都是使用 log4j 记录日志,而 Log4j 底层就是 java.util.logging.Logge ...
- log4J日志框架
log4j的配置:log4j是一个日志输出框架,就是用于输出日志的,主流框架大部分都是Log4j输出.Spring框架也可以通过Log4j输出日志 Log4j提供了强大的日志输出的自定义功能(1)通过 ...
随机推荐
- 使用logback需要导入的jar包
jar包名 logback-access-1.1.2.jar logback-classic-1.1.2.jar logback-core-1.1.2.jar slf4j-api-1.7.25.jar ...
- js正则 -180 到180 小数点后无限位、el-input
正则 -180 到180 小数点后无限位/^0$|^-?0\.\d*[1-9]$|^-?[1-9](\.\d*[1-9])?$|^-?[1-9]\d(\.\d*[1-9])?$|^-?1[0-7]\d ...
- jeecg 导出加批注
public static void main(String[] args) throws IOException { // 创建工作簿对象 XSSFWorkbook wb = new XSSFWor ...
- 保护IIS Web服务器安全的技巧
首先,开发一套安全策略 保护Web服务器的第一步是确保网络管理员清楚安全策略中的每一项制度.如果公司高层没有把服务器的安全看作是必须被保护的资产,那么保护工作是完全没有意义的.这项工作需要长期的努力. ...
- 重写react-navigation的stackNaviagtor产生的默认导航栏header样式
主要是默认的stackNavigator产生的效果,很难看 重写这个阴影,在当前路由配置的 navigationOptions里的 headerStyle写样式 navigationOptions:{ ...
- 网页制作02--banner制作
样本: 第一步:先做一个超大的通栏banner盒子. 第二步:在通栏盒子里面做一个版心的盒子 第三部:版心盒子里面在分左边盒子和右边盒子 1号盒子是通栏的大盒子banner,不给宽度,给高度.给一个蓝 ...
- adaptsegnet 论文分析比较好的
https://blog.csdn.net/weixin_43795588/article/details/118058775 常用的语义分割一般是由两部分组成:一部分是特征提取器,比如可以用Resn ...
- Liunx安装Docker
1.更新yum包到最新 sudo yum update 2.卸载历史Docker,如果没有安装过,则跳过该步 sudo yum remove docker \ docker-client \ dock ...
- copy file from remote server to local
scp -r root@IP:/path/to/file(file path on the server) /path/to/filedestination(local path)
- function | ECOS
用于优化线性或二阶锥的自对偶齐次嵌入内点方法. 不支持 SDP 锥体! [x,y,info,s,z] = ecos(c,G,h,dims,A,b) 求解一对原始和双锥程序 最小化 c'x 服从 Gx ...