java日志框架2-LOG4J

一 简单使用

1 maven依赖

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

2 快速使用

  • 代码
@Test
    public void test01(){
        // 获取日志记录器对象
        Logger logger = Logger.getLogger(Log4jTest.class);
        // 输出日志
        logger.fatal("fatal"); 
        logger.error("error"); 
        logger.warn("warn");   
        logger.info("info");   
        logger.debug("debug"); 
        logger.trace("trace"); 
    }
  • 运行结果
log4j:WARN No appenders could be found for logger (com.salulu.logger.test.Log4jTest).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

Process finished with exit code 0

发现有三条警告信息,并没有输出在代码中写的日志信息。
从警告信息中可以看出:没有设置appender对象

  • 解决上述问题

在代码中初始化配置信息

@Test
    public void test01(){
        // 获取日志记录器对象
        Logger logger = Logger.getLogger(Log4jTest.class);
        // 初始化默认的配置信息
        BasicConfigurator.configure();
        // 输出日志
        logger.fatal("fatal"); 
        logger.error("error"); 
        logger.warn("warn");   
        logger.info("info");   
        logger.debug("debug"); 
        logger.trace("trace"); 
    }

输出结果:

0 [main] FATAL com.salulu.logger.test.Log4jTest  - fatal
1 [main] ERROR com.salulu.logger.test.Log4jTest  - error
1 [main] WARN com.salulu.logger.test.Log4jTest  - warn
1 [main] INFO com.salulu.logger.test.Log4jTest  - info
1 [main] DEBUG com.salulu.logger.test.Log4jTest  - debug

可以看到警告信息没有了,日志正常输出了,默认只输出到debug级别的日志信息。

二 日志级别

级别描述
fatal严重错误,一般会造成系统崩溃并终止运行
error错误信息,不会影响系统运行
warn警告信息,可能会发生问题
info运行信息
debug调试信息,一般在开发中使用,记录程序变量参数传递信息等等
trace追踪信息,记录程序所有的流程信息

三 配置文件

1 配置文件放哪里

查看LogManager源码,可以看到log4j支持多种格式的配置文件,其中log4j.properties的格式最为简单配置。
在这里插入图片描述
在LogManager源码,读取配置文件:

url = Loader.getResource("log4j.properties");

使用Loader来读取,在Loader用ClassLoader来读取resources文件夹下的文件
所以只需要把log4j.properties配置文件放到resources文件夹下即可被log4j读取到。

2 简单的配置

2.1 配置内容

# 指定 RootLogger 顶级父元素默认配置信息
log4j.rootLogger = trace,console
# 指定控制台日志输出的 appender
log4j.appender.console = org.apache.log4j.ConsoleAppender
# 指定消息格式 layout
log4j.appender.console.layout = org.apache.log4j.PatternLayout
# 指定消息格式的内容
log4j.appender.console.layout.conversionPattern = %d{yyyy-MM-dd HH:mm:ss.SSS} - %-4r %-5p [%t] %C:%L %x - %m%n

把log4j.properties文件放入到resources文件夹下

2.2 测试

代码:

    @Test
    public void test01(){
        // 获取日志记录器对象
        Logger logger = Logger.getLogger(Log4jTest.class);
        // 日志级别
        logger.fatal("fatal");
        logger.error("error");
        logger.warn("warn");
        logger.info("info");
        logger.debug("debug");
        logger.trace("trace");
    }

运行结果:

2020-10-01 12:57:42.708 - 0    FATAL [main] com.salulu.logger.test.Log4jTest:15  - fatal
2020-10-01 12:57:42.710 - 2    ERROR [main] com.salulu.logger.test.Log4jTest:16  - error
2020-10-01 12:57:42.710 - 2    WARN  [main] com.salulu.logger.test.Log4jTest:17  - warn
2020-10-01 12:57:42.711 - 3    INFO  [main] com.salulu.logger.test.Log4jTest:18  - info
2020-10-01 12:57:42.711 - 3    DEBUG [main] com.salulu.logger.test.Log4jTest:19  - debug
2020-10-01 12:57:42.711 - 3    TRACE [main] com.salulu.logger.test.Log4jTest:20  - trace

3 配置详解

3.1 日志输入位置配置

log4j支持把日志输出到控制台、文件、数据库中。
在log4j.rootLogger配置中,可以指定一个或多个输出的位置
例如把日志同时输出到控制台和文件中(同时指定日志级别为TRACE):
log4j.rootLogger = trace,console,file

3.2 日志输入格式配置

%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   输出代码中的行号
%%   输出一个 "%" 字符

例如:

log4j.appender.console.layout.conversionPattern = %d{yyyy-MM-dd HH:mm:ss.SSS} - %-4r %-5p [%t] %C:%L %x - %m%n

效果就是上面2.2测试中的输出结果

3.3 日志输出到文件的策略

日志可以不切割,默认是追加的方式,但在实际使用中一般都是需要对日志文件进行切割的。
可以按照日志文件的大小切割,或者按照时间规则来切割。

  • 追加的方式,不进行切割
    指定appender为file
log4j.appender.file = org.apache.log4j.FileAppender
  • 按照大小切割:
    指定appender为rollingFile
log4j.appender.rollingFile = org.apache.log4j.RollingFileAppender
  • 按照时间格式切割:
    指定appender为dailyFile
log4j.appender.dailyFile = org.apache.log4j.DailyRollingFileAppender

具体的配置后面会有示例。

3.4 日志输出级别

log4j.rootLogger = trace,console,file
在log4j.rootLogger中可以同时配置日志输出级别和输出位置

3.5 自定义配置

log4j.rootLogger这个是顶级父元素的配置,如果是需要对特定的包做配置可以单独指定。
例如:
log4j.logger.com.xxx.xxx = info,console
指定com.xxx.xxx包下的日志级别为info,同时只输出到控制台。

四 配置示例

1 输出到控制台

# 指定日志级别=debug并输出到控制台
log4j.rootLogger = debug,console

# 指定控制台日志输出的 appender
log4j.appender.console = org.apache.log4j.ConsoleAppender
# 指定消息格式 layout
log4j.appender.console.layout = org.apache.log4j.PatternLayout
# 指定消息格式的内容
log4j.appender.console.layout.conversionPattern = [%-10p]%r  %l %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n

2 输出到文件

2.1 不切割文件

# 指定日志级别为debug,输出日志到文件
log4j.rootLogger = debug,file

# 日志文件输出的 appender 对象
log4j.appender.file = org.apache.log4j.FileAppender
# 指定消息格式 layout
log4j.appender.file.layout = org.apache.log4j.PatternLayout
# 指定消息格式的内容
log4j.appender.file.layout.conversionPattern = [%-10p]%r  %l %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n
# 指定日志文件保存路径
log4j.appender.file.file = /xxx/xxx.log
# 指定日志文件的字符集
log4j.appender.file.encoding = UTF-8

2.2 按文件大小切割

# 指定日志级别为debug,输出日志到文件
log4j.rootLogger = debug,rollingFile

# 按照文件大小拆分的 appender 对象
# 日志文件输出的 appender 对象
log4j.appender.rollingFile = org.apache.log4j.RollingFileAppender
# 指定消息格式 layout
log4j.appender.rollingFile.layout = org.apache.log4j.PatternLayout
# 指定消息格式的内容
log4j.appender.rollingFile.layout.conversionPattern = [%-10p]%r  %l %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n
# 指定日志文件保存路径
log4j.appender.rollingFile.file = /xxx/xxx.log
# 指定日志文件的字符集
log4j.appender.rollingFile.encoding = UTF-8
# 指定日志文件内容的大小
log4j.appender.rollingFile.maxFileSize = 1MB 
# 指定日志文件的数量
log4j.appender.rollingFile.maxBackupIndex = 10

上面配置了每个日志大小为1MB,共10个文件,如果文件被写满,新日志信息则会覆盖最老的日志。

2.3 按时间规则切割

# 指定日志级别为debug,输出日志到文件
log4j.rootLogger = debug,dailyFile

# 按照时间规则拆分的 appender 对象
log4j.appender.dailyFile = org.apache.log4j.DailyRollingFileAppender
# 指定消息格式 layout
log4j.appender.dailyFile.layout = org.apache.log4j.PatternLayout
# 指定消息格式的内容
log4j.appender.dailyFile.layout.conversionPattern = [%-10p]%r  %l %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n
# 指定日志文件保存路径
log4j.appender.dailyFile.file = /xxx/xxx.log
# 指定日志文件的字符集
log4j.appender.dailyFile.encoding = UTF-8
# 指定日期拆分规则
log4j.appender.dailyFile.datePattern = '.'yyyy-MM-dd

datePattern值中的点’.'表示在xxx.log后面追加的信息
当前就是xxx.log.2020-10-01
还可以按照小时切割:log4j.appender.dailyFile.datePattern = '.'yyyy-MM-dd-HH
按照分钟切割:log4j.appender.dailyFile.datePattern = '.'yyyy-MM-dd-HH-mm
按秒切割:log4j.appender.dailyFile.datePattern = '.'yyyy-MM-dd-HH-ss

3 输出到数据库

# 指定日志级别为debug,输出日志到数据库
log4j.rootLogger = debug,logDB

#mysql
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=root
# 日志插入语句
log4j.appender.logDB.Sql=INSERT INTO log(project_name,create_date,level,category,file_name,thread_name,line,all_category,message) values('test','%d{yyyy-MM-dd HH:mm:ss}','%p','%c','%F','%t','%L','%l','%m')

需要先到数据库中把表给建好即可。

4 同时输出到多个地方

# 指定日志级别为info,输出日志到控制台、文件和数据库
log4j.rootLogger = debug,console,rollingFile,logDB
# 自定义 com.xxx.xxx包下的日志设置
log4j.logger.com.xxx.xxx = info,console,logDB

注意把每个appender都配置好才可以使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值