。本文记录Java中几种常用的日志解决方案
0x01 Log4j
。这应该是一个比较老牌的日志方案了,配置也比较简单,步骤如下
1)添加对应依赖,比如 Gradle 中
dependencies {
compile('log4j:log4j:1.2.17')
testCompile group: 'junit', name: 'junit', version: '4.11'
}
2)配置一个 log4j.properties,用来指定一些信息,比如配置输出路径、格式(appender相关)等
### 设置###
log4j.rootLogger = debug,stdout,D,E
### 输出信息到控制抬 ###
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 = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%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
。具体其他的配置,可以百度找找。。
3)在需要使用的地方调用,主要是通过对应的级别,比如 info、debug、error 来输出不同的级别
public static Logger logger = Logger.getLogger(Main.class);
public static void main(String[] args) {
logger.debug("debug msg");
logger.info("info msg");
logger.error("err msg");
}
0x02 slf4j
。简单日志门面,slf4j 是一款通用的多日志整合方案,说白了就是提供了一套统一的接口,来统一解决不同日志系统的使用
。因为这只是一个通用的接口,所以并不涉及具体的日志方案,所以在使用时我们需要配合一门具体的日志系统来使用
。比如我们来进行和 log4j 的整合,我们除了需要配置好 slf4j 的依赖之外,还得配置其对于 log4j 的“驱动”
。比如我们在 build.gradle 中进行如下配置
compile('org.slf4j:slf4j-log4j12:1.7.13')
compile('log4j:log4j:1.2.17')
。这里我们只配了 slf4j 对应的 log4j 驱动,因为 Gradle 会自动解决依赖么~~
。因为整合 log4j,配置文件同上,使用时类似,代码如下
public static Logger logger = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) {
logger.info("info msg");
logger.debug("debug msg");
logger.error("error msg");
}
。注意这里的 Logger 和 LoggerFactory 都是org.slf4j
包下的,不要导错了
0x03 logBack
。上面介绍了比较老牌的 log4j,logBack 和 log4j 类似,是一个日志的解决方案,而且出自同一个作者
。但是不同的是,它相对 log4j 进行了很多的改进,重写了内部实现,在某些特定的场合下速度会比 log4j 快上10倍,而且使用的内存更少
。其他和 log4j 的比较,可以参考下面 Reference 的 [从Log4j迁移到LogBack的理由]
。使用类似,首先,引入依赖
compile('ch.qos.logback:logback-classic:1.1.3')
。logBack 目前分为3个模块,logback-core,logback-classic,logback-access
。logback-core 是其他两个模块的基础模块,logback-classic 是 log4j 的一个改良版本,而且完整实现了 slf4j api,所以可以很方便的切换成其他日志系统(如log4j)
。logback-access 访问模块与 Servlet 容器集成提供了通过 HTTP 来访问日志的功能
。然后是添加配置文件(logBack会默认查找配置文件 logback.xml 或者
logback-test.xml,如果没有找到,会将日志打印到终端中),这里和 log4j 有一点不同的是,logBack 使用 XML 或者
Groovy 来进行配置,可见这几年 Groovy 在 DSL 方面的发展
。实际是调用 slf4j 的通用接口来产生 Logger 对象
。这里需要提的一点是,LogBack 可以和 Tomcat 或者 Jetty 进行配合使用,使两个容器可以进行更好的日志输出
public static Logger logger = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) {
logger.info("info msg");
logger.debug("debug msg");
logger.error("error msg");
}