简单日记门面(simple logging Facade for java)SLF4J是为各类loging APIs提供一个简单统一的接口,从而使得最终用户可以在部署的时候配置本身但愿的loging APIs实现。java
百度百科:apache
SLF4J,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各类各样的日志系统。按照官方的说法,SLF4J是一个用于日志系统的简单Facade,容许最终用户在部署其应用时使用其所但愿的日志Systemapp
为何使用slf4j:ide
咱们在开发过程当中可能使用各类log,每一个Log有不一样的风格、布局,若是想灵活的切换那么slf4j是比较好的选择。布局
引入依赖: 性能
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.2</version> </dependency>
这样咱们的依赖中就会多出3个jar,分别是:测试
引入配置文件:编码
这里咱们结合的是log4j,因此引入Log4j的的配置文件在当前classpath下:log4j.propertiesspa
# 可设置级别:TRACE→DEBUG→INFO→WARNING→ERROR→FATAL→OFF
# 高级别level会屏蔽低级别level。
# debug:显示debug、info、error
# info:显示info、error
#log4j.rootLogger=DEBUG,console,file
log4j.rootLogger=INFO,console
#输出到控制台
log4j.appender.console=org.apache.log4j.ConsoleAppender
#设置输出样式
log4j.appender.console.layout=org.apache.log4j.PatternLayout
#日志输出信息格式为
log4j.appender.console.layout.ConversionPattern=[%-d{yyyy-MM-dd HH:mm:ss}]-[%t-%5p]-[%C-%M(%L)]: %m%n
#输出到文件(这里默认为追加方式)
#log4j.appender.file=org.apache.log4j.FileAppender
#log4j.appender.file.File=F:/LinkinPark/logs/Log4J.log
#样式为TTCCLayout
#log4j.appender.file.layout=org.apache.log4j.TTCCLayout
#自定义样式
#%c 输出所属的类目,一般就是所在类的全名
#%C 输出Logger所在类的名称,一般就是所在类的全名
#%d 输出日志时间点的日期或时间,默认格式为ISO8601,也能够在其后指定格式,好比:%d{yyy MMM dd HH:mm:ss , SSS},%d{ABSOLUTE},%d{DATE}
#%F 输出所在类的类名称,只有类名。
#%l 输出语句所在的行数,包括类名+方法名+文件名+行数
#%L 输出语句所在的行数,只输出数字
#%m 输出代码中指定的讯息,如log(message)中的message
#%M 输出方法名
#%p 输出日志级别,即DEBUG,INFO,WARN,ERROR,FATAL
#%r 输出自应用启动到输出该log信息耗费的毫秒数
#%t 输出产生该日志事件的线程名
#%n 输出一个回车换行符,Windows平台为“/r/n”,Unix平台为“/n”
#%% 用来输出百分号“%”
#log4j.appender.Linkin.layout.ConversionPattern=%n[%l%d{yy/MM/dd HH:mm:ss:SSS}][%C-%M] %m
#log4j.appender.Linkin.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss}[%C]-[%p] %m%n
#log4j.appender.Linkin.layout.ConversionPattern = %d{ABSOLUTE} %5p %t %c{2}:%L - %m%n
编码测试代码:.net
初始化logger的方式不同了:
private static final Logger log = LoggerFactory.getLogger(LogTest.class);
//以前的方式:public static Logger log = Logger.getLogger(LogTest.class);
log的输出日志的写法也稍有不一样(下节讲解):
log.info("info...{}", "info..."); log.warn("warn...{}", age);
完整测试代码以下:
package com.log; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * 日志测试类 * 做者: Administrator * 日期: 2017/9/20 **/
public class LogTest { // 获取日志对象
private static final Logger log = LoggerFactory.getLogger(LogTest.class); private static Integer age = 18; private static String name = "Alice"; public static void log() { log.debug("debug....{}", "debug..."); log.info("info...{}", "info..."); log.warn("warn...{}", age); log.error("error...{}", name); try { int i = 10 / 0; } catch (Exception e) { log.error(e.getMessage()); } } public static void main(String[] args) { log(); } }
结果:
入门程序参考自:http://blog.csdn.net/anialy/article/details/8529188
因为log4j的拼接字符串的形式,不管从性能上或者从优雅性上,都难以知足,因此,咱们强烈推荐使用slf4j来进行日志记录!
使用log4j输出程序中参数变量的日志写法大概是这样的:
if (logger.isDebugEnabled()) { logger.debug("Processing trade with id: " + id + " symbol: " + symbol); }
切换为slf4j后:
logger.debug("Processing trade with id: {} and symbol : {} ", id, symbol);
能够看到,经过使用大括号 {} 来占位,再经过参数的传入来避免了拼接字符串的性能与代码优雅性问题,同时省去了麻烦的isInfoEnabled()的判断
固然,slf4j日志还有一些重载方法,可参见API!
大括号 {} 对应如果POJO类等应当重写toString()方法