slf4j + log4j 记录日志
概述
为什么使用SLF4J
log4j简介
slf4j+log4j环境搭建
为什么使用SLF4J
参考: https://www.oschina.net/translate/why-use-sl4j-over-log4j-for-logging
SLF4J 即 Simple Logging Facade for Java
1.SLF4J的主要动机是让你的程序独立于任何特定的日志记录库,这些日志记录库可能需要与你现在配置不同的配置,而且还会引入更多令人头疼的维护问题
日志的框架Log4J,logback和java.util.Logging
2.SLF4J API还有一个让你使用SLF4J而不是用长期感兴趣的 Log4j 更让人信服的功能,也就是占位符功能,在代码中用{}来表示。
占位符功能与 String的format()方法中 的%s非常相似,因为它在运行时刻才提取所提供的真正的字符串。
这不仅缩减了代码中的许多字符串连接,而且减少了创建String对象所需要的资源。
不使用slf4j的写法
if (logger.isDebugEnabled()) {
logger.debug("Processing trade with id: " + id + " symbol: " + symbol);
}
使用slf4j的写法
logger.debug("Processing trade with id: {} and symbol : {} ", id, symbol);
log4j简介
参考:log4j介绍 http://www.cnblogs.com/wangzhuxing/p/7753420.html
1.Log4j三个主要的组件
Loggers(记录器),Appenders (输出源)和Layouts(布局)。
记录器决定日志类别-描述日志信息的重要程度,输出源决定日志要输出的地方、布局决定日志以何种形式输出。
综合使用这三个组件可以轻松地记录信息的类型和级别,并可以在运行时控制日志输出的样式和位置。
2.日志的五个级别
DEBUG、INFO、WARN、ERROR和FATAL。
这五个级别是有顺序的,DEBUG < INFO < WARN < ERROR < FATAL,分别用来指定这条日志信息的重要程度
Log4j有一个规则:只输出级别不低于设定级别的日志信息,假设Loggers级别设定为INFO,则INFO、WARN、ERROR和FATAL级别的日志信息都会输出,而级别比INFO低的DEBUG则不会输出。
3.配置根Logger
log4j.rootLogger = [ level ] , appenderName1, appenderName2
4.Appenders
禁用和使用日志请求只是Log4j的基本功能。
Log4j日志系统还提供许多强大的功能,比如允许把日志输出到不同的地方,如控制台(Console)、文件(Files)等,
可以根据天数或者文件大小产生新的文件,
可以以流的形式发送到其它地方等等。
org.apache.log4j.ConsoleAppender(控制台)
org.apache.log4j.FileAppender(文件)
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
配置模式:
log4j.appender.appenderName = className
log4j.appender.appenderName.Option1 = value1
log4j.appender.appenderName.OptionN = valueN
5.Layout
#以HTML表格形式布局
log4j.appender.appenderName.layout=org.apache.log4j.HTMLLayout
#包含日志信息的级别和信息字符串
log4j.appender.appenderName.layout=org.apache.log4j.SimpleLayout
#包含日志产生的时间、线程、类别等等信息
log4j.appender.appenderName.layout=org.apache.log4j.TTCCLayout
#可以灵活地指定布局模式 --常用
log4j.appender.appenderName.layout=org.apache.log4j.PatternLayout
格式化符号说明:
%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平台为"rn",Unix平台为"n"。
%x:输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
%%:输出一个"%"字符。
另外,还可以在%与格式字符之间加上修饰符来控制其最小长度、最大长度、和文本的对齐方式。如:
1) c:指定输出category的名称,最小的长度是20,如果category的名称长度小于20的话,默认的情况下右对齐。
2)%-20c:"-"号表示左对齐。
3)%.30c:指定输出category的名称,最大的长度是30,如果category的名称长度大于30的话,就会将左边多出的字符截掉,但小于30的话也不会补空格。
slf4j+log4j环境搭建
引入jar
slf4j-api-1.7.23.jar 这个是slf4j定义了日志的抽象层
slf4j-log4j12-1.7.6.jar 这个是专为log4j写的适配器,实现了抽象层定义的方法
log4j-1.2.17.jar log4j 具体的日志框架
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<!-- 依赖log4j,因此会自动引入相关jar包-->
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.21</version>
</dependency>
配置文件log4j.properties
配置文件放在class下的任何路径下即可,框架会自动查询的。
#配置根Logger 定义缺省的日志级别为INFO 自定义多个输出对象appender:一个是控制台console、一个是按照时间产生新文件 log4j.rootLogger=debug,console,dailyRolling #针对package定义日志级别 log4j.logger.org.apache=WARN log4j.logger.com.paic.pafademo=WARN log4j.logger.org.quartz=INFO log4j.logger.org.springframework.scheduling.quartz=INFO # 如果要查看MBATIS的SQL日志信息,确保有下面配置 log4j.logger.com.ibatis=DEBUG log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG log4j.logger.java.sql.ResultSet=DEBUG log4j.logger.java.sql.Connection=DEBUG log4j.logger.java.sql.Statement=DEBUG log4j.logger.java.sql.PreparedStatement=DEBUG # 设定控制台console的输出模式 log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.Encoding=UTF-8 log4j.appender.console.layout=org.apache.log4j.PatternLayout #指定日志信息的最低输出级别,默认为DEBUG log4j.appender.console.Threshold=DEBUG log4j.appender.console.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}] [%-3p] %c{1}: %X{MDCString} %m%n # 设定dailyRolling的输出模式,按照时间产生新文件 log4j.appender.dailyRolling=org.apache.log4j.DailyRollingFileAppender # ${log.home}通过参数-D指定,比如启动WebLogic时加入参数-Dlog.home=D:/ log4j.appender.dailyRolling.File=${log.home}/testProject.log #'.'yyyy-MM:每月 #'.'yyyy-ww:每周 #'.'yyyy-MM-dd:每天 #'.'yyyy-MM-dd-a:每天两次 #'.'yyyy-MM-dd-HH:每小时 #'.'yyyy-MM-dd-HH-mm:每分钟 log4j.appender.dailyRolling.DatePattern='.'yyyy-MM-dd-HH-mm log4j.appender.dailyRolling.layout=org.apache.log4j.PatternLayout log4j.appender.dailyRolling.layout.ConversionPattern=%x %d{yyyy-MM-dd HH:mm:ss} [%-3p] %c{1}: %m%n #针对package定义日志级别 #单独将某一模块(某包下)的日志信息输出到某一个文件 log4j.logger.com.person=DEBUG,personModelLogger #确保写入personModelLogger.log文件信息不重复出现到其他日志文件中 log4j.additivity.com.person=false #设置最低日志输出级别 log4j.appender.personModelLogger.Threshold=INFO #按照大小产生新文件 log4j.appender.personModelLogger=org.apache.log4j.RollingFileAppender log4j.appender.personModelLogger.File=d:/personModelLogger.log log4j.appender.personModelLogger.Append=true #后缀可以是KB, MB 或者GB log4j.appender.personModelLogger.MaxFileSize=1MB #指定可以产生的滚动文件的最大数,例如,设为2则可以产生personModelLogger.log.1,personModelLogger.log.2两个滚动文件和一个personModelLogger.log文件 log4j.appender.personModelLogger.MaxBackupIndex=2 log4j.appender.personModelLogger.layout=org.apache.log4j.PatternLayout log4j.appender.personModelLogger.layout.ConversionPattern=%x %d{MM/dd HH:mm:ss} [%-3p] %c{1}: %m%n #单独将一个类的日志输出到一个文件中 log4j.logger.com.person.log4j.Log4jTest=DEBUG,Log4jTestLogger,console #additivity设置为false,则不会输出到rootLogger定义的console,dailyRolling输出对象,但是如果我还是只想输出到控制台,可以修改为如下即可 #log4j.logger.com.person.log4j.Log4jTest=DEBUG,Log4jTestLogger,console #确保写入Log4jTestLogger.log文件信息不重复出现到其他日志文件中,Log4jTestLogger比personModelLogger的范围更小,因此personModelLogger中不会出现类Log4jTest的日志 log4j.additivity.com.person.log4j.Log4jTest=false log4j.appender.Log4jTestLogger=org.apache.log4j.FileAppender log4j.appender.Log4jTestLogger.File=d:/Log4jTestLogger.log log4j.appender.Log4jTestLogger.layout=org.apache.log4j.PatternLayout log4j.appender.Log4jTestLogger.layout.ConversionPattern=%x %d{MM/dd HH:mm:ss} [%-3p] %c{1}: %m%n #类中获得自定义的记录器,在类中使用myLogger时会将日志写在myLogger.log中。 #类中获得该记录器: private static final Logger myLogger = LoggerFactory.getLogger("myLogger"); log4j.logger.myLogger=DEBUG,myLogger #默认true,自定义的日志默认是同时输出到log4j.rootLogger所配置的日志中的 log4j.additivity.com.person.log4j.Log4jTest=true log4j.appender.myLogger=org.apache.log4j.FileAppender log4j.appender.myLogger.File=d:/myLogger.log log4j.appender.myLogger.layout=org.apache.log4j.PatternLayout log4j.appender.myLogger.layout.ConversionPattern=%x %d{MM/dd HH:mm:ss} [%-3p] %c{1}: %m%n
测试类
package com.person.log4j; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class Log4jTest { private static final Logger LOGGER = LoggerFactory.getLogger(Log4jTest.class); private static final Logger myLogger = LoggerFactory.getLogger("myLogger"); public static void main(String[] args) { String topic = "交易"; String id="31242341"; LOGGER.info("Receive check msg:[msgTopic:{},msgId:{}]", topic, id); myLogger.info("this msg should be output to d:/myLogger.log"); } }