前面讲的 SLF4J 的用法之一是 SLF4J+Log4J,而这里要推出的组合是 SLF4J+LogBack。不用 Log4J?难道还有比 Log4J 更好的日志实现吗?是的,答案就是 LogBack。假如你知道 LogBack 和 Log4J 是同出一位大师之手,你就不会觉得惊讶了。LogBack 对 Log4J 进行了增强,并投入了 SLF4J 的怀抱,它还被作者认定为 Log4J 的继任者。

为什么叫做 Logback,我就不知道了,反正不要叫做 Brokeback 就行。这里是推崇用 Logback 替代 Log4J 的十几个理由:Reasons to prefer logback over log4j,说的大至是更快;好测试;与 SLF4J 关系紧;文档丰富;能自动加载配置文件;多个 JVM 写一个日志文件,或其他 I/O 错误时不影响程序执行;配置文件中加入条件控制;强大的日志过滤;更强的日志切分功能;自动压缩、删除日志文件;异常栈中更多的数据信息。

Logback 分为三个模块:logback-core,logback-classic,logback-access。logback-core 是核心;logback-classic 改善了 log4j,且自身实现了 SLF4J API,所以即使用 Logback 你仍然可以使用其他的日志实现,如原始的 Log4J,java.util.logging 等;logback-access 让你方便的访问日志信息,如通过 http 的方式。

还得提一点,Logback 能更好的放到 OSGI 环境中。好了,简单绍完了 Logback,就来看看具体怎么用它。

需要的配置文件和组件包,下面三个 jar 文件和一个 xml文件都是要放在项目的 ClassPath 上。

1. slf4j-api-1.5.11.jar
2. logback-core-0.9.20.jar
3. logback-classic-0.9.20.jar
4. logback.xml 或 logback-test.xml (类似于 log4j.properties/log4j.xml)

前一个包在 http://www.slf4j.org/download.html 处下载,第二第三个包在 http://logback.qos.ch/download.html 下载,可能包文件名中的版本号有些差,不要紧。由于这里不演示 HTTP 访问日志信息,所以不需要用到 logback-access-0.9.20.jar。

Logback 先找 logback-test.xml,没有则找 logback.xml 文件,都找不到就使用 BasicConfigurator 基本配置,BasicConfigurator 就是相当于等会贴出的 logback.xml 文件内容的配置。这里我们用 logback.xml 配置文件,以前的 log4j.properties  文件可以用 PropertiesTranslator 转换成 logback.xml 文件内容。

下面是一个最简单的 logback.xml 文件内容

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
      <encoder charset="GBK">
          <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
      </encoder>
  </appender>
 
  <root level="DEBUG">
    <appender-ref ref="stdout" />
  </root>
</configuration>

在 log4j.xml 能做的配置,logback.xml 中也能做到,而且还增强了诸如 <if><then><else>、<filter>、<sift> 等更强的控制,请参考 logback 的手册 http://logback.qos.ch/manual/index.html。

使用 Logback  的代码

package com.unmi;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
public class TestLogback {
    private static final Logger logger = LoggerFactory.getLogger(TestLogback.class);
 
    public static void main(String[] args) {
        logger.info("Hello {}","TestLogback");
    }
}

可以看到与使用 SLF4J 的代码没有任何区别,因为本来用的通用日志框架就是 SLF4J,说到底,这里的 Logback 就相当于 SLF4J+Log4J 使用方式中的 Log4J 绑定和 Log4J 的功能。

执行上面的代码,输出:

21:38:43.031 [main] INFO  com.unmi.TestLogback - Hello TestLogback

还是和上次一样,这里就拿 SLF4J+Logback 和 SLF4J+Log4J 两种方式作下比较:

SLF4J+Logback 组合 对比 SLF4J+Log4J 组合
slf4j-api-1.5.11.jar 一样的,定义高层 API slf4j-api-1.5.11.jar
logback-classic-0.9.20.jar 都是用绑定,
左边这里用作
Logback 绑定
slf4j-log4j12-1.5.11.jar
logback-classic-0.9.20.jar 左边这里用作
日志实现
log4j-1.2.15.jar
logback-test.xml/logback.xml 相当,logback 增加
了 log4j
log4j.properties/log4j.xml
程序代码中:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Logger logger = LoggerFactory.getLogger(TestSlf4j.class);
logger.info("Hello {}","SLF4J");

完全一样,实质上只是
SLF4J API
侵入到了应用组件
中了,与 Logback
没有关系。
程序代码中:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Logger logger = LoggerFactory.getLogger(TestLogback.class);
logger.info("Hello {}","Logback");

通过上面我们更清楚的发现,SLF4J+Logback 这样的组合与 SLF4J+Log4J 这样的用法其实没有什么差异。SLF4J 在使用其他日志实现框架的时候都是 SLF4J+相应绑定+日志实现,这里缩写成的 SLF4J+Log4J,中间是有一个 SLF4J 到 Log4J 的绑定的。完整表述它们就是:

SLF4J+Log4J 的方式:    slf4j-api-1.5.11.jar + slf4j-log4j12-1.5.11.jar + log4j-1.2.15.jar
SLF4J+Logback 的方式:slf4j-api-1.5.11.jar + logback-classic-0.9.20.jar + logback-classic-0.9.20    前一个 logback-classic-0.9.20.jar 是作为绑定用的,后一个是作为日志实现用的,也就是 logback-classic-0.9.20.jar 把前面的 slf4j-log4j12-1.5.11.jar 和 log4j-1.2.15.jar 两个包的功能揉合在了一起。

搞明白了 Logback 在其中所担当的角色后,我们就知道,说使用了 Logback 应用组件,实际它们所用的统一日志组件只是 SLF4J。也可以说 Logback 就是 Log4J 那样,只是自身带了绑定的日志实现。

在 Logback 官方首页 http://logback.qos.ch/ 面中可以看到使用了 Logback 的项目。

本文链接 http://unmi.cc/slf4j-logback, 来自 隔叶黄莺 Unmi Blog

转载于:https://blog.51cto.com/2005713/517702

SLF4J 的几种实际应用模式--之二:SLF4J+Logback相关推荐

  1. activity的四种加载模式

    在android里,有4种activity的启动模式,分别为: standard, singleTop, singleTask和singleInstance, 其中standard和singleTop ...

  2. gRPC 的 4 种基础通信模式

    题图 |  from freepik 本文将讨论 gRPC 应用程序的 4 种基础通信模式:一元 RPC.服务器端流 RPC.客户端流 RPC 以及双向流 RPC.在这个过程中,我们会使用一些真实用例 ...

  3. 以Attention Model为例谈谈两种研究创新模式

    在研读AttentionModel相关文献过程中,我再次深切感受到了科研中的两种创新模式:模型创新与应用创新.若干年前,也就是在我年轻不懂事的花样年华里,具体而言,就是在科学院读博士的后期,这种感受就 ...

  4. 工作流引擎JFlow与activiti 对比分析(一)5种基本控制流模式的对比

    为了更好的说明activiti 与jflow的两款工作流引擎的特点与区别,我们按照如下几个方面做一次全面的.客观的对比. 首先activiti是国外的一款开源的工作流程引擎,在国际上影响比较深远与广泛 ...

  5. Ajax 和 XML: 五种常见 Ajax 模式

    Asynchronous JavaScript + XML(Ajax)无疑是 2006 年最热门的技术术语,且有望在 2007 得到进一步发展.但是对您的应用程序来说它究竟有什么意义呢?Ajax 应用 ...

  6. 详解SOA五种基本架构模式

    目前,面向服务的架构(SOA)已成为连接复杂服务系统的主要解决方案.虽然SOA的理论很容易理解,但要部署一个设计良好.真正实用的SOA系统却非常困难.本文试图通过解析SOA的模式,提供与架构相关的技术 ...

  7. VMware Workstation三种网络连接模式说明(Bridged,NAT,Host-only networking)

    VMware Workstation三种网络连接模式说明(Bridged,NAT,Host-only networking) VMware Workstation 提供 三种基本的网络连接 模式 : ...

  8. Linux网络编程 五种I/O 模式及select、epoll方法的理解

    近期一次面试机会让我觉得有很多地方理解可能不到位,翻翻谷歌的资料加深对一些技术的理解 五种I/O 模式: [1] 阻塞 I/O (Linux下的I/O操作默认是阻塞I/O,即open和socket创建 ...

  9. Redis三种集群模式介绍

    三种集群模式 redis有三种集群模式,其中主从是最常见的模式. Sentinel 哨兵模式是为了弥补主从复制集群中主机宕机后,主备切换的复杂性而演变出来的.哨兵顾名思义,就是用来监控的,主要作用就是 ...

最新文章

  1. 在组策略中用户策略仅对特定计算机生效,如何对本地组策略设置使之不对特定用户生效?...
  2. 【CF】142 Div.1 B. Planes
  3. Springboot注册Listener
  4. 为Apple Push开发的PHP PEAR 包:Services_Apple_PushNotification
  5. 最详细win7下手动搭建PHP环境:apache2.4.23+php7.0.11
  6. Java 1.3.1 带标签的 break语句
  7. jfinal 获取路径
  8. .NET简谈特性(代码属性)
  9. JAVA 阶乘 n!
  10. 第七届蓝桥杯c语言a组答案,第七届蓝桥杯 C语言A组试题.pdf
  11. office2013 安装易用宝不成功
  12. 快速核对两个表格数据
  13. java中符号常量_Java中符号常量
  14. webview的白屏,和硬件加速
  15. 晨光文具去年赚5亿,连2000元都拿来理财
  16. Shader玉石效果
  17. 【看表情包学Linux】插叙:实现简易的 Shell | 通过内建命令实现路径切换 | 再次理解环境变量
  18. Word——图表如何交叉引用-插入题注-交叉引用
  19. c语言设计奥运奖牌管理系统,求一个用C语言编程的奥运奖牌管理系统
  20. 100集华为HCIE安全培训视频教材整理 | 智能策略

热门文章

  1. pfSense设置多WAN后,解决网银无法登陆问题
  2. 谈谈对数据库中ACID、CAP、BASE的认识
  3. jquery.ajax的url中传递中文乱码问题的解决方法
  4. cookiesession的QA故事[原理篇]
  5. 推荐一个学习golang的地址
  6. Spring : 征服数据库 (两)
  7. 混合式APP开发中中间件方案Rexsee
  8. ios实例开发精品源码文章推荐
  9. Windows Server 2003 : 服务器群集
  10. Python基础07-数据类型:字典dict