java log4j权限被否定_SLF4J简介与使用(整合log4j)

一、概念

SLF4J的全称是Simple Logging Facade for Java,即简单日志门面。SLF4J并不是具体的日志框架,而是作为一个简单门面服务于各类日志框架,如java.util.logging, logback和log4j。

SLF4J提供了统一的记录日志的接口,对不同日志系统的具体实现进行了抽象化,只要按照其提供的方法记录即可,最终日志的格式、记录级别、输出方式等通过绑定具体的日志系统来实现。

使用SLF4J的好处在于,你只需要按统一的方式写记录日志的代码,如:

public class LoggerTest {

private static final Logger logger = LoggerFactory.getLogger(Tester.class);

public static void main(String[] args) {

logger.info("Current Time: {}", System.currentTimeMillis());

}

}

SLF4J支持{}作为占位符,等价于C语言中的%s,而不必再进行字符串的拼接,效率有显著的提升(见后面运行结果)。

而无需关心日志是通过哪个日志系统,以什么风格输出的。因为它们取决于部署项目时绑定的日志系统。

例如,在项目中使用了SLF4J记录日志,并且绑定了log4j,则日志会以log4j的风格输出;后期需要改为以logback的风格输出日志,只需要将log4j替换成logback即可,不用修改项目中的代码。

二、依赖

SLF4J绑定各类日志框架的原理图:

由上图可知,使用SLF4J依赖于slf4j-api-1.8.0-alpha2.jar,部署时还依赖于要绑定的日志系统的jar包和相应的适配器jar包。

以绑定log4j为例,需要导入以下包:

slf4j-api-1.8.0-alpha2.jar

log4j-1.2.17.jar

slf4j-log4j12-1.8.0-alpha2.jar

如果使用Maven,则只需添加适配器jar包依赖即可:

org.slf4j

slf4j-log4j12

1.8.0-alpha2

三、使用示例

这里以SLF4J + log4j为例。

1.在pom.xml中添加依赖(或者手动导入上述3个jar包):

org.slf4j

slf4j-log4j12

1.8.0-alpha2

2.配置log4j

在类路径下创建log4j.properties配置文件,这样log4j会自动加载配置文件。

# rootLogger参数分别为:根Logger级别,输出器stdout,输出器log

log4j.rootLogger = info,stdout,log

# 输出信息到控制台

log4j.appender.stdout = org.apache.log4j.ConsoleAppender

log4j.appender.stdout.layout = org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern = %d [%-5p] %l %rms: %m%n

# 输出DEBUG级别以上的日志到D://logs/debug.log

log4j.appender.log = org.apache.log4j.DailyRollingFileAppender

log4j.appender.log.DatePattern = '.'yyyy-MM-dd

log4j.appender.log.File = D://debug.log

log4j.appender.log.Encoding = UTF-8

#log4j.appender.log.Threshold = INFO

log4j.appender.log.layout = org.apache.log4j.PatternLayout

log4j.appender.log.layout.ConversionPattern = %d [%-5p] (%c.%t): %m%n

将log4j.properties放在类路径下是最简单的做法,当然也可以通过PropertyConfigurator在代码中加载或者通过web.xml加载。3.测试代码

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

public class LoggerTest {

private static final Logger logger = LoggerFactory.getLogger(LoggerTest.class);

public static void main(String[] args) {

logger.info("Current Time: {}", System.currentTimeMillis());

logger.info("Current Time: " + System.currentTimeMillis());

logger.info("Current Time: {}", System.currentTimeMillis());

logger.trace("trace log");

logger.warn("warn log");

logger.debug("debug log");

logger.info("info log");

logger.error("error log");

}

}

4.运行结果

2017-06-16 23:11:05,490 [INFO ] com.jiapengcs.demos.slf4j.LoggerTest.main(LoggerTest.java:14) 0ms: Current Time: 1497625865488

2017-06-16 23:11:05,493 [INFO ] com.jiapengcs.demos.slf4j.LoggerTest.main(LoggerTest.java:15) 3ms: Current Time: 1497625865493

2017-06-16 23:11:05,493 [INFO ] com.jiapengcs.demos.slf4j.LoggerTest.main(LoggerTest.java:16) 3ms: Current Time: 1497625865493

2017-06-16 23:11:05,495 [WARN ] com.jiapengcs.demos.slf4j.LoggerTest.main(LoggerTest.java:18) 5ms: warn log

2017-06-16 23:11:05,495 [INFO ] com.jiapengcs.demos.slf4j.LoggerTest.main(LoggerTest.java:20) 5ms: info log

2017-06-16 23:11:05,495 [ERROR] com.jiapengcs.demos.slf4j.LoggerTest.main(LoggerTest.java:21) 5ms: error log

通常输出日志开销非常大,从上述结果可见,SLF4J通过{}作为占位符的方式输出字符串,相比字符串拼接的方式,效率有显著的提升。

5.更换日志系统

看到这里,你可能会有疑问:既然都用了log4j,为什么还要用SLF4J来写记录日志的代码呢,不是多此一举吗?

答案是否定的。假设我们不再需要log4j,而是希望改为使用java自带logging记录日志,我们需要做的仅仅是将pom.xml的依赖项slf4j-log4j12改为slf4j-jdk14即可,无需对上述测试代码做任何修改。

org.slf4j

slf4j-jdk14

1.8.0-alpha2

是的,就是这么简单。再次运行测试代码:

六月 16, 2017 10:32:30 下午 com.jiapengcs.demos.slf4j.LoggerTest main

信息: Current Time: 1497623550843

六月 16, 2017 10:32:30 下午 com.jiapengcs.demos.slf4j.LoggerTest main

信息: Current Time: 1497623550874

六月 16, 2017 10:32:30 下午 com.jiapengcs.demos.slf4j.LoggerTest main

信息: Current Time: 1497623550875

六月 16, 2017 10:32:30 下午 com.jiapengcs.demos.slf4j.LoggerTest main

警告: warn log

六月 16, 2017 10:32:30 下午 com.jiapengcs.demos.slf4j.LoggerTest main

信息: info log

六月 16, 2017 10:32:30 下午 com.jiapengcs.demos.slf4j.LoggerTest main

严重: error log

我们发现,此时日志已经变为以logging的方式输出。

四、总结

SLF4J的使用非常简单,甚至连官网上都说鉴于它太轻量,文档篇幅不长。

Given the small size of SLF4J, its documentation is not very lengthy.

在《阿里巴巴Java开发手册(正式版)》中,日志规约一项第一条就强制要求使用SLF4J:

1.【强制】应用中不可直接使用日志系统(Log4j、Logback)中的API,而应依赖使用日志框架SLF4J中的API,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一。

所以从现在开始使用SLF4J吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/562301.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《springcloud超级入门》微服务的概念和优缺点《一》

微服务是什么?它的优缺点有哪些? “微服务”一词来源于 Martin Fowler 的《Microservices》一文。微服务是一种架构风格,即将单体应用划分为小型的服务单元,微服务之间使用 HTTP 的 API 进行资源访问与操作。 在笔者看来&#xf…

安卓 php环境 app,安卓系统lighttpd-php-mysql本地环境

这是一个可在安卓手机上布置的服务器环境,功能组件包括:lighttpd、php和mysql,能成功运行DZ等php程序,安装和配置过程十分简单,也许现在该是讨论用什么手机做服务器更合适的时候了。演示图片为一成功运行的服务器环境探…

硬核!从0到1学习Spring Cloud微服务章节《建议收藏》

为什么要使用学习springcloud以及他的优势? Spring Cloud 来源于 Spring,质量、稳定性、持续性都可以得到保证。 spirng Cloud 天然支持 Spring Boot,更加便于业务落地。 Spring Cloud 是 Java 领域最适合做微服务的框架。相比于其它框架&…

《springcloud超级入门》Spring Cloud是什么?Spring Cloud版本介绍《二》

Spring cloud是一系列框架的有序集合。它利用 Spring Boot 的开发便利性,巧妙地简化了分布式系统基础设施的开发,如服务注册、服务发现、配置中心、消息总线、负载均衡、断路器、数据监控等,这些都可以用 Spring Boot 的开发风格做到一键启动…

《springcloud超级入门》Spring Cloud和Dubbo的区别及各自的优缺点《三》

了解为什么需要微服务。最初的服务化解决方案是给相同服务提供一个统一的域名,然后服务调用者向这个域发送 HTTP 请求,由 Nginx 负责请求的分发和跳转。 这种架构存在很多问题:Nginx 作为中间层,在配置文件中耦合了服务调用的逻辑…

php完美导出word,PHP使用phpword生成word文档

使用phpword生成文档有两种方式直接使用代码编写word文档,用代码生成word,但是设置样式,格式,图片非常麻烦,不建议使用。如果客户或产品提供一份word的样式,我们也难以完全复原,调样式很头疼的。…

《springcloud超级入门》Spring Cloud开发环境的准备和Lombok安装步骤《四》

开发环境的准备主要涉及三个方面:JDK、Maven、Spring Tools 4 for Eclipse。 1. JDK JDK 的版本用 1.8 即可,环境变量大家自行去配置。配置好环境变量,在命令行中输入“java–version”能够显示出版本信息即可,如图 1 所示。 …

php 制作ppt,PPT制作三个基本要素是什么?

PPT制作三个基本要素是什么?1、一个PPT只为一类人服务,针对不同听众制作不同层次内容;2、PPT永远是为听者服务;3、PPT只讲一个重点,不要试图在某个PPT中既讲技术,又讲管理。PPT优势1.使用 Microsoft Office…

《springcloud超级入门》Spring Boot简介《五》

Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是简化新 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式进行配置,从而使开发人员不再需要定义样板化的配置。 Spring Boot 致力于在蓬勃发展的快速应用开发领域(rapid …

php代理m3u8,PHP实现m3u8并发下载

直接上代码//php下载m3u8文件$url $argv[1];if(!file_exists(./tmp/)) {if(!mkdir(./tmp/)) {die(请手动在当前目录创建tmp目录);}}$indexPage file_get_contents($url);preg_match_all(/.*.ts/, $indexPage, $matches);if(empty($matches)) {die(m3u8 文件格式错误);}go(fun…

《SpringCloud超级入门》Spring Boot项目搭建步骤(超详细)《六》

目录 编写第一个 REST 接口 读取配置文件 profiles 多环境配置 热部署 actuator 监控 自定义 actuator 端点 统一异常处理 异步执行 随机端口 编译打包 在 Spring Tools 4 for Eclipse 中选择 File->New->Maven Project, 在 pom.xml 中添加 Spri…

《SpringCloud超级入门》Spring Boot Starter的介绍及使用《七》

目录 Spring Boot Starter项目创建 自动创建客户端 使用 Starter 使用注解开启 Starter 自动构建 使用配置开启 Starter 自动构建 配置 Starter 内容提示 Spring Boot 的便利性体现在,它简化了很多烦琐的配置,这对于开发人员来说是一个福音&#…

php 发送短信 sms,php 调用百度sms来发送短信的实现示例

BaiduSms百度云 sms php版本官方没有给出php版本的短信发送sdk, 在此借鉴 [ 点击这里 ],并在此基础上将方法改成 单例模式 在原来的基础上更加容易调用1.打开 BaiduSms.php 修改 sms函数中 accessKey 、 secretAccessKey 这两个参数登录百度云账号,在右上…

《SpringCloud超级入门》Spring Cloud Eureka是什么?《八》

Spring cloud Eureka 是 Spring Cloud Netflix 微服务套件的一部分,基于 Netflix Eureka 做了二次封装,主要负责实现微服务架构中的服务治理功能。 Spring Cloud Eureka 是一个基于 REST 的服务,并且提供了基于 Java 的客户端组件&#xff0c…

php 常用编译参数,php编译参数,不用怕!!

很多初学者,在编译php的时候,容易被php的编译参数吓到!例如:./configure \--prefix/usr/local/php \--with-config-file-path/usr/local/php/etc \--enable-inline-optimization \--disable-debug \--disable-rpath \--enable-sha…

《SpringCloud超级入门》使用Eureka编写注册中心服务《九》

首先创建一个 Maven项目&#xff0c;取名为 eureka-server&#xff0c;在 pom.xml 中配置 Eureka 的依赖信息&#xff0c;代码如下所示。 <!-- Spring Boot --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot…

php设置表单为整数,PHP中如何判断FROM表单提交的数字是否为整数?

在php开发中我们经常需要用表单传递数据&#xff0c;如果我们传递的是整数(int)&#xff0c;经过表单传递后&#xff0c;在接收页面整数的数值类型将会变成字符串(string)类型,这样我们就不能用is_int()函数来判断是否为整数&#xff0c;但是我们可以用is_numeric()和strpos()函…

《SpringCloud超级入门》使用Eureka编写服务提供者《十》

创建项目注册到 Eureka 将一个服务提供者 eureka-client-user-service 注册到 Eureka 中&#xff0c;并提供一个接口给其他服务调用。 创建一个 Maven 项目&#xff0c;在 pom.xml 中增加相关依赖 <parent> <groupId>org.springframework.boot</groupId> &l…

PHP苹果不给上架,苹果商城上架拒绝

苹果商城一直被拒绝&#xff0c;原因说是有支付宝支付功能&#xff0c;需要内购。但我配置中已经把支付宝支付功能去掉了&#xff0c;也勾上了应用内支付&#xff0c;但还是被拒绝&#xff0c;不知道什么原因&#xff0c;请问我该如何整改&#xff1f;是由于HBuilderX云打包默认…

《SpringCloud超级入门》使用Eureka编写服务消费者《十一》

我们先从 Nginx 说起&#xff0c;了解为什么需要微服务。最初的服务化解决方案是给相同服务提供一个统一的域名&#xff0c;然后服务调用者向这个域发送 HTTP 请求&#xff0c;由 Nginx 负责请求的分发和跳转。 这种架构存在很多问题&#xff1a;Nginx 作为中间层&#xff0c;在…