2019独角兽企业重金招聘Python工程师标准>>>
SLF4J:即简单日志门面(Simple Logging Facade for Java),定义了一套日志接口,有多种不同的日志实现方案。按照官方的说法,SLF4J是一个用于日志系统的简单Facade,允许最终用户在部署其应用时使用其所希望的日志系统。
在使用SLF4J的时候,不需要在代码中或配置文件中指定你打算使用那个具体的日志系统,SLF4J提供了统一的记录日志的接口,只要按照其提供的方法记录即可,最终日志的格式、记录级别、输出方式等通过具体日志系统的配置来实现,因此可以在应用中灵活切换日志系统。
slf4j-log4j12是log4j对slf4j日志接口的一种实现方案。slf4j-log4j12:链接slf4j-api和log4j中间的适配器。
org.slf4j
slf4j-log4j12
1.7.25
下面是一个log4j配置示例:
# 日志输出级别(INFO)和输出位置(stdout,R)
log4j.rootLogger=INFO, stdout , R
# 日志输出位置为控制台
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[QC] %p [%t] %C.%M(%L) | %m%n
# 日志输出位置为文件
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File=C:\dev\log
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n
# 定义相应包路径下的日志输出级别
log4j.logger.com.alibaba=DEBUG
log4j.logger.com.opensymphony.oscache=ERROR
log4j.logger.org.springframework=DEBUG
log4j.logger.com.ibatis.db=WARN
log4j.logger.org.apache.velocity=FATAL
log4j.logger.org.hibernate.ps.PreparedStatementCache=WARN
log4j.logger.org.hibernate=DEBUG
log4j.logger.org.logicalcobwebs=WARN
配置说明:
log4j.rootLogger=INFO, stdout , R
此句为将等级为INFO的日志信息输出到stdout和R这两个目的地,stdout和R的定义在下面的代码,可以任意起名。等级可分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL,如果配置OFF则不打出任何信息,如果配置为INFO这样只显示INFO, WARN, ERROR的log信息,而DEBUG信息不会被显示,具体讲解可参照第三部分定义配置文件中的logger。
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
此句为定义名为stdout的输出端是哪种类型,可以是org.apache.log4j.ConsoleAppender(控制台),org.apache.log4j.FileAppender(文件),org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
此句为定义名为stdout的输出端的layout是哪种类型,可以是org.apache.log4j.HTMLLayout(以HTML表格形式布局),org.apache.log4j.PatternLayout(可以灵活地指定布局模式),org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
log4j.appender.stdout.layout.ConversionPattern= [QC] %p [%t] %C.%M(%L) | %m%n
如果使用pattern布局就要指定的打印信息的具体格式ConversionPattern,打印参数如下:
%m 输出代码中指定的消息;
%M 输出打印该条日志的方法名;
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL;
%r 输出自应用启动到输出该log信息耗费的毫秒数;
%c 输出所属的类目,通常就是所在类的全名;
%t 输出产生该日志事件的线程名;
%n 输出一个回车换行符,Windows平台为"rn”,Unix平台为"n”;
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy-MM-dd HH:mm:ss,SSS},输出类似:2002-10-18 22:10:28,921;
%l 输出日志事件的发生位置,及在代码中的行数;
[QC]是log信息的开头,可以为任意字符,一般为项目简称。
输出示例
[TS] DEBUG [main] AbstractBeanFactory.getBean(189) | Returning cached instance of singleton bean 'MyAutoProxy'
Log4j根据日志信息的重要程度,分OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL
当然再细分的话 还有 FATAL(严重错误),
但是Log4j官方建议实际实用的话,Log4j建议只使用四个级别,优先级从高到低分别是 ERROR、WARN、INFO、DEBUG.
当指定日志为某个级别时,大于等于该级别的日志都会输出。
假如rootLogger定义的是DEBUG 那所有的报错信息都会输出;假如定义最高等级ERROR,那么只有ERROR信息会输出,其他低等级信息是不会输出的;
[project name] %d{yyyy-MM-dd HH:mm:ss} %p [%t] %C.%M(%L) | %m%n
package me.hutaishi.log;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Author: [email protected]
* Date: 2017/4/20
* Description:
*/
public class Demo {
// 会自动查找实现类。
private static Logger logger = LoggerFactory.getLogger(Demo.class);
public static void main(String[] args) {
// [slf4j-log4j12 project] %d{yyyy-MM-dd HH:mm:ss} %p [%t] %C.%M(%L) | %m%n
/*
[slf4j-log4j12 project] 2017-04-20 00:14:59 ERROR [main] me.hutaishi.log.Demo.main(18) | 错误error信息
[slf4j-log4j12 project] 2017-04-20 00:14:59 WARN [main] me.hutaishi.log.Demo.main(19) | 警告warn信息
[slf4j-log4j12 project] 2017-04-20 00:14:59 DEBUG [main] me.hutaishi.log.Demo.main(21) | 调试debug信息
*/
for (int i = 0; i < 10; i++) {
logger.error("错误error信息");
logger.warn("警告warn信息");
logger.info("普通info信息");
logger.debug("调试debug信息");
// 将打印日志和抛出异常合并为一条语句
logger.error("错误error信息", new IllegalArgumentException("不合法的参数"));
}
}
}
log4j默认是在类路径下查找log4j.properties文件。创建该文件,写上配置,demo如下。
log4j.rootLogger=DEBUG, Console, File, DailyRollingFile, RollingFile
#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=[slf4j-log4j12 project] %d{yyyy-MM-dd HH:mm:ss} %p [%t] %C.%M(%L) | %m%n
#File
log4j.appender.File = org.apache.log4j.FileAppender
log4j.appender.File.File = C:/log/slf4j-log4j12.log
log4j.appender.File.layout = org.apache.log4j.PatternLayout
log4j.appender.File.layout.ConversionPattern =[slf4j-log4j12 project] %d{yyyy-MM-dd HH:mm:ss} %p [%t] %C.%M(%L) | %m%n
#DailyRollingFile
log4j.appender.DailyRollingFile = org.apache.log4j.DailyRollingFileAppender
log4j.appender.DailyRollingFile.File = C:/log/DailyRollingFile.log
log4j.appender.DailyRollingFile.layout = org.apache.log4j.PatternLayout
log4j.appender.DailyRollingFile.layout.ConversionPattern =[slf4j-log4j12 project] %d{yyyy-MM-dd HH:mm:ss} %p [%t] %C.%M(%L) | %m%n
#RollingFile
log4j.appender.RollingFile = org.apache.log4j.RollingFileAppender
log4j.appender.RollingFile.File = C:/log/RollingFile.log
log4j.appender.RollingFile.MaxFileSize=1KB
log4j.appender.RollingFile.MaxBackupIndex=3
log4j.appender.RollingFile.layout = org.apache.log4j.PatternLayout
log4j.appender.RollingFile.layout.ConversionPattern =[slf4j-log4j12 project] %d{yyyy-MM-dd HH:mm:ss} %p [%t] %C.%M(%L) | %m%n
全局输出,按包输出,按类输出,看注释就懂了
#log4j.rootLogger = [level],appenderName,appenderName2,...
#level是日志记录的优先级,分为OFF,TRACE,DEBUG,INFO,WARN,ERROR,FATAL,ALL
##Log4j建议只使用四个级别,优先级从低到高分别是DEBUG,INFO,WARN,ERROR
#通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关
#比如在这里定义了INFO级别,则应用程序中所有DEBUG级别的日志信息将不被打印出来
log4j.rootLogger=INFO, info, console
log4j.appender.info=org.apache.log4j.DailyRollingFileAppender
log4j.appender.info.layout=org.apache.log4j.PatternLayout
log4j.appender.info.layout.ConversionPattern= %d{yyyy-MM-dd HH:mm:ss} %-5p %C.%M(%L) | %m%n
log4j.appender.info.datePattern='.'yyyy-MM-dd
# Threshold设置接收日志记录最低级别为DEBUG,这样全局的debug也可以接收。一般不需要指定这个属性,多余
log4j.appender.info.Threshold = DEBUG
log4j.appender.info.append=true
log4j.appender.info.File=E:/deleteMe/log/info.log
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} %-5p %C.%M(%L) | %m%n
#Log4j针对不同包指定level:
#一般在生产环境中应用系统,日志级别调整为INFO以避免过多的输出日志。
#但某些时候,需要跟踪具体问题,那么就得打开DEBUG日志。
#但是如果打开log4j.rootLogger,则需要的信息就会淹没在日志的海洋中。
#此时,需要单独指定某个或者某些Logger的日志级别为DEBUG,而rootLogger保持INFO不变。
#参考配置如下(指定me.hutaishi.controller包的日志输出)
#分包设置,admin与service包中的日志输出分离
log4j.logger.me.hutaishi.controller=INFO,controller
log4j.appender.controller=org.apache.log4j.DailyRollingFileAppender
log4j.appender.controller.layout=org.apache.log4j.PatternLayout
log4j.appender.controller.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %C.%M(%L) | %m%n
#每天的日志文件名格式 这里将是 controller.log.2017-10-26
log4j.appender.controller.datePattern='.'yyyy-MM-dd
# Threshold表示接收最低级别的日志。比如controller的日志级别为info, 我这里设计为error,那么日志只会接收error级别及以上的记录
log4j.appender.controller.Threshold = INFO
# append 顾名思义,将日志记录追加到文件
log4j.appender.controller.append=true
log4j.appender.controller.File=E:/deleteMe/log/controller.log
# 按类输出日志,将IndexController2类的日志输出到controller2.log日志中
log4j.logger.me.hutaishi.controller.IndexController2=INFO,controller2
log4j.appender.controller2=org.apache.log4j.DailyRollingFileAppender
log4j.appender.controller2.layout=org.apache.log4j.PatternLayout
log4j.appender.controller2.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %C.%M(%L) | %m%n
#每天的日志文件名格式 这里将是 controller.log.2017-10-26
log4j.appender.controller2.datePattern='.'yyyy-MM-dd
# Threshold表示接收最低级别的日志。比如controller的日志级别为info, 我这里设计为error,那么日志只会接收error级别及以上的记录
log4j.appender.controller2.Threshold = INFO
# append 顾名思义,将日志记录追加到文件
log4j.appender.controller2.append=true
log4j.appender.controller2.File=E:/deleteMe/log/controller2.log
# 默认情况下,子Logger 会继承父Logger的appender,也就是说,子Logger 会在父Logger 的appender里输出。
# 若是additivity设为false,则子Logger 只会在自己的appender里输出,而不会在父Logger的appender里输出。
# 这样配置的话,下面配置的包或类的输出信息不会输出到父Logger中的appender,而是只会输出到controller2这个appender
log4j.additivity.me.hutaishi.controller.IndexController2=false
log4j.logger.me.hutaishi.service=DEBUG,service
log4j.appender.service=org.apache.log4j.DailyRollingFileAppender
log4j.appender.service.layout=org.apache.log4j.PatternLayout
log4j.appender.service.layout.ConversionPattern= %d{yyyy-MM-dd HH:mm:ss} %-5p %C.%M(%L) | %m%n
log4j.appender.service.datePattern='.'yyyy-MM-dd
log4j.appender.service.Threshold = DUBUG
log4j.appender.service.append=true
log4j.appender.service.File=E:/deleteMe/log/service.log