1.基本介绍
SLF4J不同于其他日志类库,与其它日志类库有很大的不同。SLF4J(Simple logging Facade for Java)不是一个真正的日志实现,而是一个抽象层( abstraction layer),它允许你在后台使用任意一个日志类库。如果是在编写供内外部都可以使用的API或者通用类库,那么你真不会希望使用你类库的客户端必须使用你选择的日志类库。
如果一个项目已经使用了log4j,而你加载了一个类库,比方说 Apache Active MQ——它依赖于于另外一个日志类库logback,那么你就需要把它也加载进去。但如果Apache Active MQ使用了SLF4J,你可以继续使用你的日志类库而无需忍受加载和维护一个新的日志框架的痛苦。
总的来说,SLF4J使你的代码独立于任意一个特定的日志API,这是对于API开发者的很好的思想。虽然抽象日志类库的思想已经不是新鲜的事物,而且Apache commons logging也已经在使用这种思想了,但SLF4J正迅速成为Java世界的日志标准。让我们再看几个使用SLF4J而不是log4j、logback或者java.util.logging的理由。
官方文档: http://www.slf4j.org/
Maven依赖
<!-- slf4j 依赖包 --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.25</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.5</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.0-rc1</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.0-rc1</version></dependency>
或者手动导入下面的包:
**
日志级别
每个Logger都被了一个日志级别(log level),用来控制日志信息的输出。日志级别从高到低分为:
A:off 最高等级,用于关闭所有日志记录。B:fatal 指出每个严重的错误事件将会导致应用程序的退出。C:error 指出虽然发生错误事件,但仍然不影响系统的继续运行。D:warm 表明会出现潜在的错误情形。E:info 一般和在粗粒度级别上,强调应用程序的运行全程。F:debug 一般用于细粒度级别上,对调试应用程序非常有帮助。G:all 最低等级,用于打开所有日志记录。
创建日志记录器方法:(最好声明加final关键字)
private static final Logger logger = LoggerFactory.getLogger(Slf4jTest.class.getName());// slf4j日志记录器
**
注意:每次引入Logger的时候注意引入的jar包,因为有Logger的包太多了。。。。。。
Logger必须作为类的静态变量使用。原因如下:
1 使用static修饰的属性是归这个类使用的 2 也就是说不论这个类实例化多少个,大家用的都是同一个static属性 3 log4j记录的是当前类的日志,不是每个实例的日志 4 所以只要有一个记录就可以了
2.简单用法
2.1 配置文件(log4j.properties)
#设置logger级别DEBUG、INFO、WRNING、ERROR和输出格式A、B、C或Dlog4j.rootLogger=DEBUG, A, B#A 输出到控制台log4j.appender.A=org.apache.log4j.ConsoleAppenderlog4j.appender.A.layout=org.apache.log4j.PatternLayoutlog4j.appender.A.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n#B 输出到E盘的log.log文件log4j.appender.B=org.apache.log4j.FileAppenderlog4j.appender.B.File=E:\\log.loglog4j.appender.B.layout=org.apache.log4j.SimpleLayout#C 输出到E盘的log.html文件log4j.appender.C=org.apache.log4j.RollingFileAppenderlog4j.appender.C.File=E:\\log.htmllog4j.appender.C.MaxFileSize=1000KBlog4j.appender.C.MaxBackupIndex=10log4j.appender.C.layout=org.apache.log4j.HTMLLayout# D 将日志信息输出到一个日志文件,并且指定文件的尺寸,当文件大小达到指定尺寸时,# 会自动把文件改名,同时产生一个新的文件log4j.appender.D=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.D.File=E:\\log.loglog4j.appender.D.layout=org.apache.log4j.TTCCLayout
1.如果需要输出到多个位置的时候可以逗号隔开,比如: log4j.rootLogger=info, A, B 2. log4j.appender.C.encoding=gbk 的配置是为了解决中文乱码,有时候也可以设置为UTF-8试试
2.2 输出端Appender**
Appender用来指定日志信息输出到哪个地方,可以同时指定多个输出目的地。Log4j允许将信息输出到许多不同的输出设备中,一个log信息输出目的地就叫做一个Appender。
每 个Logger都可以拥有一个或多个Appender,每个Appender表示一个日志的输出目的地。可以使用 Logger.addAppender(Appender app)为Logger增加一个Appender,也可以使用Logger.removeAppender(Appender app)为Logger删除一个Appender。
以下为Log4j几种常用的输出目的地。
a:org.apache.log4j.ConsoleAppender:将日志信息输出到控制台。
b:org.apache.log4j.FileAppender:将日志信息输出到一个文件。
c:org.apache.log4j.DailyRollingFileAppender:将日志信息输出到一个日志文件,并且每天输出到一个新的日志文件。
d:org.apache.log4j.RollingFileAppender:将日志信息输出到一个日志文件,并且指定文件的尺寸,当文件大小达到指定尺寸时,会自动把文件改名,同时产生一个新的文件。
e:org.apache.log4j.WriteAppender:将日志信息以流格式发送到任意指定地方。
f::org.apache.log4j.jdbc.JDBCAppender:通过JDBC把日志信息输出到数据库中
关于pattern的设置如下:**
:::info
%p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%d: 输出日志时间点的日期或时间, 默认格式为ISO08601, 也可以在其后指定格式
例如: %{yyyy-MM-dd HH:mm:ss, SSS} SSS为毫秒数, 输出类似为: 2020-11-10 22:10:28, 021
%r: 输出自应用启动到输出该日志耗费的毫秒数
%c.%M(%F:L)的组合,包括类全名、方法、文件名以及在代码中行数。
例如:cn.xm.test.PlainTest.main(PlanTest.java:12)
%t: 输出产生日志的线程名称
%l: 输出日志事件的位置,相当于
%c: 输出日志信息所属的类目,通常就是所在类的全名。可写为%c{num},表示取完整类名的层数,从后向前取,
比如 %c{2}取 “cn.qlq.exam”类为”qlq.exam”。
%M: 输出产生日志信息的方法名
%x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中
%%: 输出一个”%”字符
%F: 输出日志消息产生时所在的文件名称
%L: 输出代码中的行号
%m: 输出代码中指定的消息,产生的日志具体信息
%n: 输出一个回车换行符,Windows平台为”\r\n”,Unix平台为”\n”输出日志信息换行 :::
