概念:slf4j-api : Simple Logging Facade for Java
slf4j-api为java提供的简单日志的Facade(Facade:门面,更底层一点说就是接口)。它允许用户以自己的喜好,在工程中通过slf4j接入不同的日志系统。
因此,slf4j入口就是众多接口的集合,它不负责具体的日志实现,只在编译时负责寻找合适的日志系统进行绑定。具体有哪些接口,全部都定义在slf4j-api中。
查看slf4j-api源码就可以发现,里面除了public final class LoggerFactory类之外,都是接口定义。因此slf4j-api本质就是一个接口定义。
它只提供一个核心slf4j api(即slf4j-api.jar包),这个包只有日志的接口,并没有实现,所以如果要使用它就得再给它提供一个实现了这些接口的日志包,比 如:log4j、common logging、jdk logging等。
但是这些日志实现又不能通过接口直接调用,实现上他们根本就和slf4j-api不一致,因此slf4j又增加了一层来转换各日志实 现包的使用,比如slf4j-log4j12等。
slf4j+log4j组合使用模式:
- slf4j-api-X.X.X.jar
- slf4j-log4j12-X.X.X.jar
- log4j-X.X.X.jar
- log4j.properties(也可以是 log4j.xml)
具体使用日志类的API:
- log4j:
import org.apache.log4j.Logger;
Logger logger= Logger.getLogger(xx.class);
- slf4j+log4j:(推荐)
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Logger logger = LoggerFactory.getLogger(xx.class);
SSM框架环境下配置log4j打印MyBatis的SQL语句
按照官方文档的叙述,mybatis会根据下面的顺序寻找log4具体的实现类:
- SLF4J
- Apache Commons Logging
- Log4j 2
- Log4j
- JDK logging
所以要先指定使用哪个日志框架。
1.配置web.xml
<!-- 加载log4j配置文件 -->
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>classpath:log4j.properties</param-value>
<!-- <param-value>/WEB-INF/log4j.xml</param-value> -->
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
2.编写log4j.properties文件
# log4j.rootLogger=level, appenderName, appenderName, …
# level:日志记录的优先级
# |- level分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL
# |- Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG
# |- 级别详解
# |- off 最高等级,用于关闭所有日志记录。
# |- fatal 指出每个严重的错误事件将会导致应用程序的退出。
# |- error 指出虽然发生错误事件,但仍然不影响系统的继续运行。
# |- warm 表明会出现潜在的错误情形。
# |- info 一般和在粗粒度级别上,强调应用程序的运行全程。
# |- debug 一般用于细粒度级别上,对调试应用程序非常有帮助。
# |- all 最低等级,用于打开所有日志记录。
# |- 通过在这里定义的级别,可以控制到应用程序中相应级别的日志信息的开关
# 比如在这里定义了INFO级别,则应用程序中所有DEBUG级别的日志信息将不被打印出来。
#
# appenderName:level级别的日志信息输出到哪个地方,可以同时指定多个输出目的地。
log4j.rootLogger=INFO,Console,File
# 定义日志输出目的地
# Log4j提供的appender有以下几种:
# |- org.apache.log4j.ConsoleAppender(控制台)
# |- org.apache.log4j.FileAppender(文件)
# |- org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
# |- org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
# |- org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
# 下面是输出到控制台的设置
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.Target=System.out
#可以灵活的指定日志输出格式,下面一行是指定具体的格式
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=[%c]-%m%n
# 下面是输出到指定文件
# 指定输出目录
log4j.appender.File.File = /home/matto/IdeaProjects/WorkSpaceGit/TestMaven/logs/ssm.log
#定义文件最大大小
log4j.appender.File.MaxFileSize = 10MB
# 文件大小到达指定尺寸的时候产生一个新的文件
log4j.appender.File = org.apache.log4j.RollingFileAppender
# 每天产生一个日志文件
log4j.appender.File = org.apache.log4j.DailyRollingFileAppender
# 输出所有warn 以上级别的日志,Threshold是个全局的过滤器,它将把低于所设置的level的信息过滤不显示出来。一般比log4j.rootLogger设置的等级高,否则没什么意义。
log4j.appender.File.Threshold = warn
# 配置日志信息的格式(布局)
# Log4j提供的layout有以下几种:
# |- org.apache.log4j.HTMLLayout(以HTML表格形式布局)
# |- org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
# |- org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
# |- org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
log4j.appender.File.layout = org.apache.log4j.PatternLayout
# 打印参数如下:
# |- %m 输出代码中指定的消息
# |- %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
# |- %r 输出自应用启动到输出该log信息耗费的毫秒数
# |- %c 输出所属的类目,通常就是所在类的全名
# |- %t 输出产生该日志事件的线程名
# |- %n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”
# |- %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,
# 比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
# |- %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。
# 举例:Testlog4.main(TestLog4.java:10)
log4j.appender.File.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH\:mm\:ss}][%c]%m%n
#mybatis显示SQL语句日志配置
#是此SSM项目接口所在的包名
log4j.logger.XXX.XXX.XXX=DEBUG
其中,log4j.logger.XXX.XXX.XXX=DEBUG
这行代码会在日志中显示mybaties的SQL语句。
另外,在代码中如果要使用日志,可以这么写:
public class App {
//1,获取日志记录器,这个记录器将负责控制日志信息。
private static final Logger LOG = LoggerFactory.getLogger(App.class);
public static void main(String[] args) {
/*
2,配置Log4j环境(Web框架中这步已经交给容器,可以省略)
BasicConfigurator.configure():自动快速地使用缺省Log4j环境
PropertyConfigurator.configure(String configFilename):读取使用property文件编写的配置文件
DOMConfigurator.configure(String filename):读取XML形式的配置文件
*/
//3.记日志
LOG.info("info");
LOG.debug("debug");
LOG.error("error");
}
}
运行结果如图: