log4j

 Log4j主要由 Loggers (日志记录器)、Appenders(输出控制器)和 Layout(日志格式化器)组成。其中 Loggers 控制日志的输出以及输出级别(JUL做日志级别Level);Appenders 指定日志的输出方式(输出到控制台、文件等);Layout 控制日志信息的输出格式。

Appenders
    记录日志以及定义日志的级别仅仅是Log4j的基本功能,Log4j日志系统还提供许多强大的功能,比如允许把日志输出到不同的地方,如控制台(Console)、文件(Files)等,可以根据天数或者文件大小产生新的文件,可以以流的形式发送到其它地方等等。


常用Appenders:
ConsoleAppender将日志输出到控制台


FileAppender将日志输出到文件中


DailyRollingFileAppender将日志输出到一个日志文件,并且每天输出到一个新的文件


RollingFileAppender将日志信息输出到一个日志文件,并且指定文件的尺寸,当文件大小达到指定尺寸时,会自动把文件改名,同时产生一个新的文件


JDBCAppender把日志信息保存到数据库中

Layouts
有时用户希望根据自己的喜好格式化自己的日志输出,Log4j可以在Appenders的后面附加Layouts来完成这个功能。Layouts提供四种日志输出样式,如根据HTML样式、自由指定样式、包含日志级别与信息的样式和包含日志时间、线程、类别等信息的样式。

常用Layouts:
HTMLLayout格式化日志输出为HTML表格形式


SimpleLayout简单的日志输出格式化,打印的日志格式如默认INFO级别的消息

PatternLayout最强大的格式化组件,可以根据自定义格式输出日志,如果没有指定转换格式, 就是用默认的转换格式

日志输出格式说明
使用PatternLayout可以自定义格式输出,是我们最常用的方式
这种格式化输出采用类似于 C 语言的 printf 函数的打印格式格式化日志信息,具体的占位符及其含义如下:
%m 输出代码中指定的日志信息
%p 输出优先级,及 DEBUG、INFO 等
%n 换行符(Windows平台的换行符为 "\n",Unix 平台为 "\n")
%r 输出自应用启动到输出该 log 信息耗费的毫秒数
%c 输出打印语句所属的类的全名
%t 输出产生该日志的线程全名
%d 输出服务器当前时间,默认为 ISO8601,也可以指定格式,如:%d{yyyy年MM月dd日 HH:mm:ss}
%l 输出日志时间发生的位置,包括类名、线程、及在代码中的行数。如:Test.main(Test.java:10)
%F 输出日志消息产生时所在的文件名称
%L 输出代码中的行号
%% 输出一个 "%" 字符
可以在 % 与字符之间加上修饰符来控制最小宽度、最大宽度和文本的对其方式。如:
%5c 输出category名称,最小宽度是5,category<5,默认的情况下右对齐
%-5c 输出category名称,最小宽度是5,category<5,"-"号指定左对齐,会有空格
%.5c 输出category名称,最大宽度是5,category>5,就会将左边多出的字符截掉,<5不
会有空格
%20.30c category名称<20补空格,并且右对齐,>30字符,就从左边交远销出的字符截掉

Log4j入门案例
        注意加载初始化信息:BasicConfigurator.configure();

    日志级别说明:
        Log4j提供了8个级别的日志输出,分别为
        ALL 最低等级 用于打开所有级别的日志记录
        TRACE 程序推进下的追踪信息,这个追踪信息的日志级别非常低,一般情况下是不会使用的
        DEBUG 指出细粒度信息事件对调试应用程序是非常有帮助的,主要是配合开发,在开发过程中打印一些重要的运行信息
        INFO 消息的粗粒度级别运行信息
        WARN 表示警告,程序在运行过程中会出现的有可能会发生的隐形的错误
                注意,有些信息不是错误,但是这个级别的输出目的就是为了给程序员以提示
        ERROR 系统的错误信息,发生的错误不影响系统的运行
                一般情况下,如果不想输出太多的日志,则使用该级别即可
        FATAL 表示严重错误,它是那种一旦发生系统就不可能继续运行的严重错误
                如果这种级别的错误出现了,表示程序可以停止运行了
        OFF 最高等级的级别,用户关闭所有的日志记录

        其中debug是我们在没有进行设置的情况下,默认的日志输出级别

日志输出格式(写在配置文件里)

关于log4j.properties layout属性的配置
    其中PatternLayout是日常使用最多的方式

    log4j.appender.xxx.layout=org.apache.log4j.PatternLayout
    log4j.appender.xxx.layout.conversionPattern=[%-10p]%r %c%t%d{yyyy-MM-dd HH:mm:ss:SSS} %m%n


    %m 输出代码中指定的日志信息
    %p 输出优先级,及 DEBUG、INFO 等
    %n 换行符(Windows平台的换行符为 "\n",Unix 平台为 "\n")
    %r 输出自应用启动到输出该 log 信息耗费的毫秒数
    %c 输出打印语句所属的类的全名
    %t 输出产生该日志的线程全名
    %d 输出服务器当前时间,默认为 ISO8601,也可以指定格式,如:%d{yyyy年MM月dd日 HH:mm:ss}
    %l 输出日志时间发生的位置,包括类名、线程、及在代码中的行数。如:Test.main(Test.java:10)
    %F 输出日志消息产生时所在的文件名称
    %L 输出代码中的行号
    %% 输出一个 "%" 字符
    [%p]%r %c%t%d{yyyy-MM-dd HH:mm:ss:SSS} %m%n
    可以在 % 与字符之间加上修饰符来控制最小宽度、最大宽度和文本的对其方式
    [%10p]:[]中必须有10个字符,由空格来进行补齐,信息右对齐
    [%-10p]:[]中必须有10个字符,由空格来进行补齐,信息左对齐,应用较广泛

如果有输出中文的需求怎么办
观察FileAppender的父类
找到protected String encoding;属性
即: log4j.appender.xxx.encoding=UTF-8

日志太多了,不方便管理和维护怎么办
   FileAppender为我们提供了好用的子类来进一步的对于文件输出进行处理
        RollingFileAppender         按照文件大小进行拆分
        DailyRollingFileAppender    按照时间来进行文件的拆分

将日志持久化到数据库表中
创建表结构:(字段的制定可以根据需求进行调整)
        CREATE TABLE tbl_log(

            id int(11) NOT NULL AUTO_INCREMENT,
            name varchar(255) DEFAULT NULL COMMENT '项目名称',
            createTime varchar(255) DEFAULT NULL COMMENT '创建时间',
            level varchar(255) DEFAULT NULL COMMENT '日志级别',
            category varchar(255) DEFAULT NULL COMMENT '所在类的全路径',
            fileName varchar(255) DEFAULT NULL COMMENT '文件名称',
            message varchar(255) DEFAULT NULL COMMENT '日志消息',
            PRIMARY KEY(id)


    对于数据库表的日志输出进行相应配置
    #配置appender输出方式 输出到数据库表
    log4j.appender.logDB=org.apache.log4j.jdbc.JDBCAppender
    log4j.appender.logDB.layout=org.apache.log4j.PatternLayout
    log4j.appender.logDB.Driver=com.mysql.jdbc.Driver
    log4j.appender.logDB.URL=jdbc:mysql://localhost:3306/test
    log4j.appender.logDB.User=root
    log4j.appender.logDB.Password=123456
    log4j.appender.logDB.Sql=INSERT INTO tbl_log(name,createTime,level,category,fileName,message) values('project_log','%d{yyyy-MM-dd HH:mm:ss}','%p','%c','%F','%m')

Log4j的自定义logger(看代码)

#配置根节点logger(第一个属性是输出级别,后面是自定义logger名称)
log4j.rootLogger=trace,console

#配置自定义logger
log4j.logger.com.bjpowernode.log4j.test=info,file

#配置apache的logger
log4j.logger.org.apache=error

#上面是配置根节点和自定义节点

#下面配置输出
# log4j.appender. + 自定义logger名称
# log4j.appender.xxx(根据输出方式自定义名称,然后在上面定义的logger里填写)=org.apache.log4j.xxxxx   定义输出方式(控制台,文件(大小或日期),数据库)

#配置appender输出方式 输出到控制台
log4j.appender.console=org.apache.log4j.ConsoleAppender
#配置输出到控制台的格式
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.conversionPattern=[%-10p]%r %c%t%d{yyyy-MM-dd HH:mm:ss:SSS} %m%n


#配置appender输出方式 输出到文件
log4j.appender.file=org.apache.log4j.FileAppender
#配置输出到文件中的格式
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.conversionPattern=[%-10p]%r %c%t%d{yyyy-MM-dd HH:mm:ss:SSS} %m%n
#第一个file是我们自己命名的appenderName,第二个file是用来指定文件位置的属性
log4j.appender.file.file=D://test//log4j.log
#配置输出字符编码
log4j.appender.file.encoding=UTF-8


#RollingFileAppender的配置,我们可以针对于实际含义起名
log4j.appender.rollingFile=org.apache.log4j.RollingFileAppender
log4j.appender.rollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.rollingFile.layout.conversionPattern=[%-10p]%r %c%t%d{yyyy-MM-dd HH:mm:ss:SSS} %m%n
log4j.appender.rollingFile.file=D://test//log4j.log
log4j.appender.rollingFile.encoding=UTF-8
#指定日志文件内容大小
log4j.appender.rollingFile.maxFileSize=1MB
#指定日志文件的数量(文件数量超过,则覆盖旧文件)
log4j.appender.rollingFile.maxBackupIndex=5


#DailyRollingFileAppender的配置,我们可以针对于实际含义起名
log4j.appender.dailyRollingFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.dailyRollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.dailyRollingFile.layout.conversionPattern=[%-10p]%r %c%t%d{yyyy-MM-dd HH:mm:ss:SSS} %m%n
log4j.appender.dailyRollingFile.file=D://test//log4j.log
log4j.appender.dailyRollingFile.encoding=UTF-8
#以秒保存日志文件,通常以天,即'.'yyyy-MM-dd
log4j.appender.dailyRollingFile.datePattern='.'yyyy-MM-dd HH-mm-ss

#配置appender输出方式 输出到数据库表
log4j.appender.logDB=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.logDB.layout=org.apache.log4j.PatternLayout
log4j.appender.logDB.Driver=com.mysql.jdbc.Driver
log4j.appender.logDB.URL=jdbc:mysql://localhost:3306/test
log4j.appender.logDB.User=root
log4j.appender.logDB.Password=123456
log4j.appender.logDB.Sql=INSERT INTO tbl_log(name,createTime,level,category,fileName,message) values('project_log','%d{yyyy-MM-dd HH:mm:ss}','%p','%c','%F','%m')
package com.log.log4j;

import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Logger;
import org.apache.log4j.helpers.LogLog;
import org.junit.Test;

public class Log4jTest {
    @Test
    public void test01(){

        /*---------------------------日志级别说明:----------------------------------------------------------------------
            Log4j入门案例
                注意加载初始化信息:BasicConfigurator.configure();

            日志级别说明:
                Log4j提供了8个级别的日志输出,分别为
                ALL 最低等级 用于打开所有级别的日志记录
                TRACE 程序推进下的追踪信息,这个追踪信息的日志级别非常低,一般情况下是不会使用的
                DEBUG 指出细粒度信息事件对调试应用程序是非常有帮助的,主要是配合开发,在开发过程中打印一些重要的运行信息
                INFO 消息的粗粒度级别运行信息
                WARN 表示警告,程序在运行过程中会出现的有可能会发生的隐形的错误
                        注意,有些信息不是错误,但是这个级别的输出目的就是为了给程序员以提示
                ERROR 系统的错误信息,发生的错误不影响系统的运行
                        一般情况下,如果不想输出太多的日志,则使用该级别即可
                FATAL 表示严重错误,它是那种一旦发生系统就不可能继续运行的严重错误
                        如果这种级别的错误出现了,表示程序可以停止运行了
                OFF 最高等级的级别,用户关闭所有的日志记录

                其中debug是我们在没有进行设置的情况下,默认的日志输出级别

         */

        //加载初始化配置,后面通过配置文件可以省去
        BasicConfigurator.configure();
        LogLog.setInternalDebugging(true);//输出日志详细信息,(配置内容,输出级别等)
        Logger logger = Logger.getLogger(Log4jTest.class);

        logger.fatal("fatal信息");
        logger.error("error信息");
        logger.warn("warn信息");
        logger.info("info信息");
        logger.debug("debug信息");
        logger.trace("trace信息");


    }

    @Test
    public void test02(){
        /*-----------------------------------日志输出格式--------------------------------------------------------------
            日志输出格式(写在配置文件里)

            关于log4j.properties layout属性的配置
                其中PatternLayout是日常使用最多的方式
                
                log4j.appender.xxx.layout=org.apache.log4j.PatternLayout
                log4j.appender.xxx.layout.conversionPattern=[%-10p]%r %c%t%d{yyyy-MM-dd HH:mm:ss:SSS} %m%n


                %m 输出代码中指定的日志信息
                %p 输出优先级,及 DEBUG、INFO 等
                %n 换行符(Windows平台的换行符为 "\n",Unix 平台为 "\n")
                %r 输出自应用启动到输出该 log 信息耗费的毫秒数
                %c 输出打印语句所属的类的全名
                %t 输出产生该日志的线程全名
                %d 输出服务器当前时间,默认为 ISO8601,也可以指定格式,如:%d{yyyy年MM月dd日 HH:mm:ss}
                %l 输出日志时间发生的位置,包括类名、线程、及在代码中的行数。如:Test.main(Test.java:10)
                %F 输出日志消息产生时所在的文件名称
                %L 输出代码中的行号
                %% 输出一个 "%" 字符
                [%p]%r %c%t%d{yyyy-MM-dd HH:mm:ss:SSS} %m%n
                可以在 % 与字符之间加上修饰符来控制最小宽度、最大宽度和文本的对其方式
                [%10p]:[]中必须有10个字符,由空格来进行补齐,信息右对齐
                [%-10p]:[]中必须有10个字符,由空格来进行补齐,信息左对齐,应用较广泛
         */
         
        
        /*-------------------------如果有输出中文的需求怎么办------------------------------------------------------------------------
            如果有输出中文的需求怎么办
            观察FileAppender的父类
            找到protected String encoding;属性
            即: log4j.appender.xxx.encoding=UTF-8
         */
        
        /*---------------------------日志太多了,不方便管理和维护怎么办----------------------------------------------------------------------
            日志太多了,不方便管理和维护怎么办
               FileAppender为我们提供了好用的子类来进一步的对于文件输出进行处理
                    RollingFileAppender         按照文件大小进行拆分
                    DailyRollingFileAppender    按照时间来进行文件的拆分
         */

        
        /*------------------------------ 将日志持久化到数据库表中-------------------------------------------------------------------
        创建表结构:(字段的制定可以根据需求进行调整)
                CREATE TABLE tbl_log(

                    id int(11) NOT NULL AUTO_INCREMENT,
                    name varchar(255) DEFAULT NULL COMMENT '项目名称',
                    createTime varchar(255) DEFAULT NULL COMMENT '创建时间',
                    level varchar(255) DEFAULT NULL COMMENT '日志级别',
                    category varchar(255) DEFAULT NULL COMMENT '所在类的全路径',
                    fileName varchar(255) DEFAULT NULL COMMENT '文件名称',
                    message varchar(255) DEFAULT NULL COMMENT '日志消息',
                    PRIMARY KEY(id)
                    
                    
            对于数据库表的日志输出进行相应配置
            #配置appender输出方式 输出到数据库表
            log4j.appender.logDB=org.apache.log4j.jdbc.JDBCAppender
            log4j.appender.logDB.layout=org.apache.log4j.PatternLayout
            log4j.appender.logDB.Driver=com.mysql.jdbc.Driver
            log4j.appender.logDB.URL=jdbc:mysql://localhost:3306/test
            log4j.appender.logDB.User=root
            log4j.appender.logDB.Password=123456
            log4j.appender.logDB.Sql=INSERT INTO tbl_log(name,createTime,level,category,fileName,message) values('project_log','%d{yyyy-MM-dd HH:mm:ss}','%p','%c','%F','%m')
         */
        
        LogLog.setInternalDebugging(true);
        Logger logger = Logger.getLogger(Log4jTest.class);
        logger.fatal("fatal信息");
        logger.error("error信息");
        logger.warn("warn信息");
        logger.info("info信息");
        logger.debug("debug信息");
        logger.trace("trace信息");


    }


    @Test
    public void test03(){

        /*------------------------------ Log4j的自定义logger-------------------------------------------------------------------

            Log4j的自定义logger

                我们以前所创建出来的Logger对象,默认都是继承rootLogger的
                我们也可以自定义logger,让其他logger来继承这个logger

                这种继承关系就是按照包结构的关系来进行指定的
                例如我们一直使用的
                Logger logger = Logger.getLogger(Log4jTest01.class);
                路径就是:com.log.log4j.test.Log4jTest01
                它的父logger就是上层的路径或者是更上层的路径
                例如:
                    com.log.log4j.XX 儿子
                    com.log.log4j 父亲
                    com.log 爷爷
                    ..
                    ..
                    Root logger
                    上辈所做的日志属性设置,会直接的影响到子辈


                假设我们现在的配置是这样的:
                #配置根节点logger
                log4j.rootLogger=trace,console
                #配置自定义logger
                log4j.logger.com.log.log4j.test=info,file

                观察结果:
                    从输出位置来看,控制台输出了信息,日志文件也输出了信息
                    所以可以得出结论,如果根节点的logger和自定义父logger配置的输出位置是不同的
                    则取二者的并集,配置的位置都会进行输出操作

                    如果二者配置的日志级别不同,以按照我们自定的父logger的级别输出为主

        */
       /*------------------------------ 自定义logger的应用场景-------------------------------------------------------------------
            自定义logger的应用场景

                我们之所以要自定义logger,就是为了针对不同系统信息做更加灵活的输出操作
                例如:
                    我们可以在原有案例的基础之上,加上一个apache的日志输出
                    log4j.logger.org.apache=error,console

                    我们现在在配置文件中配置的logger有如下3项

                    log4j.rootLogger=trace,console
                    log4j.logger.com.log.log4j.test=info,file
                    log4j.logger.org.apache=error,console


            当前的类路径com.log.log4j.test.Log4jTest01
            在配置文件中所找到的能够作用的父logger和根logger
            log4j.rootLogger=trace,console
            log4j.logger.com.log.log4j.test=info,file

            我们刚才配置的apache的路径和我们的com.log.log4j.test.Log4jTest01不相符
            不构成父子关系,所以没有执行apache相关的配置

         */
        Logger logger = Logger.getLogger(Log4jTest.class);

        logger.fatal("fatal信息");
        logger.error("error信息");
        logger.warn("warn信息");
        logger.info("info信息");
        logger.debug("debug信息");
        logger.trace("trace信息");

        /*

            org.apache.log4j.Logger

                console在根节点中进行了配置
                在apache中也进行了配置
                由于输出的位置appender取的是并集
                所以,既然都配置了,那么就输出了两次

         */
        Logger logger1 = Logger.getLogger(Logger.class);

        logger1.fatal("fatal信息 --");
        logger1.error("error信息 --");
        logger1.warn("warn信息 --");
        logger1.info("info信息 --");
        logger1.debug("debug信息 --");
        logger1.trace("trace信息 --");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值