博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java日志--slf4j-log4j12
阅读量:5939 次
发布时间:2019-06-19

本文共 8700 字,大约阅读时间需要 29 分钟。

hot3.png

       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.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=[QC] %p [%t] %C.%M(%L) | %m%n# 日志输出位置为文件log4j.appender.R=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.R.File=C:\dev\loglog4j.appender.R.layout=org.apache.log4j.PatternLayoutlog4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n# 定义相应包路径下的日志输出级别log4j.logger.com.alibaba=DEBUGlog4j.logger.com.opensymphony.oscache=ERRORlog4j.logger.org.springframework=DEBUGlog4j.logger.com.ibatis.db=WARNlog4j.logger.org.apache.velocity=FATAL log4j.logger.org.hibernate.ps.PreparedStatementCache=WARNlog4j.logger.org.hibernate=DEBUGlog4j.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: hutaishi@qq.com * 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#Consolelog4j.appender.Console=org.apache.log4j.ConsoleAppenderlog4j.appender.Console.layout=org.apache.log4j.PatternLayoutlog4j.appender.Console.layout.ConversionPattern=[slf4j-log4j12 project] %d{yyyy-MM-dd HH:mm:ss} %p [%t] %C.%M(%L) | %m%n#Filelog4j.appender.File = org.apache.log4j.FileAppenderlog4j.appender.File.File = C:/log/slf4j-log4j12.loglog4j.appender.File.layout = org.apache.log4j.PatternLayoutlog4j.appender.File.layout.ConversionPattern =[slf4j-log4j12 project] %d{yyyy-MM-dd HH:mm:ss} %p [%t] %C.%M(%L) | %m%n#DailyRollingFilelog4j.appender.DailyRollingFile = org.apache.log4j.DailyRollingFileAppenderlog4j.appender.DailyRollingFile.File = C:/log/DailyRollingFile.loglog4j.appender.DailyRollingFile.layout = org.apache.log4j.PatternLayoutlog4j.appender.DailyRollingFile.layout.ConversionPattern =[slf4j-log4j12 project] %d{yyyy-MM-dd HH:mm:ss} %p [%t] %C.%M(%L) | %m%n#RollingFilelog4j.appender.RollingFile = org.apache.log4j.RollingFileAppenderlog4j.appender.RollingFile.File = C:/log/RollingFile.loglog4j.appender.RollingFile.MaxFileSize=1KBlog4j.appender.RollingFile.MaxBackupIndex=3log4j.appender.RollingFile.layout = org.apache.log4j.PatternLayoutlog4j.appender.RollingFile.layout.ConversionPattern =[slf4j-log4j12 project] %d{yyyy-MM-dd HH:mm:ss} %p [%t] %C.%M(%L) | %m%n

075805_N5Ic_3071470.png

075830_kEYR_3071470.png

全局输出,按包输出,按类输出,看注释就懂了

#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, consolelog4j.appender.info=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.info.layout=org.apache.log4j.PatternLayoutlog4j.appender.info.layout.ConversionPattern= %d{yyyy-MM-dd HH:mm:ss} %-5p %C.%M(%L) | %m%nlog4j.appender.info.datePattern='.'yyyy-MM-dd# Threshold设置接收日志记录最低级别为DEBUG,这样全局的debug也可以接收。一般不需要指定这个属性,多余log4j.appender.info.Threshold = DEBUGlog4j.appender.info.append=truelog4j.appender.info.File=E:/deleteMe/log/info.loglog4j.appender.console=org.apache.log4j.ConsoleAppenderlog4j.appender.console.layout=org.apache.log4j.PatternLayoutlog4j.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,controllerlog4j.appender.controller=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.controller.layout=org.apache.log4j.PatternLayoutlog4j.appender.controller.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %C.%M(%L) | %m%n#每天的日志文件名格式  这里将是   controller.log.2017-10-26log4j.appender.controller.datePattern='.'yyyy-MM-dd# Threshold表示接收最低级别的日志。比如controller的日志级别为info,  我这里设计为error,那么日志只会接收error级别及以上的记录log4j.appender.controller.Threshold = INFO# append  顾名思义,将日志记录追加到文件log4j.appender.controller.append=truelog4j.appender.controller.File=E:/deleteMe/log/controller.log# 按类输出日志,将IndexController2类的日志输出到controller2.log日志中log4j.logger.me.hutaishi.controller.IndexController2=INFO,controller2log4j.appender.controller2=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.controller2.layout=org.apache.log4j.PatternLayoutlog4j.appender.controller2.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %C.%M(%L) | %m%n#每天的日志文件名格式  这里将是   controller.log.2017-10-26log4j.appender.controller2.datePattern='.'yyyy-MM-dd# Threshold表示接收最低级别的日志。比如controller的日志级别为info,  我这里设计为error,那么日志只会接收error级别及以上的记录log4j.appender.controller2.Threshold = INFO# append  顾名思义,将日志记录追加到文件log4j.appender.controller2.append=truelog4j.appender.controller2.File=E:/deleteMe/log/controller2.log# 默认情况下,子Logger 会继承父Logger的appender,也就是说,子Logger 会在父Logger 的appender里输出。# 若是additivity设为false,则子Logger 只会在自己的appender里输出,而不会在父Logger的appender里输出。# 这样配置的话,下面配置的包或类的输出信息不会输出到父Logger中的appender,而是只会输出到controller2这个appenderlog4j.additivity.me.hutaishi.controller.IndexController2=false log4j.logger.me.hutaishi.service=DEBUG,servicelog4j.appender.service=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.service.layout=org.apache.log4j.PatternLayoutlog4j.appender.service.layout.ConversionPattern= %d{yyyy-MM-dd HH:mm:ss} %-5p %C.%M(%L) | %m%nlog4j.appender.service.datePattern='.'yyyy-MM-ddlog4j.appender.service.Threshold = DUBUGlog4j.appender.service.append=truelog4j.appender.service.File=E:/deleteMe/log/service.log

 

转载于:https://my.oschina.net/hutaishi/blog/883132

你可能感兴趣的文章