zoukankan      html  css  js  c++  java
  • slf4j + log4j 记录日志

    概述

    为什么使用SLF4J

    log4j简介

    slf4j+log4j环境搭建

    为什么使用SLF4J

    参考: https://www.oschina.net/translate/why-use-sl4j-over-log4j-for-logging

    SLF4J 即 Simple Logging Facade for Java
    1.SLF4J的主要动机是让你的程序独立于任何特定的日志记录库,这些日志记录库可能需要与你现在配置不同的配置,而且还会引入更多令人头疼的维护问题
    日志的框架Log4J,logback和java.util.Logging
    2.SLF4J API还有一个让你使用SLF4J而不是用长期感兴趣的 Log4j 更让人信服的功能,也就是占位符功能,在代码中用{}来表示。
    占位符功能与 String的format()方法中 的%s非常相似,因为它在运行时刻才提取所提供的真正的字符串。
    这不仅缩减了代码中的许多字符串连接,而且减少了创建String对象所需要的资源。
    不使用slf4j的写法
    if (logger.isDebugEnabled()) {
    logger.debug("Processing trade with id: " + id + " symbol: " + symbol);
    }

    使用slf4j的写法
    logger.debug("Processing trade with id: {} and symbol : {} ", id, symbol);

    log4j简介

    参考:log4j介绍  http://www.cnblogs.com/wangzhuxing/p/7753420.html

    1.Log4j三个主要的组件

    Loggers(记录器),Appenders (输出源)和Layouts(布局)。
    记录器决定日志类别-描述日志信息的重要程度,输出源决定日志要输出的地方、布局决定日志以何种形式输出。
    综合使用这三个组件可以轻松地记录信息的类型和级别,并可以在运行时控制日志输出的样式和位置。

    2.日志的五个级别

    DEBUG、INFO、WARN、ERROR和FATAL。
    这五个级别是有顺序的,DEBUG < INFO < WARN < ERROR < FATAL,分别用来指定这条日志信息的重要程度
    Log4j有一个规则:只输出级别不低于设定级别的日志信息,假设Loggers级别设定为INFO,则INFO、WARN、ERROR和FATAL级别的日志信息都会输出,而级别比INFO低的DEBUG则不会输出。

    3.配置根Logger

    log4j.rootLogger = [ level ] , appenderName1, appenderName2

    4.Appenders

    禁用和使用日志请求只是Log4j的基本功能。
    Log4j日志系统还提供许多强大的功能,比如允许把日志输出到不同的地方,如控制台(Console)、文件(Files)等,
    可以根据天数或者文件大小产生新的文件,
    可以以流的形式发送到其它地方等等。
    org.apache.log4j.ConsoleAppender(控制台)
    org.apache.log4j.FileAppender(文件)
    org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
    org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
    org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

    配置模式:
    log4j.appender.appenderName = className
    log4j.appender.appenderName.Option1 = value1
    log4j.appender.appenderName.OptionN = valueN

    5.Layout

    #以HTML表格形式布局
    log4j.appender.appenderName.layout=org.apache.log4j.HTMLLayout
    #包含日志信息的级别和信息字符串
    log4j.appender.appenderName.layout=org.apache.log4j.SimpleLayout
    #包含日志产生的时间、线程、类别等等信息
    log4j.appender.appenderName.layout=org.apache.log4j.TTCCLayout
    #可以灵活地指定布局模式 --常用
    log4j.appender.appenderName.layout=org.apache.log4j.PatternLayout
    格式化符号说明:

    %p:输出日志信息的优先级,即DEBUG,INFO,WARN,ERROR,FATAL。
    %d:输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,如:%d{yyyy/MM/dd HH:mm:ss,SSS}。
    %r:输出自应用程序启动到输出该log信息耗费的毫秒数。
    %t:输出产生该日志事件的线程名。
    %l:输出日志事件的发生位置,相当于%c.%M(%F:%L)的组合,包括类全名、方法、文件名以及在代码中的行数。例如:test.TestLog4j.main(TestLog4j.java:10)。
    %c:输出日志信息所属的类目,通常就是所在类的全名。
    %M:输出产生日志信息的方法名。
    %F:输出日志消息产生时所在的文件名称。
    %L::输出代码中的行号。
    %m::输出代码中指定的具体日志信息。
    %n:输出一个回车换行符,Windows平台为"rn",Unix平台为"n"。
    %x:输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
    %%:输出一个"%"字符。
    另外,还可以在%与格式字符之间加上修饰符来控制其最小长度、最大长度、和文本的对齐方式。如:
    1) c:指定输出category的名称,最小的长度是20,如果category的名称长度小于20的话,默认的情况下右对齐。
    2)%-20c:"-"号表示左对齐。
    3)%.30c:指定输出category的名称,最大的长度是30,如果category的名称长度大于30的话,就会将左边多出的字符截掉,但小于30的话也不会补空格。

    slf4j+log4j环境搭建

    引入jar

    slf4j-api-1.7.23.jar      这个是slf4j定义了日志的抽象层
    slf4j-log4j12-1.7.6.jar 这个是专为log4j写的适配器,实现了抽象层定义的方法
    log4j-1.2.17.jar log4j  具体的日志框架

    <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.21</version>
    </dependency>
    <dependency>
    <groupId>org.slf4j</groupId>
    <!-- 依赖log4j,因此会自动引入相关jar包-->
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.21</version>
    </dependency>

    配置文件log4j.properties


    配置文件放在class下的任何路径下即可,框架会自动查询的。

    #配置根Logger 定义缺省的日志级别为INFO 自定义多个输出对象appender:一个是控制台console、一个是按照时间产生新文件
    log4j.rootLogger=debug,console,dailyRolling
    
    
    #针对package定义日志级别
    log4j.logger.org.apache=WARN
    log4j.logger.com.paic.pafademo=WARN
    log4j.logger.org.quartz=INFO
    log4j.logger.org.springframework.scheduling.quartz=INFO
    # 如果要查看MBATIS的SQL日志信息,确保有下面配置
    log4j.logger.com.ibatis=DEBUG
    log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG
    log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG
    log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG
    log4j.logger.java.sql.ResultSet=DEBUG
    log4j.logger.java.sql.Connection=DEBUG
    log4j.logger.java.sql.Statement=DEBUG
    log4j.logger.java.sql.PreparedStatement=DEBUG
    
    # 设定控制台console的输出模式
    log4j.appender.console=org.apache.log4j.ConsoleAppender 
    log4j.appender.console.Encoding=UTF-8
    log4j.appender.console.layout=org.apache.log4j.PatternLayout
    #指定日志信息的最低输出级别,默认为DEBUG
    log4j.appender.console.Threshold=DEBUG
    log4j.appender.console.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}] [%-3p] %c{1}: %X{MDCString} %m%n
    
    
    # 设定dailyRolling的输出模式,按照时间产生新文件
    log4j.appender.dailyRolling=org.apache.log4j.DailyRollingFileAppender
    # ${log.home}通过参数-D指定,比如启动WebLogic时加入参数-Dlog.home=D:/
    log4j.appender.dailyRolling.File=${log.home}/testProject.log
    #'.'yyyy-MM:每月
    #'.'yyyy-ww:每周
    #'.'yyyy-MM-dd:每天
    #'.'yyyy-MM-dd-a:每天两次
    #'.'yyyy-MM-dd-HH:每小时
    #'.'yyyy-MM-dd-HH-mm:每分钟
    log4j.appender.dailyRolling.DatePattern='.'yyyy-MM-dd-HH-mm
    log4j.appender.dailyRolling.layout=org.apache.log4j.PatternLayout
    log4j.appender.dailyRolling.layout.ConversionPattern=%x %d{yyyy-MM-dd HH:mm:ss} [%-3p] %c{1}: %m%n
    
    
    #针对package定义日志级别
    #单独将某一模块(某包下)的日志信息输出到某一个文件
    log4j.logger.com.person=DEBUG,personModelLogger
    #确保写入personModelLogger.log文件信息不重复出现到其他日志文件中
    log4j.additivity.com.person=false
    #设置最低日志输出级别
    log4j.appender.personModelLogger.Threshold=INFO
    #按照大小产生新文件
    log4j.appender.personModelLogger=org.apache.log4j.RollingFileAppender
    log4j.appender.personModelLogger.File=d:/personModelLogger.log
    log4j.appender.personModelLogger.Append=true
    #后缀可以是KB, MB 或者GB
    log4j.appender.personModelLogger.MaxFileSize=1MB
    #指定可以产生的滚动文件的最大数,例如,设为2则可以产生personModelLogger.log.1,personModelLogger.log.2两个滚动文件和一个personModelLogger.log文件
    log4j.appender.personModelLogger.MaxBackupIndex=2
    log4j.appender.personModelLogger.layout=org.apache.log4j.PatternLayout
    log4j.appender.personModelLogger.layout.ConversionPattern=%x %d{MM/dd HH:mm:ss} [%-3p] %c{1}: %m%n
    
    
    #单独将一个类的日志输出到一个文件中
    log4j.logger.com.person.log4j.Log4jTest=DEBUG,Log4jTestLogger,console
    #additivity设置为false,则不会输出到rootLogger定义的console,dailyRolling输出对象,但是如果我还是只想输出到控制台,可以修改为如下即可
    #log4j.logger.com.person.log4j.Log4jTest=DEBUG,Log4jTestLogger,console
    #确保写入Log4jTestLogger.log文件信息不重复出现到其他日志文件中,Log4jTestLogger比personModelLogger的范围更小,因此personModelLogger中不会出现类Log4jTest的日志
    log4j.additivity.com.person.log4j.Log4jTest=false
    log4j.appender.Log4jTestLogger=org.apache.log4j.FileAppender
    log4j.appender.Log4jTestLogger.File=d:/Log4jTestLogger.log
    log4j.appender.Log4jTestLogger.layout=org.apache.log4j.PatternLayout
    log4j.appender.Log4jTestLogger.layout.ConversionPattern=%x %d{MM/dd HH:mm:ss} [%-3p] %c{1}: %m%n
    
    
    #类中获得自定义的记录器,在类中使用myLogger时会将日志写在myLogger.log中。
    #类中获得该记录器: private static final Logger myLogger = LoggerFactory.getLogger("myLogger");
    log4j.logger.myLogger=DEBUG,myLogger
    #默认true,自定义的日志默认是同时输出到log4j.rootLogger所配置的日志中的
    log4j.additivity.com.person.log4j.Log4jTest=true
    log4j.appender.myLogger=org.apache.log4j.FileAppender
    log4j.appender.myLogger.File=d:/myLogger.log
    log4j.appender.myLogger.layout=org.apache.log4j.PatternLayout
    log4j.appender.myLogger.layout.ConversionPattern=%x %d{MM/dd HH:mm:ss} [%-3p] %c{1}: %m%n

    测试类

    package com.person.log4j;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    public class Log4jTest {
        private static final Logger LOGGER = LoggerFactory.getLogger(Log4jTest.class);
        private static final Logger myLogger = LoggerFactory.getLogger("myLogger");
        public static void main(String[] args) {
            String topic = "交易";
            String id="31242341";
            LOGGER.info("Receive check msg:[msgTopic:{},msgId:{}]", topic, id);
            myLogger.info("this msg should be output to d:/myLogger.log");
        }
    
    }
  • 相关阅读:
    BZOJ1819 [JSOI]Word Query电子字典 Trie
    洛谷2973 [USACO10HOL]赶小猪Driving Out the Piggi… 概率 高斯消元
    BZOJ2669 [cqoi2012]局部极小值 状压DP 容斥原理
    BZOJ5047 空间传送装置 2017年9月月赛 最短路 SPFA
    BZOJ5045 打砖块 2017年9月月赛 其他
    BZOJ1858 [Scoi2010]序列操作 线段树
    BZOJ1826 [JSOI2010]缓存交换 堆 贪心
    BZOJ1898 [Zjoi2005]Swamp 沼泽鳄鱼 矩阵
    BZOJ1878 [SDOI2009]HH的项链 树状数组 或 莫队
    BZOJ1875 [SDOI2009]HH去散步 矩阵
  • 原文地址:https://www.cnblogs.com/walixiansheng/p/9630177.html
Copyright © 2011-2022 走看看