一.日志系统介绍

slf4j,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统。简答的讲就是slf4j是一系列的日志接口,而log4j是具体实现了的日志框架。

slf4j与常用日志框架绑定关系

二.导入jar包

Maven导入slf4j和log4j,编辑pom.xml

        <!-- 导入slf4j-log4j12,依赖slf4j-api和log4j,自动导入 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>

三.配置log4j

log4j日志框架配置,编辑resources/log4j.xml

log4j的xml配置方式基本步骤有3个,第一步:配置appender;第二步:配置logger;第三步:配置root。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<!-- 输出信息到控制台,用于开发调试 -->
<appender name="myConsole" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{dd HH:mm:ss,SSS\} %-5p] [%t] (%F:%L) - %m%n"/>
</layout>
<!-- 日志过滤条件,输出哪些日志 -->
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<!-- OFF FATAL ERROR WARN INFO DEBUG TRACE ALL -->
<param name="levelMin" value="debug"/>
<param name="levelMax" value="error"/>
<param name="AcceptOnMatch" value="true"/>
</filter>
</appender> <!-- 输出信息到文件,每天产生一个日志文件 -->
<appender name="myFile" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="${catalina.base}/logs/log4j.log"/>
<param name="Append" value="true"/>
<!-- 日志输出的最低等级 -->
<param name="Threshold" value="info"/>
<param name="DatePattern" value="'.'yyyy-MM-dd"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{dd HH:mm:ss,SSS\} %-5p] [%t] (%F:%L) - %m%n"/>
</layout>
</appender> <!-- 日志记录器,子logger会默认继承父logger的appender;子logger只在自己未定义输出级别的情况下,才会继承父logger的输出级别 -->
<logger name="com.learn.spring.server" additivity="false">
<!-- Logger中定义的level和appender中的filter定义的level的区间取交集 -->
<level value="debug"/>
<!-- 默认作用于所有的appender -->
<appender-ref ref="myConsole"/>
<appender-ref ref="myFile"/>
</logger> <root>
<level value="ALL"/>
<appender-ref ref="myConsole"/>
</root>
</log4j:configuration>

四.日志调用示例

Slf4j初始化时自动查找CLASSPATH路径下的log4j.xml配置文件

@Controller
@RequestMapping("/server")
public class IndexController { private static final Logger LOGGER = LoggerFactory.getLogger(IndexController.class); @ResponseBody
@RequestMapping("/hello")
public Object hello(String username) {
LOGGER.debug("Debug level log: username = " + username);
LOGGER.info("Info level log: username = " + username);
try {
throw new Exception("Error level log");
} catch (Exception e) {
LOGGER.error("Error level log: username = " + username, e);
} return "hello " + username;
}
}

控制台日志,输出debug、info、error级别日志

日志文件log4j.log,输出info和error级别日志,未输出debug级别日志

五.日志输出格式符号含义

%p:输出日志信息优先级,即TRACE,DEBUG,INFO,WARN,ERROR,FATAL
%d:输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式
%r:输出自应用启动到输出该log信息耗费的毫秒数
%c:输出日志信息所属的类目,通常就是所在类的全名
%t:输出产生该日志事件的线程名
%l:输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数
%x:输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中
%%:输出一个"%"字符
%F:输出日志消息产生时所在的文件名称
%L:输出代码中的行号
%m:输出代码中指定的消息,产生的日志具体信息
%n:输出一个回车换行符,Windows平台为"/r/n",Unix平台为"/n"输出日志信息换行

六.阿里巴巴日志规约

1.【强制】应用中不可直接使用日志系统 (Log 4 j 、Logback) 中的 API ,而应依赖使用日志框架SLF4J中的 API ,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一。
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  private static final Logger logger = LoggerFactory.getLogger(Abc.class);
2.【强制】日志文件推荐至少保存 15 天,因为有些异常具备以“周”为频次发生的特点。
3.【强制】应用中的扩展日志 ( 如打点、临时监控、访问日志等 ) 命名方式:appName _ logType _ logName . log 。 logType :日志类型,推荐分类有stats / desc / monitor / visit 等 ;logName :日志描述。这种命名的好处:通过文件名就可知道日志文件属于什么应用,什么类型,什么目的,也有利于归类查找。
  正例: mppserver 应用中单独监控时区转换异常,如:
  mppserver _ monitor _ timeZoneConvert . log
  说明:推荐对日志进行分类,如将错误日志和业务日志分开存放,便于开发人员查看,也便于通过日志对系统进行及时监控。
4.【强制】对 trace / debug / info 级别的日志输出,必须使用条件输出形式或者使用占位符的方式。
  说明: logger . debug( " Processing trade with id : " + id + " and symbol : " + symbol);如果日志级别是 warn ,上述日志不会打印,但是会执行字符串拼接操作,如果 symbol 是对象,会执行 toString() 方法,浪费了系统资源,执行了上述操作,最终日志却没有打印。
  正例: ( 条件 )
    if (logger.isDebugEnabled()) {
      logger.debug("Processing trade with id: " + id + " and symbol: " + symbol);
    }
  正例: ( 占位符 )
    logger.debug("Processing trade with id: {} and symbol : {} ", id, symbol);
5.【强制】避免重复打印日志,浪费磁盘空间,务必在 log 4 j . xml 中设置 additivity = false 。
  正例: <logger name="com.taobao.dubbo.config" additivity="false">
6.【强制】异常信息应该包括两类信息:案发现场信息和异常堆栈信息。如果不处理,那么通过关键字 throws 往上抛出。
  正例: logger.error(各类参数或者对象 toString+ "_" + e.getMessage(), e);
7.【推荐】谨慎地记录日志。生产环境禁止输出 debug 日志 ; 有选择地输出 info 日志 ; 如果使用 warn 来记录刚上线时的业务行为信息,一定要注意日志输出量的问题,避免把服务器磁盘撑爆,并记得及时删除这些观察日志。
  说明:大量地输出无效日志,不利于系统性能提升,也不利于快速定位错误点。记录日志时请思考:这些日志真的有人看吗?看到这条日志你能做什么?能不能给问题排查带来好处?
8.【参考】可以使用 warn 日志级别来记录用户输入参数错误的情况,避免用户投诉时,无所适从。注意日志输出的级别, error 级别只记录系统逻辑出错、异常等重要的错误信息。如非必要,请不要在此场景打出 error 级别。

Slf4j+Log4j日志框架入门的更多相关文章

  1. Spring源码学习:第2步--使用SLF4j+Log4j日志框架替换掉其自身的commons-logging日志框架

    正如Spring官方文档所述,其底层的实现选择了commons-logging作为日志框架.这一"失足"性的选择,竟连Spring自身都抱怨.但是,谁叫Spring如此优秀呢,即使 ...

  2. SpringBoot系列之切换log4j日志框架

    SpringBoot系列之使用切换log4j日志框架 ok,在pom文件右键->Diagrams->show Dependencies....,如图,找到spring-boot-start ...

  3. Log4j日志框架小记

    人啊,总是在学习中发现不足,不足中学习,学习中成长. 今天来系统记录一下对于常用日志组件的理解.配置.使用. 仅供参考, 错误之处请各路好汉不吝笔墨批评指正. 转载请注明出处 Log4j日志框架是Ap ...

  4. 一、log4j日志框架的理论和不同场景使用

    1.日志框架: 工作中要进行Java输出日志时,你需要一个或者多个日志框架.框架能提供对象.方法和必要的配置来发送日志信息.Java语言本身有自带的日志实现包java.util.logging.还有很 ...

  5. 在android中配置 slf4j + log4j 日志记录框架

    需求: 在项目开发中,需要记录 操作日志 .起初自己写了个简单的日志记录文本写入到文本的方法,后来随着项目的膨胀,需要考虑更多的操作,开始考虑性能问题. 实现: 考虑使用 slf4j + log4j ...

  6. Log4j日志框架学习零到壹(一)

    日志是系统开发过程中用于排查问题重要的记录.通常使用日志来记录系统运行的行为,什么时间点发生了什么 事情.Java中常用的莫过于Log4j框架了.下面主要围绕Log4j的基础知识.Log4j的使用方式 ...

  7. SpringBoot整合log4j日志框架

    Spring Boot 2.x默认使用Logback日志框架,要使用 Log4j2必须先排除 Logback. 加入修改依赖 <dependency> <groupId>org ...

  8. slf4j+logback日志框架 的具体使用操作【spring boot自带的默认日志框架】

    1.前言 是不是还在使用System.out.println()打印数据到控制台看? 东西少还好,如果多起来,那就看的很烦人了,特别还有加时间等信息. 怎么解决? 可以使用日志框架 ,常见的有 log ...

  9. log4j日志框架学习

    初识Log4j:      log4j有三个部分:           1.loggers 负责捕获日志信息.           2.appenders  负责输出信息到不同的目的地         ...

随机推荐

  1. Unity2017.x 版本的下载安装

    Unity2017 版本从2017年7月开始正式发布Unity2017.1版本,为了初学者更加清晰明了的掌握全过程,笔者还是以完整的共19个步骤来给大家演示下载与配置安装的全过程,方便广大读者的无障碍 ...

  2. [转载]webarchive文件转换成htm文件

    原文地址:webarchive文件转换成htm文件作者:xhbaxf Mac OS X系统带有文件转换功能,可以把webarchive文件变成html文件.方法是:   Step 1: 建立一个文件夹 ...

  3. 姑娘你大胆地往前走——答大二学生XCL之八问

    姑娘你大胆地往前走--答大二学生XCL之八问 以下问题的答案写给我家正在读大二的XCL. 写于 2017-9-13 晚 请问您是为什么选择了IT行业的? 与其说是我选择了行业,不如说是行业选择了我. ...

  4. 201521123006 《Java程序设计》第6周学习总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖 ...

  5. 201521123023《Java程序设计》第6周学习总结

    1. 本周学习总结 2. 书面作业 1.clone方法 1.1 Object对象中的clone方法是被protected修饰,在自定义的类中覆盖clone方法时需要注意什么? 实现克隆必须实现Clon ...

  6. 201521123054《JAVA程序设计》第三周学习总结

    本周学习总结 书面作业 代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; public st ...

  7. 201521123036 《Java程序设计》第13周学习总结

    本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 书面作业 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu.edu.cn,分 ...

  8. 201521123032 《Java程序设计》第13周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu ...

  9. Java:双括号初始化 /匿名内部类初始化法

    偶然见到一种初始化方式,感到十分新奇: //新建一个列表并赋初值A.B.C ArrayList<String> list = new ArrayList<String>() { ...

  10. Oracle与Mysql区别简述

    在Mysql中,一个用户下可以创建多个库: 而在Oracle中,Oracle服务器是由两部分组成 数据库实例[理解为对象,看不见的] 数据库[理解为类,看得见的] 一个数据库实例可拥有多个用户,一个用 ...