log4j日志框架学习

初识Log4j:

log4j有三个部分:

1.loggers 负责捕获日志信息。

2.appenders  负责输出信息到不同的目的地

3.layouts 负责使用不同的样式输出日志

log4j框架中有两种对象:

核心对象:框架的支撑对象,是框架必不可少的组成部分。

支撑对象:这些都是框架可选的对象,用于提供额外重要的工作。

核心对象包括下面几种类型:

logger对象,是最高的层,负责通过不同的风格转化日志信息,他提供给appender对象发布前的信息。(这里的层是指所处的位置)

layout对象,用于提供格式化日志信息的风格,在发布日志信息前,使其变得可读,可重用。

appender对象,这个对象属于底层的对象,它负责发布信息到不同的目的地,比如数据库,文件,控制台,UNIXsyslog等等。

log4j的架构组成图:

支撑对象,它们在log4j中扮演了很关键的角色:

1.level对象:级别对象定义日志的粒度和优先级,有七种级别:OFF,DEBUG,INFO,ERROR,WARN,FATAL,ALL。

2.过滤器对象:用于分析日志信息并决定日志信息是否输出。每个appender对象可以有几个过滤器对象协同工作,当日志信息到达特定的appender时,所有的过滤器会帮助appender在其发布到目的地之前进行过滤操作。

3.对象渲染器:提供一段字符用于识别发送日志的不同对象,这个对象也用于layout对象准备常量信息。

4.日志管理器:用于管理日志框架,它负责从初始化配置中读取信息,这个配置可能是文件配置,也可能是类的配置。

log4j.properties是log4j的配置文件,它采用键值对的方式定义。

默认情况下,logManager对象会在CLASSPATH目录下寻找log4j.properties.

基本的配置如下:


# Define the root logger with appender X

log4j.rootLogger = DEBUG, X
# Set the appender named X to be a File appender

log4j.appender.X=org.apache.log4j.FileAppender
# Define the layout for X appender

log4j.appender.X.layout=org.apache.log4j.PatternLayout

log4j.appender.X.layout.conversionPattern=%m%n

首先日志的级别为DEBUG,另外添加了一个appender,名字是X

设置appender的名字是X,并且定义该appender的实现为org.apache.log4j.FileAppender,即文件读写方式。

为X设置显示的方式--layout为PatternLayout

log4j提供了多种Appender对象,用输出日志消息到不同的目的地。比如控制台,文件,系统事件日志等等。每个appender对象都有不同的配置属性,这些属性来定义对象的行为。

layout, appender使用layout对象转换日志信息的格式。

target, 目标可能是控制台,文件,也可能是依赖于其他的appender。

level,用于设定过滤日志的级别。

threshhold  appender可以设置阈值,与日志的级别有关。日志会忽略掉所有低于该级别的日志。

filter  过滤器对象能够分析日志信息,然后决定日志请求由某个appender处理还是丢掉。

添加appender的格式如下:

properties格式:log4j.logger.[logger-name]=level,appender1,...appendern

xml格式:


<logger name="com.apress.logging.log4j" additivity="false">

    <appender-ref ref="appender1"/>

    <appender-ref ref="appender2"/>

</logger>


上面只展示来FileAppender的用法,log4j还有下面的appender以供使用:

  • AppenderSkeleton
  • AysncAppender
  • ConsoleAppender
  • DailyRollingFileAppender
  • ExternallyRolledFileAppender
  • FileAppender
  • JDBCAppender
  • JMSAppender
  • LF5Appender
  • NTEventLogAppender
  • NullAppender
  • RollingFileAppender
  • SMTPAppender
  • SocketAppender
  • SocketHubAppender
  • SyslogAppender
  • TelnetAppender
  • WriterAppender

Layout:

layout有:

  • DateLayout
  • HTMLLayout
  • PatternLayout
  • SimpleLayout
  • XMLLayout

第四部分:如何在java中输出日志消息

直接举一个例子:

pom.xml:


<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

properties文件:


# Define log file location
log=E:/

# Define the root logger with appender X
log4j.rootLogger = DEBUG, FILE
# Set the appender named X to be a File appender
log4j.appender.FILE=org.apache.log4j.FileAppender

# Define the output file
log4j.appender.FILE.file=${log}/log.out

# Define the layout for X appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n

DemoTest:


package com.fxb.log;

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

/**
 * @author  方小白  2017-09-04 17:00
 */
public class DemoTest1 {

private  static Logger logger = Logger.getLogger(DemoTest1.class);

public static void main(String[] args){

//        PropertyConfigurator.configure("classpath:/log4j.properties");

logger.error("DemoTest1 -----error");
        logger.info("DemoTest1 -----info");
        logger.debug("DemoTest1 -----debug");
        logger.warn("Demotest1 -----warn");
        logger.trace("DemoTest1 ----trace");
        logger.fatal("DemoTest1 -----fatal");

}

}

第五部分:日志输出的方法。

看第四部分中的代码。

日志类提供了很多方法处理日志活动,它不允许我们自己实例化一个logger,但是提供给我们两种静态方法,获得logger对象。

public static Logger getRootLogger();

public static Logger getLogger(String name);

d第一种方法返回应用实例的根Logger,它没有名字。

第二种方法通过名字获得日志对象Logger,类的名字是你传递的class的名字,通常是一个class的类名或者包名。

例如:static Logger logger = Logger.getLogger(XX.class.getName());

Logger类拥有下面几种打印日志的方法:

public void debug(Object message); 输出debug级别的错误。

public void error(Object message); 输出error级别的错误。

public void fatal(Object message); 输出fatal级别的错误。

public void info(Object message); 输出info级别的错误

public void warn(Object message); 输出warn级别的错误

public void trace(Object message); 输出trace级别的错误。

第六部分,日志的级别:

ALL 所有日志的级别都包括。

DEBUG  指定的信息事件的粒度是DEBUG,在调试应用的时候会有帮助。

ERROR  指定错误事件,并且这些事件还会保证应用继续运行。

FATAL  指定严重的错误事件,该事件会导致应用暂停。

INFO  指定信息消息,强调应用粗粒度的运行情况。

OFF  最高等级,相当于关闭了日志。

TRACE  指定比DEBUG更粗粒度的调试日志。

WARN  输出具有潜在风险的信息。

日志标准的排序是:

ALL<DEBUG<INFO<WARN<ERROR<FATAL<OFF

第七部分:日志格式化

log4j 提供了各种的layout对象,然后根据自己指定的Layout对象,转化日志信息。通常来说都是应用量身定制的layout对象转换信息格式。

所有的layout对象从Appender对象中接收一个LoggingEvent对象,然后通过loggingEvent对象解析信息,在通过合适的ObjectRenderer获得相应的字符串。

org.apache.log4j.Layout是log4jAPI中layout的抽象基类。log4j提供了其实现类DateLayout,HTMLLayout,PatternLayout,SimpleLayout,XMLLayout。

Layout中的方法:

这个类为所有的一般操作提提供了基本的框架,以及两个抽象方法。

public abstract boolean ingnoresThrowable(),它声明是否把java.lang.Throwable.object当做日志输出的一部分,如果layout处理这个异常对象,那么久不会忽略这个消息,反之就会忽略。

public abstract String format(LoggingEvent event)

个人自定义的layout装换格式:

除了,抽象方法,layout类也提供了一系列的接口:

public String getContentType(); 返回layout的类型,基类返回的是text/plain默认的文本类型。

public String getFooter(); 获取日志信息的尾部

public String getHeader();  获取日志信息的头部

第八部分,文件输出

在第四部分中,展示了文件输出,接下来详细的说一个文件输出。

使用org.apache.log4j.FileAppender可以把日志写入文件中。

FileAppender配置:

immediateFlush 这个标志默认为true,是否每次有消息都自动flush文件中。

encoding 字符编码

threshold  appender的阈值threshold

fileName 日志的名称

fileAppend 默认设置为true,所有的日志都输出到相同的文件。

bufferedIO  是否启动缓冲区,默认为false

bufferedSize 如果启用了缓冲区,设置缓冲区的大小,默认是8k

多文件输出--日志轮转

在第四部分的properites设置的基础上。添加:

maxFileSize  设置日志大小的阈值,默认是10MB

maxBackupIndex   设置的文件会被备份的数目,默认为1

多文件输出---日期轮转

在第四部分properties设置的基础上添加:

DatePattern,声明命名规则,默认是每天的半夜24点更新一次。

其他格式:

‘.‘yyyy-MM 每个月的开始时候更新一次。

‘.‘yyyy-MM-dd 每天半夜24点的时候更新

‘.‘yyyy-MM-dd-a 每天半夜24点的时候更新

‘.‘yyyy-MM-dd-HH  每个小时更新一次

‘.‘yyyy-MM-dd-HH-mm  每分钟更新一次

‘.‘yyyy-ww 每周的第一天更新

第九部分:输出到数据库中:

log4j提供了org.apache.log4j.JDBCAppender对象,可以把日志输出到特定的数据库中

常用的属性:

bufferSize 设置buffer的大小,默认是1

driver  设置数据库的驱动字符串,比如:com.mysql.jdbc.Driver

layout  设置使用的layout,默认是org.apache.log4j.PatternLayout

password 设置数据库的密码

sql  设置每次日志产生的时候执行的sql语句,可以是insert,update,detele

url   是指数据库的url

user 设置数据库的用户名

示例:

log4j.appender.DB=org.apache.log4j.jdbc.JDBCAppender

log4j.appender.DB.URL=jdbc:mysql://localhost/DBNAME

log4j.appender.DB.driver=com.mysql.jdbc.Driver

log4j.appender.DB.user=user_name

log4j.appender.DB.password=password

log4j.appender.DB.sql=INSERT INTO LOGS VALUES(‘%x‘,‘%d‘,‘%C‘,‘%p‘,‘%m‘)

log4j.appender.DB.layout=org.apache.log4j.PatternLayout

时间: 2024-12-29 05:01:16

log4j日志框架学习的相关文章

Spring集成Log4j日志框架

1.日志系统介绍 slf4j,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统.简答的讲就是slf4j是一系列的日志接口,而log4j是具体实现了的日志框架. slf4j与常用日志框架绑定关系,图片来源 2.Maven导入slf4j和log4j,编辑pom.xml <!-- 导入slf4j-log4j12,依赖slf4j-api和log4j,自动导入 --> <dependency> <gro

log4j日志框架的使用

java.util.logging.Logger——java 中提供的日志类 实际开发 90% 都是使用 log4j 记录日志,而 Log4j 底层就是 java.util.logging.Logger 实现的 Log4j 是一个日志输出框架,就是用于输出日志的.Mybatis 的日志输出是通过 Log4j 输出的.主流框架大部分都是 Log4j 输出的.Spring 框架也可以通过 Log4j 输出日志 作用: 1.项目部署之后,出现的任何异常都可以通过 Logger 记录到一个指定的日志文件

Log4j日志框架

引入依赖 在maven远程仓库引入依赖 <dependencies> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> </dependencies> 配置文件 在 src/main/resources 目录下新建配置文件

java日志框架slf4j与log4j的使用与配置

日志记录自然是非常重要的,但恐怕能记住slf4j与log4j等日志框架配置的人就很少了,这个东西不难,只是配置好后很少会去动它,开发新项目一般也是从其他项目拷贝,或者参照文档 废话不多说,先说log4j,使用log4j只要简单的几步 首先,弄到log4j的jar包,maven工程配置以下依赖就行,或者,从阿里的maven仓库下载jar包,添加到工程的"build path" <dependency> <groupId>log4j</groupId>

Springboot 系列(四)Spring Boot 日志框架

注意:本 Spring Boot 系列文章基于 Spring Boot 版本 v2.1.1.RELEASE 进行学习分析,版本不同可能会有细微差别. 前言 Spring 框架选择使用了 JCL 作为默认日志输出.而 Spring Boot 默认选择了 SLF4J 结合 LogBack.那我们在项目中该使用哪种日志框架呢?在对于不同的第三方 jar 使用了不同的日志框架的时候,我们该怎么处理呢? 1. 日志框架介绍 日志对于应用程序的重要性不言而喻,不管是记录运行情况还是追踪线上问题,都离不开对日

使得“Log4J日志文件保存路径”可配置

使用Log4J日志框架,可以配置将日志记录到文件中,示例配置如下: log4j.appender.A1=org.apache.log4j.RollingFileAppender log4j.appender.A1.Threshold=INFO log4j.appender.A1.File=log/info.log log4j.appender.A1.Append=true log4j.appender.A1.Encoding=GBK log4j.appender.A1.MaxFileSize=2

logback日志框架的简单使用

最近在自己搭建项目的时候,遇到logback选的问题,现在记录如下 在框架中使用logback日志框架,关于logback和log4j日志框架的选择,这里就不多说了网上百度一大堆,总之一句话 logback要比log4j效率高,性能好,配置灵活. 1.首先在maven中增加依赖 <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId&g

Java日志体系 —— 日志框架切换

通过 SLF4J 统一日志 在实际的日志转换过程中,SLF4J其实是充当了一个中介的角色.例如当我们一个项目原来是使用LOG4J进行日志记录,但是我们要换成LogBack进行日志记录. 此时我们需要先将LOG4J转换成SLF4J日志系统,再从SLF4J日志系统转成LogBack日志系统. 从日志框架转向SLF4J jul-to-slf4j:jdk-logging到slf4j的桥梁 log4j-over-slf4j:log4j1到slf4j的桥梁 jcl-over-slf4j:commons-lo

Java日志系统学习之log4j!

尽管slf4j+logback看起来很不错.但是,由于自己熟悉的很多项目都还是用log4j.而且springmvc默认使用log4j.所以 自己还是学习总结下.      我习惯到官网去看资料学习使用.我觉得这样不会让我在众多转来转去文章中.搞得晕头转向,而不得要领.   log4j apache官网手册页面. 手册页上有一段话,吸引了我的注意.本来下午的时候,我还在想理由解释为什么要使用日志.下面这段话太经典了. As Brian W. Kernighan and Rob Pike put i