log4j 详解

安装

log4j 官网下载相应的 jar 包: 点击直达

或使用 maven 坐标:

复制

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

快速开始

首先需要在项目 src 目录下创建文件 log4j.properties :

复制

log4j.rootLogger = debug, stdout

log4j.appender.stdout = org.apache.log4j.ConsoleAppender

log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern = %c %d{ABSOLUTE} %5p %c{1}:%L - %m%n

输出日志

复制

import org.apache.log4j.Logger;

public class Test {
    private static Logger logger = Logger.getLogger(Test.class);
    
    public static void main(String[] args) {
        // 记录debug级别的信息
        logger.debug("This is debug message.");
        // 记录info级别的信息
        logger.info("This is info message.");
        // 记录error级别的信息
        logger.error("This is error message.");
    }
}

打印结果:

im.zhaojun.Test 19:31:42,793 DEBUG Test:13 - This is debug message.
im.zhaojun.Test 19:31:42,798  INFO Test:15 - This is info message.
im.zhaojun.Test 19:31:42,798 ERROR Test:17 - This is error message.

log4j 配置

Appender

输出方式也称之为输出目的地,Log4j 自带的 appender 类有:

复制

org.apache.log4j.ConsoleAppender(控制台),  
org.apache.log4j.FileAppender(文件),  
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)  
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
org.apache.log4j.jdbc.JDBCAppender(输出到数据库)

配置方式如下:

复制

log4j.appender.appenderName=org.apache.log4j.ConsoleAppender

Level

日志信息的优先级从高到低有 OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL,但只建议使用 ERROR、WARN、INFO、DEBUG 四种级别。

Root Level

可以在 log4j.properties 中来配置 Root Level,语法为:

复制

log4j.rootLogger = [ level ], appenderName, appenderName, …

[level] 中可填写 info, debug 等级别,它表示所有 appender 的最低输出级别,如填写 info,则所有 appender 中低于 info 级别的日志将不会生效。

Appender Level

每个 Appender 也可以配置 Level,不过这里称为 Threshold :

复制

log4j.appender.appenderName.Threshold = [level]

其中 appenderName 为自定义的 appender 名称,[level] 为当前 appender 的最低输出级别。

Logger Level

在程序中通过 logger.setLevel() 来设置当前 Logger 对象输出的最低 Level。

复制

public class Test {
    private static Logger logger = Logger.getLogger(Test.class);

    public static void main(String[] args) {
        // 设置只输出 INFO 及以上级别的信息
        logger.setLevel(Level.INFO);
        
        // 记录debug级别的信息, (这里不会输出)
        logger.debug("This is debug message.");
        // 记录info级别的信息
        logger.info("This is info message.");
        // 记录error级别的信息
        logger.error("This is error message.");
    }
}

不推荐使用,在 Appender 中会配置更加直观。

Level 相互关系

三种 Level 的关系为:Root Level > Appender Level > Logger Level

它们之间可理解为父子关系,父级别会限制子级别的输出内容,

Layout

Log4j 自带的 layout 有:

复制

org.apache.log4j.HTMLLayout(以HTML表格形式布局),  
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),  
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),  
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

配置方式如下:

复制

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

Logger 实例

Logger类提供了多种方法来处理日志,它提供了两个静态方法获得一个 Logger 对象:

  • public static Logger getRootLogger();
  • public static Logger getLogger(String name);

第一个返回应用程序实例根记录器并没有名字。

第二种方法通过记录器的名称获得。记录器名称是可以传递任何字符串,通常是类或包的名称 ,用于区分不同类的输出,可以在 Layout 中通过 %c来获取。(也可传入 Class 类型,会自动调用其 getName 方法取得字符串)。

Logger类有专门用于打印日志信息下面的方法如下。

#

方法及描述

1

public void debug(Object message) 这种方法打印使用 Level.DEBUG 消息级别

2

public void error(Object message) 这种方法打印使用 Level.ERROR 消息级别

3

public void fatal(Object message); 这种方法打印使用 Level.FATAL 消息级别

4

public void info(Object message); 这种方法打印使用 Level.INFO 消息级别

5

public void warn(Object message); 这种方法打印使用 Level.WARN 消息级别

6

public void trace(Object message); 这种方法打印使用Level.TRACE消息级别

日志格式化

PatternLayout

最为常用的便是 org.apache.log4j.PatternLayout,它采用类似 C 语言中的 printf 函数的打印格式格式化日志信息。

%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL  
%r 输出自应用启动到输出该log信息耗费的毫秒数  
%c 输出所属的类目,通常就是所在类的全名  
%t 输出产生该日志事件的线程名  
%n 输出一个回车换行符,Windows平台为"rn",Unix平台为"n"  
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921  
%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)

参数

描述

实例

c

Logger 的名字, 即 Logger.getLogger(String name) 创建实例时的 name 值。 允许使用 %c{数字} 输出部分的名字(从右边往左边数)。见实例

%c 将输出 com.log4j.Log4jTest%c{1}将输出Log4jTest%c{2}将输出log4j.Log4jTest%c{3}将输出com.log4j.Log4jTest

C

输出 Logger 所在类的名称。

%C 将输出com.log4j.Log4jTest%C{1}将输出Log4jTest%C{2}将输出log4j.Log4jTest%C{3}将输出com.log4j.Log4jTest

d

输出日期。允许使用%d{yyyy-MM-dd HH:mm:ss}格式化日期。

%d将输出2018-07-28 22:24:25,353%d{yyyy-MM-dd}将输出2018-07-28%d{ABSOLUTE}将输出22:24:25,353

F

输出所在的类文件名称

%F将输出Log4jTest.java

l

输出语句所在的行数,包括类名,方法名,文件名,行数等

%l将输出com.log4j.test.Log4jTest.main(Log4jTest.java:50)

L

输出语句所在的行数,只输出数字

%L将输出 50

m

输出日志

输出日志,即log.info(“”), log.debug(“”)的内容

M

输出方法名

%M 将输出main

n

换行符,Windows下输出\r\n,Linux下输出\n

含行

p

输出日志级别(prioriry)

DEBUG,INFO,ERROR,FITAL等

r

输出从程序启动到输出该日志之间的时间间隔,单位毫秒

%r将输出300

t

输出当前的线程名称

%t将输出main,Thread-0,Thread-1等

%

%%用来输出百分号

需要避免 “C”, “F”, “L”, “M” 等位置信息的记录,原因详见:http://logging.apache.org/log4j/2.x/manual/layouts.html#LocationInformation

Log4j 能输出形形色色的参数, 但参数内容的长度可能不同。如 %C 输出类名,有的类名很长,有的类名很短,会导致日志比较凌乱。为了解决该问题,Log4j允许设置输出内容的长度等,不够的会用空格补上。

设置的方法是在 % 与参数符号间添加数字, 例如 %20p, %-20p等。正数表示右对齐,负数表示左对齐,数字表示最小宽度,不足时用空格补齐。还可以设置最大宽度,如果超出,则截取,方法是用小数点+数字设置,例如 %.30p

%p 为例,所有的调整格式见表:

格式

对齐方式

最小宽度

最大宽度

描述

实例

[%10p]

右对齐

10

正数右对齐,最小宽度

[ ERROR]

[%-10p]

左对齐

10

负数左对齐,最小宽度

[ERROR ]

[%.4p]

4

最大宽度

[RROR]

[%10.20p]

右对齐

10

20

正数右对齐,最大最小宽度

[ ERROR]

日志目的地

控制台

文件

要写日志信息到一个文件中,必须使用 org.apache.log4j.FileAppender。配置参数:

属性

描述

immediateFlush

标志的默认设置为true,这意味着输出流的文件被刷新,在每个追加操作

encoding

它可以使用任何字符编码。默认情况下是特定于平台的编码方案

threshold

这个 appender 阈值级别

File

日志文件的路径,如 d:/test.log

append

默认设置为true,这意味着记录的信息被附加到同一文件的末尾

bufferedIO

此标志表示是否需要写入缓存启用。默认设置为false

bufferSize

如果 bufferedI/O 启用,这表示缓冲区的大小,默认设置为8KB

数据库

log4j API 提供 org.apache.log4j.jdbc.JDBCAppender 对象,它能够将日志信息在指定的数据库,配置参数:

Property

描述

bufferSize

设置缓冲区的大小。默认大小为1

driver

设置驱动程序类为指定的字符串。如果没有指定驱动程序类,默认为sun.jdbc.odbc.JdbcOdbcDriver

layout

设置要使用的布局。默认布局是org.apache.log4j.PatternLayout

password

Sets the database password.

sql

指定SQL语句在每次记录事件发生的时间执行。这可能是INSERT,UPDATE或DELETE

URL

设置JDBC URL

user

设置数据库用户名

开始使用基于JDBC日志,要创建在哪里保存日志信息的表。下面是创建日志表的SQL语句:

复制

CREATE TABLE `logs` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`),
  `date` datetime NOT NULL,
  `logger` varchar(50) NOT NULL,
  `level` varchar(10) NOT NULL,
  `message` varchar(1000) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

以下是将用于将消息记录到一个日志表中的示例配置文件 log4j.properties的JDBCAppender

复制

log4j.rootLogger = DEBUG, DB

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=root
log4j.appender.DB.password=root

log4j.appender.DB.sql=INSERT INTO logs(`date`, `logger`, `level`, `message`)VALUES('%d{yyyy-MM-dd HH:mm:ss}','%C','%p','%m')

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

运行结果:

复制

mysql> select * from logs;
+---------------------+-----------------+-------+---------------------------+----+
| date                | logger          | level | message                   | id |
+---------------------+-----------------+-------+---------------------------+----+
| 2018-07-28 23:25:40 | im.zhaojun.Test | INFO  | This is info message.你好 |  1 |
| 2018-07-28 23:25:40 | im.zhaojun.Test | ERROR | This is error message.    |  2 |
| 2018-07-28 23:25:40 | im.zhaojun.Test | INFO  | This is info message.你好 |  3 |
| 2018-07-28 23:25:40 | im.zhaojun.Test | ERROR | This is error message.    |  4 |
| 2018-07-28 23:25:40 | im.zhaojun.Test | INFO  | This is info message.你好 |  5 |
| 2018-07-28 23:25:41 | im.zhaojun.Test | ERROR | This is error message.    |  6 |
+---------------------+-----------------+-------+---------------------------+----+
4 rows in set (0.03 sec)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏偏前端工程师的驿站

JS魔法堂:Data URI Scheme介绍

一、前言                                   上周五公司内部的Any Topic Conf.上我和同事们分享了这个主题,有同事说...

2237
来自专栏Python研发

Django之Model世界

django为使用一种新的方式,即:关系对象映射(Object Relational Mapping,简称ORM)

1242
来自专栏Charlie's Road

<Solidity学习系列四>使用编译器

Solidity存储库的一个构建目标是solc,solidity命令行编译器。 使用solc --help为您提供所有选项的解释。 编译器可以生成各种输出,范围...

1542
来自专栏决胜机器学习

PHP PDO——单例模式实现数据库操作

PHP PDO——单例模式实现数据库操作 (原创内容,转载请注明来源,谢谢) 一、概述 PDO是PHP访问数据库的轻量、持久的接口,其提供一个...

9998
来自专栏JavaEdge

Bean Validation 介绍及最佳实践关于 Bean ValidationBean Validation 中的 constraint创建一个包含验证逻辑的简单应用(基于 JSP)定制化的 co

3017
来自专栏极客猴

Django 学习笔记之模型高级用法(上)

前面有两篇文章简单介绍 Django 的模型,这一部分算是基础知识。我自己近期也总做了下总结,将花大概两篇的篇幅来分享下模型的一些高级用法。

733
来自专栏Java架构师历程

spring boot应用启动原理分析

摘要: spring boot quick start 在spring boot里,很吸引人的一个特性是可以直接把应用打包成为一个jar/war,然后这个jar...

7063
来自专栏小白安全

Java反序列化利用工具 -- Java Deserialization Exp Tools

Java反序列化漏洞已经被曝出一段时间了,本人参考了网上大神的放出来的工具,将Jboss、Websphere和weblogic的反序列化漏洞的利用集成到了一起...

9617
来自专栏技术碎碎念

Jsp语法、指令及动作元素

一、JSP的语法 1、JSP的模板元素:(先写HTML)    就是JSP中的那些HTML标记    作用:页面布局和美化 2、JSP的Java脚本表达式:  ...

4356
来自专栏无题

Mybatis源码解析

MyBatis初始化 MyBatis在初始化的时候,会将MyBatis的配置信息全部加载到内存中,使用org.apache.ibatis.session.Con...

2937

扫码关注云+社区

领取腾讯云代金券