zoukankan      html  css  js  c++  java
  • 日志工具——slf4j

    一、概述

      简单日记门面(simple logging Facade for java)SLF4J是为各种loging APIs提供一个简单统一的接口,从而使得最终用户能够在部署的时候配置自己希望的loging APIs实现。

      百度百科:

      SLF4J,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统。按照官方的说法,SLF4J是一个用于日志系统的简单Facade,允许最终用户在部署其应用时使用其所希望的日志System

      为什么使用slf4j:

        我们在开发过程中可能使用各种log,每个Log有不同的风格、布局,如果想灵活的切换那么slf4j是比较好的选择。

    二、入门程序

      引入依赖: 

        <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
                <version>1.7.2</version>
            </dependency>

      这样我们的依赖中就会多出3个jar,分别是:

      引入配置文件:

       这里我们结合的是log4j,所以引入Log4j的的配置文件在当前classpath下:log4j.properties

    #   可设置级别: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
    View Code

       编码测试代码:

        初始化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

    三、slf4j的格式

      由于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()方法

  • 相关阅读:
    tomcat(5)-如何查看linux环境下的tomcat版本?
    【PAT甲级】1023 Have Fun with Numbers (20 分)
    Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2)D(树状数组)
    【PAT甲级】1022 Digital Library (30 分)(模拟)
    Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2)B(SET)
    Codeforces Round #551 (Div. 2)D(树形DP)
    Atcoder Grand Contest 037C(贪心,优先队列,思维)
    Codeforces Round #580 (Div. 2)D(思维,Floyd暴力最小环)
    Atcoder Grand Contest 037B(DP,组合数学,思维)
    Atcoder Grand Contest 037A(贪心,思维)
  • 原文地址:https://www.cnblogs.com/jiangbei/p/7562683.html
Copyright © 2011-2022 走看看