栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java核心技术-日志(上)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java核心技术-日志(上)

系列文章目录

文章目录
  • 系列文章目录
  • 前言
  • 日志发展历程
  • 一、JUL
    • 1.简介
      • 1.1 Logger
      • 1.2 Handler
      • 1.3 Level
      • 1.4 Filter
      • 1.5 Formatter
    • 2.示例
      • 1.基本示例
      • 1.自定义日志级别
      • 2.日志输出到文件
      • 3.同时多个handler处理
      • 4.自定义配置文件
  • 二、Log4j
    • 1.简介
      • 1.1日志级别
      • 1.2 配置文件
      • 1.3 rootLogger
      • 1.3 appender
      • 1.4 layout
    • 2.示例
  • 三、Log4j2
    • 1.简介
    • 2.架构
      • Logger 层级
      • LoggerContext
      • Configuration
      • Logger
      • LoggerConfig
        • 日志级别
      • Appender
      • Filter
      • Layout
    • 3.配置详解
      • 1.Configuration
      • 2.Properties
      • 3.Appenders
        • 3.1ConsoleAppender
        • 3.2FileAppender
        • 3.3 RandomAccessFileAppender
        • 3.4 RollingFileAppender
        • 3.2AsyncAppender
      • 4 Loggers & Root
      • 5 Filters
      • 6.PatternLayout
    • 示例
  • 四、JCL
    • 简介
    • 原理
    • 示例
      • JCL&Log4j2整合
      • JCL&Log4j整合


前言 日志发展历程
  1. JDK1.3之前如果要打印日志只能依赖System.out.println(),System.err.println(),e.printStackTrace()。
  2. Gülcü 于2001年发布了Log4j,后来成为Apache 基金会的顶级项目。
  3. JDK1.4版本后增加了JUL(java.util.logging)
  4. 随着日志框架增多,Apache 开发了JCL(Jakarta Commons Logging),它只提供一套通用的日志接口api,并不提供日志的实现。这样应用程序可以在运行时选择自己想要的日志实现组件。
  5. Log4j的作者觉得JCL不好用,开发出Slf4j它和JCL类似,只对外提供接口或门面。同时还开发出日志框架Logback,比Log4j具有更高性能。
  6. Apache参考了Logback,推出了Log4j2,同时2015年Log4j停止更新。

发展到现在java日志体系变成如下:

一.常见的Java日志框架实现

日志框架名称jar官网说明
Log4jlog4j-1.2.17.jarhttps://logging.apache.org/log4j/1.2/2015停止更新 最后版本1.2.17
Log4j2log4j-api-2.17.2.jar log4j-core-2.17.2.jarhttps://logging.apache.org/log4j/2.x/index.htmlLog4j 2.3.2 (for Java 6), 2.12.4 (for Java 7), or 2.17.1 (for Java 8 and later)
Logbacklogback-access-1.2.11.jar logback-classic1.2.11.jar logback-core1.2.11.jarhttps://logback.qos.ch最新版本1.2.11
J.U.L jdk java.util.loggingjdk最低版本jdk1.4

二.常见的Java日志接口

日志接口最新版本支持的实现默认实现
JCL (Jakarta Commons Logging)1.2 已停止更新Log4J, Avalon LogKit,Simplelog(JCL实现的简单日志),JULLog4j
Slf4j1.7.36JUL, Logback, Log4j, Log4j2Logback
一、JUL 1.简介

java官方日志组件位于java.util.logging包下,简称J.U.L。
J.U.L主要4个模块组成:Logger、Handler 、Filter、 Formatter和 Level。

1.1 Logger

Logger对象用于记录特定系统或应用程序组件的消息。

1.2 Handler

Handler对象从Logger获取日志消息并导出。例如,它可能将它们写入控制台或写入文件,或将它们发送到网络日志服务,或将它们转发到操作系统日志,等等。
处理程序类通常使用LogManager属性为处理程序的过滤器、格式化器和级别设置默认值。目前支持的Handler有:

  1. ConsoleHandler : 输出到控制台,默认Level是INFO,Formatter是SimpleFormatter
  2. FileHandler :输出到文件,默认Level为INFO,Formatter为XMLFormatter
  3. MemoryHandler :输出到网络服务,默认Level为ALL,Formatter为SimpleFormatter
  4. SocketHandler:输出到网络服务,默认Level为ALL,Formatter为XMLFormatter
1.3 Level

Level类定义了一组标准日志级别,可用于控制日志输出。
日志级别总共有9个级别,由高到低是:
OFF关闭日志
SEVERE严重
WARNING警告
INFO信息
CONFIG配置
FINE良好
FINER较好
FINEST 最好
ALL 启用全部日志
如果设置某个级别,那么它之后的低级别日志将不输出,例如将日志级别设置成 WARNING,那么控制台只输出它以上级别的日志 WARNING和SEVERE。

1.4 Filter

Filter可用于提供对记录内容的细粒度控制,超出日志级别提供的控制。
每个记录器和每个处理程序都可以有一个与之相关联的过滤器。Logger或Handler将调用isLoggable方法来检查给定的LogRecord是否应该发布。如果isLoggable返回false, LogRecord将被丢弃。

1.5 Formatter

Formatter对日志记录格式化提供支持,目前有SimpleFormatter和XMLFormatter两种格式。

2.示例 1.基本示例
public class JulTest {
    //获取Logger
    static Logger logger=Logger.getLogger(JulTest.class.toString());

    public static void main(String[] args) {
        //设置日志级别
        logger.setLevel(Level.FINE);
        logger.log(Level.FINEST,"finest");
        logger.log(Level.FINER,"finer");
        logger.log(Level.FINE,"fine");
        logger.log(Level.CONFIG,"config");
        logger.log(Level.INFO,"info");
        logger.log(Level.WARNING,"warning");
        logger.log(Level.SEVERE,"server");

    }
}

4月 26, 2022 12:49:19 上午 com.laopeng301.JulTest main
信息: info
4月 26, 2022 12:49:19 上午 com.laopeng301.JulTest main
警告: warning
4月 26, 2022 12:49:19 上午 com.laopeng301.JulTest main
严重: server

上述例子我设置的级别Level.FINE,为什么FINE,CONFIG级别日志没输出,因为是控制台的Handler的级别默认是INFO。

1.自定义日志级别
    //设置不使用默认的handler,默认的ConsoleHandler 日志级别是INFO
        logger.setUseParentHandlers(false);
        //控制台日志处理器
        ConsoleHandler handler = new ConsoleHandler();
        logger.addHandler(handler);
        //logger handler 级别必须同时设置才生效
        logger.setLevel(Level.ALL);
        handler.setLevel(Level.ALL);
        logger.severe("severe:错误信息");
        logger.warning("warning:警告信息");
        logger.info("info:默认信息");
        logger.config("config:配置信息");
        logger.fine("fine:详细信息(少)");
        logger.finer("finer:详细信息(中)");
        logger.finest("finest:详细信息(多)");

结果:

4月 26, 2022 2:05:46 下午 com.laopeng301.JulTest customLogLevel
严重: severe:错误信息
4月 26, 2022 2:05:46 下午 com.laopeng301.JulTest customLogLevel
警告: warning:警告信息
4月 26, 2022 2:05:46 下午 com.laopeng301.JulTest customLogLevel
信息: info:默认信息
4月 26, 2022 2:05:46 下午 com.laopeng301.JulTest customLogLevel
配置: config:配置信息
4月 26, 2022 2:05:46 下午 com.laopeng301.JulTest customLogLevel
详细: fine:详细信息(少)
4月 26, 2022 2:05:46 下午 com.laopeng301.JulTest customLogLevel
较详细: finer:详细信息(中)
4月 26, 2022 2:05:46 下午 com.laopeng301.JulTest customLogLevel
非常详细: finest:详细信息(多)

2.日志输出到文件
    private  static void fileLog() throws IOException {
        //设置不使用默认的handler,默认的ConsoleHandler 日志级别是INFO
        logger.setUseParentHandlers(false);
        //文件处理handler
        FileHandler handler = new FileHandler("jul.log");
        logger.addHandler(handler);
        //logger handler 级别必须同时设置才生效
        logger.setLevel(Level.ALL);
        handler.setLevel(Level.ALL);
        logger.severe("severe:错误信息");
        logger.warning("warning:警告信息");
        logger.info("info:默认信息");
        logger.config("config:配置信息");
        logger.fine("fine:详细信息(少)");
        logger.finer("finer:详细信息(中)");
        logger.finest("finest:详细信息(多)");
    }

jul.log日志文件内容:

3.同时多个handler处理
logger.addHandler(fileHandler);
logger.addHandler(consoleHandler);

这样日志既可以输出到file也可以到console。

4.自定义配置文件

默认日志配置为jre/lib/logging.properties,如果要替换默认配置可以在启动时指定java -Djava.util.logging.config.file=myfile,也可以在代码中指定:

  private static  void customProperties() throws IOException {
        // 读取自定义日志配置文件
        InputStream input = new FileInputStream("logging.properties");
        LogManager logManager = LogManager.getLogManager();
        // 日志管理器读取自定义配置文件
        logManager.readConfiguration(input);
        Logger logger = Logger.getLogger(JulTest.class.toString());
        logger.severe("severe:错误信息");
        logger.warning("warning:警告信息");
        logger.info("info:默认信息");
        logger.config("config:配置信息");
        logger.fine("fine:详细信息(少)");
        logger.finer("finer:详细信息(中)");
        logger.finest("finest:详细信息(多)");
    }

logging.properties

#默认处理器
handlers=java.util.logging.ConsoleHandler
# 如果不手动配置其它的日志级别,则默认输出下述配置的级别以及更高的级别
.level = INFO
# 默认输出的日志文件路径,位于用户的主目录中
java.util.logging.FileHandler.pattern = %h/jul.log
# 默认输出的日志文件大小(单位字节)
java.util.logging.FileHandler.limit = 50000
# 默认输出的日志文件数量
java.util.logging.FileHandler.count = 1
# 默认输出的日志文件格式(XML)
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter
# 控制台处理器属性设置
# 默认输出的日志级别
java.util.logging.ConsoleHandler.level = INFO
# 默认输出的日志格式(Smiple)
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
# 默认输出的日志内容会覆盖上次输出的内容, 设为true改为追加
java.util.logging.FileHandler.append=true
二、Log4j 1.简介

Log4j是apache推出的日志实现,于2015年停止更新了,目前最新版本为1.2.17。
maven添加依赖:


    log4j
    log4j
    1.2.17

1.1日志级别

Log4j日志级别有:
ALL,
TRACE,
DEBUG,
INFO,
WARN,
ERROR,
FATAL,
OFF

Log4J推荐使用:DEBUG, INFO,WARN, ERROR 输出级别的种类: OFF 为最高等级 关闭了日志信息 FATAL 为可能导致应用中止的严重事件错误
ERROR 为严重错误 主要是程序的错误 WARN 为一般警告

1.2 配置文件

Log4j 支持两种配置文件格式,一种是 XML 格式的文件,一种是 Java 特性文件 log4j.properties 。
Log4j的配置文件log4j.properties或log4j.xml,在src/main/resources目录下。包含rootLogger(配置日志级别和输出目的地)、appender(输出目的地配置)、layout(日志格式)等。示例如下:

#设置日志级别和appender(日志输出地,可多个)
log4j.rootLogger=info,stdout,file
#输出到控制台
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#日志格式
log4j.appender.stdout.layout.ConversionPattern=%d %l [%t] %p %m%n
#输出到文件
#直接输出到文件
#log4j.appender.file=org.apache.log4j.FileAppender
#日志文件达到一定大小时生产新文件
#log4j.appender.file=org.apache.log4j.RollingFileAppender
#每天产生新的日志文件
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.File=log4jStudy.log
log4j.appender.file.Threshold=warn
log4j.appender.file.layout=org.apache.log4j.PatternLayout
#日志格式
log4j.appender.file.layout.ConversionPattern=%d %l [%t] %p %m%n
##输出到邮箱,在此略过
#log4j.appender.email=org.apache.log4j.net.SMTPAppender
#
##输出到数据库,在此略过
#log4j.appender.db=org.apache.log4j.jdbc.JDBCAppender
1.3 rootLogger

log4j.rootLogger = [ level ] , appenderName1, appenderName2, …(日志级别,输出目的地)

level :设定日志记录的最低级别,可设的值有OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定义的级别,Log4j建议只使用中间四个级别。

appenderName:就是指定日志信息要输出到哪里。可以同时指定多个输出目的地,用逗号隔开。

1.3 appender

日志输出器,配置日志的输出级别、输出位置等。

log4j提供的appender类型主要有下面5种:
org.apache.log4j.ConsoleAppender(控制台)
org.apache.log4j.FileAppender(文件)
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生新文件)
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

1.4 layout
log4j.appender.appenderName.layout=className

className:可设值如下:
(1)org.apache.log4j.HTMLLayout(以HTML表格形式布局)
(2)org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
(3)org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
(4)org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
(1)HTMLLayout选项:
LocationInfo=true:输出java文件名称和行号,默认值是false。
(2)PatternLayout选项:
ConversionPattern=%m%n:设定以怎样的格式显示消息。

日志格式中符号意义

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


2.示例

新增配置文件log4j.xml,使用xml配置比较方便结构清晰。








    
    
        
        
            
            
        

        
        
            
            
            
            
        
    

    
    
        
        
        
        
        
        
        
        
        
        
        
            
            
        
    


    
    
    
        
        
        
        
        
        
        
        
        `
        
            
            
        
    


    
    
        
        
        
        
        

        
        
        
            
        
    

    
    
        
        
        



    




public class Log4jTest {
    public static void main(String[] args) {
        Logger logger=Logger.getLogger(Log4jTest.class);
        logger.info("log4j info 日志测试");
        logger.warn("log4j warn 日志测试");
    }
}
[2022-04-26 16:21:46 106][代码中日志具体信息:log4j info 日志测试]
[2022-04-26 16:21:46 107][代码中日志具体信息:log4j warn 日志测试]

Process finished with exit code 0

由于log4j目前已停止更新,目前大部分都使用效率更高的log4j2,因此不再过多的介绍。

三、Log4j2 1.简介

Apache Log4j 2是Log4j的升级版本,它提供了比前一个版本显著的改进。最新版本: 2.17.2。
maven依赖:


    org.apache.logging.log4j
    log4j-api
    2.17.2


    org.apache.logging.log4j
    log4j-core
    2.17.2

2.架构


1.使用Log4j 2 API的应用程序将从LogManager请求一个具有特定名称的Logger。
2. LogManager将定位到适当的LoggerContext,然后从中获取Logger。
3. 如果必须创建Logger,它将与LoggerConfig相关联,该LoggerConfig包含(1.与Logger相同的名 2.父包的名称 3.root LoggerConfig)
4. LoggerConfig对象是通过配置中的Logger声明创建的,LoggerConfig与实际对应LogEvent的Appenders相关联。

Logger 层级

与普通的System.out.println相比,任何日志API的首要优势在于它能够禁用某些日志语句,同时允许其他日志语句不受阻碍地打印。
在Log4j 1通过Logger之间的关系来维护Logger层次结构。在Log4j 2中,这种关系不再存在。相反,层次结构是在LoggerConfig对象之间的关系中维护的。

Logger和LoggerConfig是命名实体。Logger名称区分大小写,并遵循层次命名规则:

一个LoggerConfig被称为另一个LoggerConfig的祖先,如果它的名称后跟一个点是后代Logger名称的前缀。如果一个LoggerConfig和它的后代LoggerConfig之间没有祖先,那么它就被称为子LoggerConfig的父LoggerConfig。

例如,名称为"com.foo" 的LoggerConfig是名称为"com.foo.Bar"的父级。同样,"java"是"java.util"的父级,"java.util.Vector"的祖先。

Root LoggerConfig是LoggerConfig层级结构的顶部。它是特殊的LoggerConfig,因为它总是存在的,它是每一个层级的一部分。
Root LoggerConfig获取:

Logger logger = LogManager.getLogger(LogManager.ROOT_LOGGER_NAME);

简单的方式:

Logger logger = LogManager.getRootLogger();
LoggerContext

LoggerContext是日志系统的锚。它维护应用程序请求的所有Loggers的列表和对应Configuration的引用。 配置将包含已配置的loggers、appenders、filters等,并将在重新配置时自动更新。

Configuration

每个LoggerContext都有一个激活的配置。配置包含所有的appender,上下文范围的Filters, LoggerConfigs以及StrSubstitutor的引用。在重新配置期间,将存在两个Configuration对象。一旦所有的Loggers被重定向到新的配置,旧的配置将被停止并丢弃。

Logger

如前所述,Logger是通过调用LogManager.getLogger创建的。Logger本身不执行直接操作。它只有一个名称,并与一个LoggerConfig相关联。它继承AbstractLogger并实现了所需的方法。当配置被修改时,Logger可能会与不同的LoggerConfig相关联,从而导致它们的行为被修改。

调用LogManager。具有相同名称的getLogger方法将始终返回对完全相同的Logger对象的引用。
例如:

Logger x = LogManager.getLogger("wombat");
Logger y = LogManager.getLogger("wombat");

x和y指向完全相同的Logger对象。
log4j环境的配置通常在应用程序初始化时完成。首选的方式是读取配置文件。

由于Logger以其所属的类命名是一种常见的习惯用法,因此提供了方便的方法LogManager.getLogger(Class clazz)来自动使用调用类的完全限定类名作为Logger的名称。这种方式时常用的。

LoggerConfig

LoggerConfig对象是在日志配置中声明Logger时创建的。LoggerConfig包含一组过滤器,在将LogEvent传递给任何Appenders之前,这些过滤器必须允许LogEvent通过。它包含对应用于处理事件的Appenders集的引用。

日志级别

LoggerConfigs会指定一个日志级别。内置级别包括ALL、TRACE、DEBUG、INFO、WARN、ERROR、FATAL和OFF。Log4j 2还支持自定义日志级别。OFF和ALL级别一般不用于对日志API的调用。在配置中指定OFF意味着日志事件不应该匹配,而指定ALL则意味着所有事件都匹配,包括自定义事件。

Appender

Appender负责将LogEvent传递到目的地。每个Appender都必须实现Appender接口。
大多数appender将继承至AbstractAppender,后者添加了生命周期和可筛选支持。生命周期允许组件在配置完成后完成初始化,并在关闭期间执行清理操作。
appender总是有一个名称,以便可以从Logger中引用它们。

Filter

Filter允许对日志事件进行判断,以确定是否或如何发布它们。 Filter将被它的一个filter方法调用,并返回一个Result,它是一个Enum,有三个值之一- ACCEPT, DENY或NEUTRAL。
过滤器可以配置在以下四个位置之一:

  1. 上下文范围的Filter直接在配置中配置。这些Filter拒绝的事件将不会传递给Logger进行进一步处理。一旦事件被上下文范围的Filter接受,它将不会被任何其他上下文范围的Filter判断评估,也不会使用Logger的级别来过滤事件。事件将由Logger和Appender Filter进行判断评估。
  2. Logger Filter在指定的Logger上配置。这些将在Logger的上下文范围Filter和日志级别之后进行判断评估。
  3. Appender Filter用于确定特定的Appender是否应该处理事件的格式化和发布。
  4. Appender 引用 Filters用于确定Logger是否应该将事件路由到Appender。
Layout

Appender使用Layout将LogEvent格式化为满足任何将使用日志事件的对象的需要的形式。
在Log4j 1和Logback中Layout将事件转换为字符串。在Log4j 2中,布局返回一个字节数组。 这允许Layout的结果在更多类型的appender中有用。这意味着你需要配置大多数布局的Charset,以确保字节数组包含正确的值。
使用Charset的布局的根类是org.apache.logging.log4j.core.layout.AbstractStringLayout,其中默认是UTF-8。继承AbstractStringLayout的每个布局都可以提供自己的默认设置。

3.配置详解 1.Configuration

status:log4j2自身日志打印级别。
monitorInterval:监控间隔单位为秒。

2.Properties

变量定义


    /logs/

3.Appenders

负责将日志传送至配置目的地,配置日志打印内容、格式、方式、保存策略等。

3.1ConsoleAppender


  
  
    
      
      
    
  
  
    
      
    
  

3.2FileAppender


  
   
    
      
        %d %p %c{1.} [%t] %m%n
      
    
  
  
    
      
    
  

3.3 RandomAccessFileAppender

RandomAccessFileAppender类似于标准的FileAppender,除了它是缓冲的(不能关闭),并且在内部它使用ByteBuffer + RandomAccessFile而不是BufferedOutputStream。



  
    
      
        %d %p %c{1.} [%t] %m%n
      
    
  
  
    
      
    
  

3.4 RollingFileAppender

RollingFileAppender是一个OutputStreamAppender,它写入fileName参数中命名的文件,并根据TriggeringPolicy和RolloverPolicy滚动文件。

RollingFileAppender需要TriggeringPolicy(用于确定是否应该发生滚动的策略)和RolloverStrategy( 用于确定存档文件的名称和位置的策略)。

Triggering Policies描述
CronTriggeringPolicy基于cron表达式触发滚转
OnStartupTriggeringPolicy如果日志文件比当前JVM的启动时间早,并且满足或超过了最小文件大小,OnStartupTriggeringPolicy策略会导致滚转。
SizeBasedTriggeringPolicy当文件达到指定的大小时,SizeBasedTriggeringPolicy会导致滚转。
TimeBasedTriggeringPolicy此策略接受一个interval属性,该属性根据时间模式指示翻转发生的频率
RolloverStrategy描述
DefaultRolloverStrategy默认翻转策略接受日期/时间模式和来自RollingFileAppender本身上指定的filpattern属性的整数
DirectWriteRolloverStrategyDirectWriteRolloverStrategy导致将日志事件直接写入由文件模式表示的文件中


  
    
      
        %d %p %c{1.} [%t] %m%n
      
      
      
        
        
      
       
      
    
  
  
    
      
    
  

3.2AsyncAppender

AsyncAppender接受对其他Appender的引用,并在一个单独的线程上将LogEvent写到它们。


    
      
        %d %p %c{1.} [%t] %m%n
      
    
    
    
      
    
  

以上是常使用的appenders,详细的可以参考官网https://logging.apache.org/log4j/2.x/manual/appenders.html


4 Loggers & Root

Loggers只有此处配置了Appender,Appender才会生效。

Root用来收集所有的设置的日志打印,每个log4j2的配置都必须有,但可缺省,使用默认的root具有error级别,并且仅附加Console控制台打印。


yyyy-MM-dd HH:mm:ss,SSS}
  %t 输出当前线程名称
  %-5level 输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补空格
  %logger 输出logger名称
  %msg 日志信息
  %n 换行

  其他常用的占位符有:
  %F 输出所在的类文件名,如Log4j2Test.java
  %L 输出行号
  %M 输出所在方法名
  %l 输出语句所在的行数, 包括类名、方法名、文件名、行数

官网文档

示例

来自网络




    
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
    

    
        
        
            
            
            
            
        

        
        
        
            
                
                
                
                
            
            
            
                
                
                
            
            
            
        

        
        
            
                
            
            
            
                
                
            
            
        

    

    
   
        
        
            
            
        
    


四、JCL 简介

Jakarta Commons-Logging(JCL)是apache最早提供的日志门面接口。提供简单的日志实现以及日志解耦功能。
它本身并没有记录Log的功能,只是统一了JUL与Log4j的API,并把日志功能交给JUL或者是Log4j。如果项目的classpath中包含了Log4j的类库,就会使用Log4j,否则就使用JUL。使用Jakarta Commons-Logging(JCL)能够灵活的选择使用那些日志方式,而且不需要修改源代码。

原理

JCL主要由2个基本对象组成: Log接口( 基本记录器 ) 和 LogFactory抽象类( 负责创建 Log 实例 ) 。
JCL加载具体的日志实现,LogFactory会按照如下顺序加载:

  1. 首先在classpath下找commons-logging.properties文件。如果找到,则使用其中定义的Log实现类;如果找不到,则在查找是否已定义系统环境变量org.apache.commons.logging.Log,找到则使用其定义的Log实现类
  2. 查找classpath中是否有Log4j的包,如果发现,则自动使用Log4j作为日志实现类
  3. 否则,使用JUL日志实现类(JDK1.4以后才有日志实现类)
  4. 否则,使用JCL自己提供的一个简单的日志实现类SimpleLog

Log实现类:

Log实现描述
AvalonLogger通用日志接口的实现,该接口将所有日志调用委托给Avalon日志抽象:Logger接口。
Jdk13LumberjackLogger对JDK1.3以及以前版本的日志对象封装
Jdk14Logger使用 JDK14
Log4JLogger使用 Log4J
LogKitLoggerAvalon logkit
NoOpLogJCL自带日志实现类,日志输出不做任何操作
SimpleLogJCL自带日志实现
示例 JCL&Log4j2整合

JCL与Log4j2整合,必须引入log4j-jcl库,否则会找不到Log4JLogger。
1.添加依赖

  
            commons-logging
            commons-logging
            1.2
        
        
            org.apache.logging.log4j
            log4j-api
            2.17.2
        
        
            org.apache.logging.log4j
            log4j-core
            2.17.2
        
                
            org.apache.logging.log4j
            log4j-jcl
            2.17.2
        
        

2.添加配置
新增commons-logging.properties文件,放在src/main/resources下。

org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger

3.新增log4j2.xml或log4j2.properties的配置文件,放在src/main/resources下




    
        
            
            

            
        
        
            
            
        

        
            
            
        
    
    
    
        
        
            
            
            
        
    

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class JCLTest {

    public static void main(String[] args) {
        Log log = LogFactory.getLog(JCLTest.class);

        log.info("info日志测试");
        log.error("error日志测试");
    }
}

JCL&Log4j整合

如果要与Log4j整合,只需要jar包替换成Log4j的版本,配置文件命名为log4j.xml。

            commons-logging
            commons-logging
            1.2
        
        
            log4j
            log4j
            1.2.17
        
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/838110.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号