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");
    }

}

 

posted @ 2018-09-11 20:40  娃力先生  阅读(1507)  评论(0编辑  收藏  举报