log4j是一个用Java编写的可靠,快速和灵活的日志框架(API),它在Apache软件许可下发布。Log4j已经被移植到了C,C++,C#,Perl,Python和Ruby等语言中。 Log4j是高度可配置的,并可通过在运行时的外部文件配置。它根据记录的优先级别,并提供机制,以指示记录信息到许多的目的地,诸如:数据库,文件,控制台,UNIX系统日志等。
  Log4j中有三个主要组成部分:
  • loggers: 负责捕获记录信息。
  • appenders : 负责发布日志信息,以不同的首选目的地。
  • layout: 负责格式化不同风格的日志信息

Log4j中的对象

Log4j有两种类型的对象:核心对象 和 支持对象
 
核心对象
  • Logger对象
  • Appender对象
  • Layout对象

Logger对象

顶级层的Logger,它提供Logger对象。Logger对象负责捕获日志信息及它们存储在一个空间的层次结构。

Layout对象

该层提供其用于格式化不同风格的日志信息的对象。布局层提供支持Appender对象到发布日志信息之前。
布局对象的发布方式是人类可读的及可重复使用的记录信息的一个重要的角色。

Appender对象

下位层提供Appender对象。Appender对象负责发布日志信息,以不同的首选目的地,如数据库,文件,控制台,UNIX系统日志等。
 
支持对象

Level对象

级别对象定义的任何记录信息的粒度和优先级。有记录的七个级别在API中定义:OFF, DEBUG, INFO, ERROR, WARN, FATAL 和 ALL

Filter对象

过滤对象用于分析日志信息及是否应记录或不用这些信息做出进一步的决定。
一个appender对象可以有与之关联的几个Filter对象。如果日志记录信息传递给特定Appender对象,都和特定Appender相关的Filter对象批准的日志信息,然后才能发布到所连接的目的地。

对象渲染器

ObjectRenderer对象是一个指定提供传递到日志框架的不同对象的字符串表示。这个对象所使用的布局对象来准备最后的日志信息。

日志管理

日志管理对象管理的日志框架。它负责从一个系统级的配置文件或配置类读取初始配置参数。

日志级别

 
OFF 最高等级,用于关闭所有日志记录
FATAL 指出每个严重的错误事件将会导致应用程序的退出
ERROR 指出虽然发生错误事件,但仍然不影响系统的继续运行
WARM 表明会出现潜在的错误情形
INFO 一般和在粗粒度级别上,强调应用程序的运行全程
DEBUG 一般用于细粒度级别上,对调试应用程序非常有帮助
TRACE 指定细粒度比DEBUG更低的信息事件
ALL 最低等级,用于打开所有日志记录
优先级: ALL <TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF,日志级别如何工作?设置了日志级别p,只有记录日志时 q > p级别的日志才会启动。
在程序代码中设置日志级别:
import org.apache.log4j.*;

public class LogClass {
  private static org.apache.log4j.Logger log = Logger.getLogger(LogClass.class);
  public static void main(String[] args) {
    log.setLevel(Level.WARN);
    log.trace("Trace Message!");
    log.debug("Debug Message!");
    log.info("Info Message!");
    log.warn("Warn Message!");
    log.error("Error Message!");
    log.fatal("Fatal Message!");
  }
}

打印:(级别 WARN < ERROR < FATAL < OFF )

Warn Message!
Error Message!
Fatal Message!

配置文件设置日志级别

# Define the root logger with appender file
log = /usr/home/log4j
log4j.rootLogger = WARN, FILE # Define the file appender
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=${log}/log.out # Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n

Appender对象

Appender用来指定日志输出到哪个地方,可以同时输出到多个目的地。每个Logger可以拥有一个或者多个Appender,一个Appender代表一个日志输出目的地。
API控制: Logger.addAppender(Appender appender)为日志增加一个Appender,Logger.removeAppender(Appender appender)删除一个Appender
Log4j常用的Appender
  • org.apache.log4j.ConsoleAppender:将日志信息输出到控制台
  • org.apache.log4j.FileAppender:将日志信息输出到一个文件
  • org.apache.log4j.DailyRollingFileAppender:将日志信息输出到一个日志文件,并且每天输出到一个新的日志文件
  • org.apache.log4j.RollingFileAppender:将日志信息输出到一个日志文件,并且指定文件的尺寸,当文件大小达到指定尺寸时,会自动把文件改名,同时产生一个新的文件
  • org.apache.log4j.WriteAppender:将日志信息以流格式发送到任意指定地方
  • org.apache.log4j.jdbc.JDBCAppender:通过JDBC把日志信息输出到数据库中

日志格式化器Layout

    Layout定义了日志输出的格式,log4j定义的几种Layout
  • HTMLLayout :格式化日志输出为HTML表格
  • SimpleLayout:以一种非常简单的方式格式化日志输出,它打印三项内容:级别-信息
  • PatternLayout:根据指定的转换模式格式化日志输出,或者如果没有指定任何转换模式,就使用默认的转化模式格式。
  • TTCCLayout : 包含日志产生的时间、线程、类别等等信息
  • XMLLayout
  • DateLayout 

Log4j的配置详解

虽然可以在程序中配置Log4j,但是Log4j推荐使用配置文件实现Logger的配置,Log4j支持XML 和 property格式(log4j.properties)
简单的配置实例:
###配置根Logger
log4j.rootLogger = INFO , console
### 配置Appender###
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
###配置Layout
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern = %-d{yyyy-MM-dd HH\:mm\:ss} [%p]-[%c] %m%n
###指定特定包的输出特定的级别###
log4j.logger.org.springframwork=DEBUG
可以看出配置的步骤:
  1. 配置根Logger
  2. 配置Appender
  3. 配置Layout
  4. 指定特定包的输出特定的级别(非必须)

配置根Logger

#配置根Logger,其语法为:
#log4j.rootLogger = [level],appenderName,appenderName2,...
#level是日志记录的优先级,分为OFF,TRACE,DEBUG,INFO,WARN,ERROR,FATAL,ALL
##Log4j建议只使用四个级别,优先级从低到高分别是DEBUG,INFO,WARN,ERROR
#通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关
#比如在这里定义了INFO级别,则应用程序中所有DEBUG级别的日志信息将不被打印出来
#appenderName就是指定日志信息输出到哪个地方。可同时指定多个输出目的

配置Appender

配置日志信息输出目的地Appender,其语法为:
log4j.appender.appenderName = {Appender名称}
log4j.appender.appenderName.选项属性 = {选项属性值} ##Log4j提供的几种Appender
org.apache.log4j.ConsoleAppender(输出到控制台)
ConsoleAppender选项属性
-Threshold = DEBUG:指定日志消息的输出最低层次
-ImmediateFlush = TRUE:默认值是true,所有的消息都会被立即输出
-Target = System.err:默认值System.out,输出到控制台(err为红色,out为黑色) org.apache.log4j.FileAppender(输出到文件)
FileAppender选项属性
-Threshold = INFO:指定日志消息的输出最低层次
-ImmediateFlush = TRUE:默认值是true,所有的消息都会被立即输出
-File = C:\log4j.log:指定消息输出到C:\log4j.log文件
-Append = FALSE:默认值true,将消息追加到指定文件中,false指将消息覆盖指定的文件内容
-Encoding = UTF-8:可以指定文件编码格式 org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
DailyRollingFileAppender选项属性
-Threshold = INFO:指定日志消息的输出最低层次
-ImmediateFlush = TRUE:默认值是true,所有的消息都会被立即输出
-File = C:\log4j.log:指定消息输出到C:\log4j.log文件
-Append = FALSE:默认值true,将消息追加到指定文件中,false指将消息覆盖指定的文件内容
-DatePattern=yyyy-ww:每周滚动一次文件,即每周产生一个新的文件。还可以按用以下参数:
yyyy-MM:每月
yyyy-ww:每周
yyyy-MM-dd:每天
yyyy-MM-dd-a:每天两次
yyyy-MM-dd-HH:每小时
yyyy-MM-dd-HH-mm:每分钟
-Encoding = UTF-8:可以指定文件编码格式 org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
RollingFileAppender选项属性
-Threshold = INFO:指定日志消息的输出最低层次
-ImmediateFlush = TRUE:默认值是true,所有的消息都会被立即输出
-File = C:\log4j.log:指定消息输出到C:\log4j.log文件
-Append = FALSE:默认值true,将消息追加到指定文件中,false指将消息覆盖指定的文件内容
-Encoding = UTF-8:可以指定文件编码格式
-MaxFileSize = 100KB:后缀可以是KB,MB,GB.在日志文件到达该大小时,将会自动滚动.如:log4j.log.1
-MaxBackupIndex = 2:指定可以产生的滚动文件的最大数 org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

配置Layout

##配置日志信息的格式(布局),其语法为:
log4j.appender.appenderName.layout = {Layout名称名称}
log4j.appender.appenderName.layout.选项属性 = {选项属性值} Log4j提供的layout有以下几种:
org.apache.log4j.HTMLLayout(以HTML表格形式布局)
HTMLLayout选项属性:
-LocationInfo = TRUE:默认值false,输出java文件名称和行号
-Title=Struts Log Message:默认值 Log4J Log Messages org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
PatternLayout选项属性:
-ConversionPattern = %m%n:格式化指定的消息(参照打印参数) org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
org.apache.log4j.xml.XMLLayout(以XML形式布局)
XMLLayout选项属性:
-LocationInfo = TRUE:默认值false,输出java文件名称和行号

Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下:

%m 输出代码中指定的消息
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%r 输出自应用启动到输出该log信息耗费的毫秒数
%c 输出所属的类目,通常就是所在类的全名
%t 输出产生该日志事件的线程名
%n 输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n”
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式 【如:%d{yyyy年MM月dd日 HH:mm:ss,SSS},输出类似:2012年01月05日 22:10:28,921 】
%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数 【如:Testlog.main(TestLog.java:10)】
%F 输出日志消息产生时所在的文件名称
%L 输出代码中的行号
%x 输出和当前线程相关联的NDC(嵌套诊断环境),像java servlets多客户多线程的应用中
%% 输出一个"%"字符

可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:

%5c: 输出category名称,最小宽度是5,category<5,默认的情况下右对齐
%-5c:输出category名称,最小宽度是5,category<5,"-"号指定左对齐,会有空格
%.5c:输出category名称,最大宽度是5,category>5,就会将左边多出的字符截掉,<5不会有空格
%20.30c:category名称<20补空格,并且右对齐,>30字符,就从左边交远销出的字符截掉

Log4j配置示例

log = /usr/home/log4j
log4j.rootLogger =DEBUG,systemOut,logFile,logDailyFile,logRollingFile,logMail,logDB #输出到控制台
log4j.appender.systemOut = org.apache.log4j.ConsoleAppender
log4j.appender.systemOut.layout = org.apache.log4j.PatternLayout
log4j.appender.systemOut.layout.ConversionPattern = [%-5p][%-22d{yyyy/MM/dd HH:mm:ssS}][%l]%n%m%n
log4j.appender.systemOut.Threshold = DEBUG
log4j.appender.systemOut.ImmediateFlush = TRUE
log4j.appender.systemOut.Target = System.out #输出到文件
log4j.appender.logFile = org.apache.log4j.FileAppender
log4j.appender.logFile.layout = org.apache.log4j.PatternLayout
log4j.appender.logFile.layout.ConversionPattern = [%-5p][%-22d{yyyy/MM/dd HH:mm:ssS}][%l]%n%m%n
log4j.appender.logFile.Threshold = DEBUG
log4j.appender.logFile.ImmediateFlush = TRUE
log4j.appender.logFile.Append = TRUE
log4j.appender.logFile.File = ${log}/log_file.out
log4j.appender.logFile.Encoding = UTF-8 #按DatePattern输出到文件
log4j.appender.logDailyFile = org.apache.log4j.DailyRollingFileAppender
log4j.appender.logDailyFile.layout = org.apache.log4j.PatternLayout
log4j.appender.logDailyFile.layout.ConversionPattern = [%-5p][%-22d{yyyy/MM/dd HH:mm:ssS}][%l]%n%m%n
log4j.appender.logDailyFile.Threshold = DEBUG
log4j.appender.logDailyFile.ImmediateFlush = TRUE
log4j.appender.logDailyFile.Append = TRUE
log4j.appender.logDailyFile.File = ${log}/log_daily_rolling_file.out
log4j.appender.logDailyFile.DatePattern = '.'yyyy-MM-dd-HH-mm'.log
log4j.appender.logDailyFile.Encoding = UTF-8 #设定文件大小输出到文件
log4j.appender.logRollingFile = org.apache.log4j.RollingFileAppender
log4j.appender.logRollingFile.layout = org.apache.log4j.PatternLayout
log4j.appender.logRollingFile.layout.ConversionPattern = [%-5p][%-22d{yyyy/MM/dd HH:mm:ssS}][%l]%n%m%n
log4j.appender.logRollingFile.Threshold = DEBUG
log4j.appender.logRollingFile.ImmediateFlush = TRUE
log4j.appender.logRollingFile.Append = TRUE
log4j.appender.logRollingFile.File = ${log}/log_rolling_file.log
log4j.appender.logRollingFile.MaxFileSize = 1MB
log4j.appender.logRollingFile.MaxBackupIndex = 10
log4j.appender.logRollingFile.Encoding = UTF-8 #用Email发送日志
log4j.appender.logMail = org.apache.log4j.net.SMTPAppender
log4j.appender.logMail.layout = org.apache.log4j.HTMLLayout
log4j.appender.logMail.layout.LocationInfo = TRUE
log4j.appender.logMail.layout.Title = Struts2 Mail LogFile
log4j.appender.logMail.Threshold = DEBUG
log4j.appender.logMail.SMTPDebug = FALSE
log4j.appender.logMail.SMTPHost = SMTP.163.com
log4j.appender.logMail.From = aaa@163.com
log4j.appender.logMail.To = xxx@163.com
#log4j.appender.logMail.Cc = xxx@163.com
#log4j.appender.logMail.Bcc = xxx@163.com
log4j.appender.logMail.SMTPUsername = xly3000
log4j.appender.logMail.SMTPPassword = 1234567
log4j.appender.logMail.Subject = Log4j Log Messages
#log4j.appender.logMail.BufferSize = 1024
#log4j.appender.logMail.SMTPAuth = TRUE #将日志登录到MySQL数据库
# Define the DB appender
log4j.appender.DB=org.apache.log4j.jdbc.JDBCAppender
# Set JDBC URL
log4j.appender.DB.URL=jdbc:mysql://localhost/imok
# Set Database Driver
log4j.appender.DB.driver=com.mysql.jdbc.Driver
# Set database user name and password
log4j.appender.DB.user=root
log4j.appender.DB.password=123456
# Set the SQL statement to be executed.
log4j.appender.DB.sql=INSERT INTO LOGS VALUES('%x','%d','%C','%p','%m')
# Define the layout for file appender
log4j.appender.DB.layout=org.apache.log4j.PatternLayout

案例测试

将日志登录到MySQL数据库

创建表LOG

CREATE TABLE LOGS
(
  USER_ID VARCHAR(20) NOT NULL,
  DATED VARCHAR(50) NOT NULL,
  LOGGER VARCHAR(50) NOT NULL,
  LEVEL VARCHAR(10) NOT NULL,
  MESSAGE VARCHAR(1000) NOT NULL
);

log4j配置文件:

log = /usr/home/log4j
#root logger
log4j.rootLogger =DEBUG,
# Define the DB appender
log4j.appender.DB=org.apache.log4j.jdbc.JDBCAppender
# Set JDBC URL
log4j.appender.DB.URL=jdbc:mysql://localhost/imok
# Set Database Driver
log4j.appender.DB.driver=com.mysql.jdbc.Driver
# Set database user name and password
log4j.appender.DB.user=root
log4j.appender.DB.password=123456
# Set the SQL statement to be executed.
log4j.appender.DB.sql=INSERT INTO LOGS VALUES('%x','%d','%C','%p','%m')
# Define the layout for file appender
log4j.appender.DB.layout=org.apache.log4j.PatternLayout

代码测试:

package com.log;

import org.apache.log4j.Logger;

  public class log4jExample {
  static Logger logger = Logger.getLogger(log4jExample.class);   public static void main(String[] args){
    logger.debug("this is a debug log");
    logger.info("this is info log");
    logger.error("this is error log");
  }
}

查看数据:

日志框架Log4j的更多相关文章

  1. java日志框架log4j详细配置及与slf4j联合使用教程

    最后更新于2017年02月09日 一.log4j基本用法 首先,配置log4j的jar,maven工程配置以下依赖,非maven工程从maven仓库下载jar添加到“build path” <d ...

  2. java的几个日志框架log4j、logback、common-logging

    开发工作中每个系统都需要记录日志,常见的日志工具有log4j(用的最多),slf4j,commons-loging,以及最近比较流行的logback 以前只是在项目中用log4j,更多的是参考下配置文 ...

  3. [转载]java日志框架log4j详细配置及与slf4j联合使用教程

    一.log4j基本用法 首先,配置log4j的jar,maven工程配置以下依赖,非maven工程从maven仓库下载jar添加到“build path” 1 2 3 4 5 <dependen ...

  4. java日志框架log4j详细配置及与slf4j使用教程

    一.log4j基本用法 首先,配置log4j的jar,maven工程配置以下依赖,非maven工程从maven仓库下载jar添加到“build path” 1 2 3 4 5 <dependen ...

  5. 拨云见日,彻底弄清楚Java日志框架 log4j, logback, slf4j的区别与联系

    log4j 以及 logback, slf4j 官网 日志框架的困惑 作为一个正常的项目,是必须有日志框架的存在的,没有日志,很难追踪一些奇奇怪怪的系统问题. 但是,我们经常在项目的依赖中,见到奇奇怪 ...

  6. SpringBoot 日志框架

    默认的日志框架 logback SpringBoot使用Logback作为默认的日志框架.logback 是log4j框架的作者开发的新一代日志框架,它效率更高.能够适应诸多的运行环境,同时天然支持S ...

  7. 浅谈Log4j2日志框架及使用

    目录 1.日志框架 2.为什么需要日志接口,直接使用具体的实现不就行了吗? 3.log4j2日志级别 4.log4j2配置文件的优先级 5.对于log4j2配置文件的理解 6.对于Appender的理 ...

  8. Spring Boot 揭秘与实战(三) 日志框架篇 - 如何快速集成日志系统

    文章目录 1. 默认的日志框架 logback2. 常用的日志框架 log4j 1.1. 日志级别 1.2. 日志文件 3. 源代码 Java 有很多日志系统,例如,Java Util Logging ...

  9. slf4j日志框架绑定机制

    一.环境搭建 我们以log4j为例,探寻slf4j与log4j的绑定过程. 1.Java类 public class Slf4jBind { public static void main(Strin ...

随机推荐

  1. 【Linux】动态链接函数库

    动静区别 1. gcc –c mylib.c –o mylib.o 2. gcc -shared -fPIC mylib.o -o libmylib.so 3. 将制作好的libmylib.so 复制 ...

  2. 订阅无法在 ARM 模式下创建虚拟机,只能在 ASM 模式下创建 Azure VM 部署

    问题描述 资源组所有者可以在新版 portal 创建经典模式的虚拟机,但是无法创建 ARM 模式的虚拟机. 问题现象 环境中有个相对权限比较高的账户,比如 account admin (以下简称为 A ...

  3. vue cli 构建的 webpack 项目设置多页面

    1. webpack-dev-server下的设置(npm run dev) ./build/webpack.dev.conf.js 中,修改 new HtmlWebpackPlugin ,一个页面一 ...

  4. SSH免密钥互信及企业案例

    SSH远程免密码:  原理简述:客户端 创建公钥和私钥,公钥是锁,私钥是自己留在客户端的钥匙. 客户端将公钥(锁)发出到服务端,以后自己就能用客户端本地的私钥进行登陆,不用输入密码! 1.客户端,和服 ...

  5. EM自动任务导致数据库缓慢

    这两天客户抱怨数据库慢,查看性能什么的没发现什么异常.查看job发现一个内容为EMD_MAINTENANCE.EXECUTE_EM_DBMS_JOB_PROCS执行特别频繁.使用 EXEC DBMS_ ...

  6. Linux 网卡的解决方法

    1. 编辑70-persistent-net配置文件: # vi /etc/udev/rules.d/70-persistent-net.rules 如果没有就新建一个,添加如下内容: # PCI d ...

  7. Android(java)学习笔记46:反射机制

    1. 反射机制: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称 ...

  8. 云盘+Git GUI实现云盘文件版本号控制

    以下介绍操作细节 1.先下载Git GUI 下载地址:http://msysgit.github.io/       再下载百度云网盘 下载地址:http://pan.baidu.com 接下来就是安 ...

  9. ConcurrentMap注意事项

    java.util.concurrent.ConcurrentMap接口和ConcurrentHashMap实现类 只能在键不存在时将元素加入到map中, 只有在键存在并映射到特定值时才能从map中删 ...

  10. vue---组件引入及使用的几种方式

    在vue的项目开发过程中,基本都是基于组件化开发项目,总结下使用组件的几个点: 一.@符号的使用 在vue项目中 @ 符号代表的是根目录,即 src 目录. 二.组件的放置位置 在项目中,公用的组件放 ...