1. 新建一个Javaproject。导入Jar包(log4j-1.2.17.jar)



Jar包下载地址:点击打开链接

2. 配置文件:创建并设置log4j.properties
# 设置
log4j.rootLogger = debug,stdout,D,E
 
# 输出信息到控制台
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 = [%-5p] %d{yyyy-MM-dd HH:mm:ss, SSS} method:%l%n%m%n
 
# 输出DEBUG 级别以上的日志到D://WorkSpace/logs/debug.log
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = D://WorkSpace/logs/debug.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
# 打印DEBUG信息格式
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
 
# 输出ERROR 级别以上的日志到=D://WorkSpace/logs/error.log
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =D://WorkSpace/logs/error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
# 打印ERROR信息格式
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n

3. 使用日志
package com.qunar.sjf;
 
import org.apache.log4j.Logger;
 
public class ImportMost {
private static Logger logger = Logger.getLogger(ImportMost.class);
public static void main(String[] args) {
// debug级别的信息
logger.debug("This is a debug");
// info级别的信息
logger.info("This is a info");
// error级别的信息
logger.error("This is a error");
}
}

4. 输出信息

4.1 控制台输出信息

[DEBUG] 2016-01-13 20:55:05, 622 method:com.qunar.sjf.ImportMost.main(ImportMost.java:10)
This is a debug
[INFO ] 2016-01-13 20:55:05, 627 method:com.qunar.sjf.ImportMost.main(ImportMost.java:12)
This is a info
[ERROR] 2016-01-13 20:55:05, 628 method:com.qunar.sjf.ImportMost.main(ImportMost.java:14)
This is a error

4.2 后台日志

error.log:

2016-01-13 20:55:05  [ main:6 ] - [ ERROR ]  This is a error

debug.log:

2016-01-13 20:55:05  [ main:0 ] - [ DEBUG ]  This is a debug
2016-01-13 20:55:05  [ main:5 ] - [ INFO ]  This is a info
2016-01-13 20:55:05  [ main:6 ] - [ ERROR ]  This is a error

5. Logger方法

Logger类提供了多种方法来处理日志活动。 Logger类不同意实例化一个新实例。但它能够通过两个静态方法获得一个 Logger 对象:
public static Logger getRootLogger();
public static Logger getLogger(String name);
public static Logger getLogger(Class clazz);
第一个方法返回根日志记录器,第二个方法依据给定额參数name检索日志记录器,第三个方法依据给定的Class对象返回日志记录器。

Logging 方法:
我们得到了一个日志记录器之后。能够使用日志记录器的几种方法来记录消息。 Logger类有专门用于打印日志信息方法。


方法 描写叙述
public void debug(Object message) 打印使用 Level.DEBUG 消息级别
public void error(Object message) 打印使用 Level.ERROR 消息级别
public void fatal(Object message) 打印使用 Level.FATAL 消息级别
public void info(Object message) 打印使用 Level.INFO 消息级别
public void warn(Object message) 打印使用 Level.WARN 消息级别
public void trace(Object message) 打印使用Level.TRACE消息级别

全部的级别定义在org.apache.log4j.Level类中,而且不论什么上述方法都能够调用例如以下:

6. 日志级别

org.apache.log4j.Level类提供下面级别,但也能够通过Level类的子类自己定义级别。
级别 描写叙述
ALL 最低级别,打开全部日志级别
DEBUG 细粒度信息事件。相应用程序调试最实用
ERROR 错误事件。可能仍然同意应用程序继续执行
FATAL 很严重的错误事件。这可能导致应用程序中止
INFO 指定可以突出在粗粒度级别的应用程序执行情况的信息的消息
OFF 最高级别,关闭日志记录
TRACE 细粒度比DEBUG更低的信息事件
WARN 具有潜在危害的情况

对于标准级别关系例如以下:ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF。ALL是最低级别,OFF是最高级别。
假设设置日志级别为a,则在记录日志时日志级别b能够启用,必须满足b >= a这一条件。
以下的样例明白指出怎样能够过滤全部的DEBUG和INFO消息。这个程序使用记录并运行setLevel(Level.X)方法来设置所需的日志记录级别:
package com.qunar.sjf;
 
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
 
public class ImportMost {
private static Logger logger = Logger.getLogger(ImportMost.class);
public static void main(String[] args) {
// 设置日志记录器级别
logger.setLevel(Level.WARN);
// 日志信息
logger.trace("Trace Message!");
logger.debug("Debug Message!");
logger.info("Info Message!");
logger.warn("Warn Message!");
logger.error("Error Message!");
logger.fatal("Fatal Message!");
}
}

执行结果:

[WARN ] 2016-01-13 21:36:37, 967 method:com.qunar.sjf.ImportMost.main(ImportMost.java:15)
Warn Message!
[ERROR] 2016-01-13 21:36:37, 967 method:com.qunar.sjf.ImportMost.main(ImportMost.java:16)
Error Message!
[FATAL] 2016-01-13 21:36:37, 967 method:com.qunar.sjf.ImportMost.main(ImportMost.java:17)
Fatal Message!

7. 日志格式化

Apache log4j提供了各种布局对象,每个对象都能够依据各种布局格式记录数据。

在层次结构中的顶级类是抽象类是org.apache.log4j.Layout,是全部其它布局类的基类。

因为是抽象类。我们分不能直接使用Layout,而是使用Layout的子类。


(1)DateLayout
(2)HTMLLayout
(3)PatternLayout
(4)SimpleLayout
(5)XMLLayout

方法 描写叙述
format() 将LoggingEvent类中的信息格式化成一行日志。

getContentType() 定义日志文件的内容类型。眼下在Log4J中仅仅是在SMTPAppender中用到,用于设置发送邮件的邮件内容类型。

而Layout本身也仅仅有HTMLLayout实现了它。

getHeader() 定义日志文件的头,眼下在Log4J中仅仅是在HTMLLayout中实现了它。
getFooter() 定义日志文件的尾,眼下在Log4J中仅仅是HTMLLayout中实现了它。
ignoresThrowable() 定义当前layout是否处理异常类型。在Log4J中,不支持处理异常类型的有:TTCLayout、PatternLayout、SimpleLayout。

7.1 HTMLLayout

假设想生成一个HTML格式的日志文件,能够使用HTMLLayout 布局格式。HTMLLayout类扩展抽象org.apache.log4j.Layout类。并覆盖其基类的 format()方法来提供HTML样式格式。


这提供了下面信息显示:

  • 生成特定的日志事件之前,从应用程序的開始所经过的时间(Time)
  • 调用该记录请求的线程的名称(Thread)
  • 与此记录请求相关联的级别(Level)
  • 日志记录器(Logger)和记录消息的名称(Message)
  • 可选程序文件的位置信息。并从当中记录被调用的行号(Category 和 Line)

方法 描写叙述
void setContentType(String) 设置 HTML 的内容类型。默觉得 text/html
void setLocationInfo(String) 设置日志事件的位置信息(所在文件夹,所在行数等)。
void setTitle(String) 设置 HTML 文件的标题。默觉得 Log4j Log Messages。


实例:
package com.qunar.log;
 
import org.apache.log4j.Logger;
 
public class HtmlLayoutDemo {
// 日志记录器
private static Logger logger = Logger.getLogger(HtmlLayoutDemo.class);
public static void main(String[] args) {
logger.debug("this is an debug message");
logger.info("this is an info message");
}
}
配置文件:
# Define the root logger with appender file
log = D://WorkSpace/logs/
log4j.rootLogger = debug, FILE
 
# Define the file appender
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=${log}HtmlLayoutDemo.html
 
# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.HTMLLayout
log4j.appender.FILE.layout.Title=HTML Layout Demo
log4j.appender.FILE.layout.LocationInfo=true

日志输出:



7.2 PatternLayout

假设您希望基于某种模式生成特定格式的日志信息,可使用 org.apache.Log4j.PatternLayout 格式化您的日志信息。

PatternLayout 继承自抽象类 org.apache.Log4j.Layout。覆盖了其 format() 方法,通过提供的模式,来格式化日志信息。


设置转换模式。默觉得 %r [%t] %p %c %x - %m%n

以下的表格解释了上面模式中用到的字符。以及全部定制模式时能用到的字符:
模式字符 含义
c 为输出的日志事件分类,比方对于分类 "a.b.c",模式 %c{2} 会输出 "b.c" 。

C 输出发起记录日志请求的类的全名。比方对于类 "org.apache.xyz.SomeClass",模式 %C{1} 会输出 "SomeClass"。
d 输出记录日志的日期,比方 %d{HH:mm:ss,SSS} 或 %d{dd MMM yyyy HH:mm:ss,SSS}。
F 输出文件名称。
l 输出生成日志的调用者的位置信息。
L 输出发起日志请求的行号。

m 输出和日志事件关联的。由应用提供的信息。

M 输出发起日志请求的方法名。
n 输出平台相关的换行符。

p 输出日志事件的优先级。
r 输出从构建布局到生成日志事件所花费的时间,以毫秒为单位。

t 输出生成日志事件的线程名。
x 输出和生成日志事件线程相关的 NDC (嵌套诊断上下文)。

X 该字符后跟 MDC 键,比方 X{clientIP} 会输出保存在 MDC 中键 clientIP 相应的值。

% 百分号, %% 会输出一个 %。

缺省情况下。信息保持原样输出。可是借助格式修饰符的帮助,就可调整最小列宽、最大列宽以及对齐。


格式修饰符 左对齐 最小宽度 最大宽度 含义
%20c 20 假设列名少于 20 个字符,左边使用空格补齐(右对齐)
%-20c 20 假设列名少于 20 个字符,右边使用空格补齐(左对齐)。
%.30c 不适用 30 假设列名长于 30 个字符,从开头去除。
%20.30c 20 30 假设列名少于 20 个字符,左边使用空格补齐(右对齐)。

假设列名长于 30 个字符。从开头去除。

%-20.30c 20 30 假设列名少于 20 个字符。右边使用空格补齐(左对齐);

假设列名长于 30 个字符,从开头去除。

实例:

package com.qunar.log;
 
import org.apache.log4j.Logger;
 
public class PatternLayoutDemo {
// 日志记录器
private static Logger logger = Logger.getLogger(PatternLayoutDemo.class);
public static void main(String[] args) {
logger.debug("this is an debug message");
logger.info("this is an info message");
}
}

配置文件:
log4j.rootLogger = DEBUG, FILE
 
log4j.appender.FILE=org.apache.log4j.FileAppender
 
# 日志存储位置
log4j.appender.FILE.File=D:/WorkSpace/logs/log.out
 
# 追加方式写入文件
log4j.appender.FILE.Append=true
 
# 日志布局方式
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
 
# 日志格式
log4j.appender.FILE.layout.conversionPattern=%d{yyyy-MM-dd}-%t-%x-%-p-%-10c-%n%m%n

日志输出 log.out:
2016-01-16-main--DEBUG-com.qunar.log.PatternLayoutDemo-
this is an debug message
2016-01-16-main--INFO-com.qunar.log.PatternLayoutDemo-
this is an info message

8. 日志写到文件

8.1 FileAppender

日志记录到文件里。主要用到FileAppender类。FileAppender继承自WriterAppender。

FileAppender配置:
属性 描写叙述
ImmediateFlush 默认设置为true,表示全部消息都会被马上输出。设为false则不输出
Encoding 编码格式。它能够使用不论什么字符编码。默认情况下是特定于平台的编码方案
Threshold 写入文件的日志级别。
Filename 日志文件名。
Append 默认设置为true,以追加的方式把日志写入文件。

BufferedIO 默认设置为false,表示是否须要写入缓存启用。

BufferSize 默认设置为8KB,假设 bufferedI/O 启用,表示缓冲区的大小。

实例:

package com.qunar.log;
 
import org.apache.log4j.Logger;
 
public class PatternLayoutDemo {
// 日志记录器
private static Logger logger = Logger.getLogger(PatternLayoutDemo.class);
public static void main(String[] args) {
logger.debug("this is an debug message");
logger.info("this is an info message");
}
}

配置文件:
log4j.rootLogger = DEBUG, FILE
 
log4j.appender.FILE=org.apache.log4j.FileAppender
 
# 日志存储位置
log4j.appender.FILE.File=D:/WorkSpace/logs/log.out
 
# 表示全部消息都会被马上输出。设为false则不输出
log4j.appender.FILE.ImmediateFlush=true
 
# 写入的日志级别
log4j.appender.FILE.Threshold=info
 
# 追加方式写入文件
log4j.appender.FILE.Append=true
 
# 日志布局方式
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
 
# 日志格式
log4j.appender.FILE.layout.conversionPattern=%d{yyyy-MM-dd}-%t-%x-%-p-%-10c-%n%m%n

日志输出(注意:仅仅有输出info信息  与配置文件设置有关):
2016-01-16-main--INFO-com.qunar.log.PatternLayoutDemo-
this is an info message

8.2 RollingFileAppender

当想要写日志信息转化多个文件要求一样,比如,假设文件大小达到一定的阈值等。
写日志记录信息分成多个文件,必须扩展FileAppender类,并继承其全部属性org.apache.log4j.RollingFileAppender类。

有下面除了已如上所述为 FileAppender 可配置參数:

属性 描写叙述
maxFileSize 默认值是10MB,文件的回滚临界尺寸。
maxBackupIndex 默认值是1。创建的备份文件的数量。

实例:
package com.qunar.log;
 
import org.apache.log4j.Logger;
 
public class PatternLayoutDemo {
// 日志记录器
private static Logger logger = Logger.getLogger(PatternLayoutDemo.class);
public static void main(String[] args) {
for(int i = 0;i < 15;++i){
logger.debug("this is an debug message:" + i);
}//for
}
}

配置文件:
log4j.rootLogger = DEBUG, FILE
 
log4j.appender.FILE=org.apache.log4j.RollingFileAppender
 
# 日志存储位置
log4j.appender.FILE.File=D:/WorkSpace/logs/log.out
 
# 日志回滚最大值
log4j.appender.FILE.MaxFileSize=1KB
 
# 日志文件备份个数
log4j.appender.FILE.MaxBackupIndex=1
 
# 日志布局方式
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
 
# 日志格式
log4j.appender.FILE.layout.conversionPattern=%d{yyyy-MM-dd}-%t-%x-%-p-%-10c-%n%m%n

此演示样例配置说明每一个日志文件的最大值为1KB。

最開始创建日志文件log.out,当超过日志文件最大值时,log.out.1新的日志文件将被创建。同一时候,log.out中的日志转移到log.out.1中(备份文件设置为1)。

log.out日志文件永远写入最新日志。


日志输出:









8.3 DailyRollingFileAppender

假设想它可以按一定的时间频率滚动日志记录文件。以保持日志记录信息的良好记录,就必须它扩展FileAppender类。并继承其全部属性useorg.apache.log4j.DailyRollingFileAppender类。


在DailyRollingFileAppender中能够指定monthly(每月)、 weekly(每周)、daily(每天)、half-daily(每半天)、hourly(每小时)和minutely(每分钟)六个频度。这是通过为 DatePattern选项赋予不同的值来完毕的。

DatePattern选项的有效值为:

DatePattern属性 描写叙述
'.'yyyy-MM 相应monthly(每月)
'.'yyyy-ww 相应weekly(每周)
'.'yyyy-MM-dd 相应daily(每天)
'.'yyyy-MM-dd-a 相应half-daily(每半天)
'.'yyyy-MM-dd-HH 相应hourly(每小时)
'.'yyyy-MM-dd-HH-mm 相应minutely(每分钟)

DatePattern中不用处理的文字要放到单引號(')中,如上面的(.)。假设您对此有疑问能够查阅SimpleDateFormat的文档。DailyRollingFileAppender中使用这个类来处理DatePattern。

日志文件输出结果:


9. 日志输出到数据库中

log4j API提供 org.apache.log4j.jdbc.JDBCAppender 对象,它可以将日志信息在指定的数据库。
属性 含义
driver 设置驱动程序类为指定的字符串。假设没有指定驱动程序类,默觉得sun.jdbc.odbc.JdbcOdbcDriver
url 设置JDBC URL
layout 设置要使用的布局。默认布局org.apache.log4j.PatternLayout
user 数据库username
password 数据库password
sql 指定SQL语句在每次记录事件发生的时间运行。

这可能是INSERT,UPDATE或DELETE

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

数据库设置:
创建存储日志的表:
CREATE TABLE LOGS
(ID VARCHAR(20) NOT NULL,
TIME DATE NOT NULL,
LOGGER VARCHAR(50) NOT NULL,
LEVEL VARCHAR(10) NOT NULL,
MESSAGE VARCHAR(1000) NOT NULL
);


日志配置文件:
log4j.rootLogger = DEBUG, DB
 
log4j.appender.DB=org.apache.log4j.jdbc.JDBCAppender
 
# url链接
log4j.appender.DB.URL=jdbc:mysql://localhost/test
 
# 驱动
log4j.appender.DB.driver=com.mysql.jdbc.Driver
 
# username
log4j.appender.DB.user=root
 
# 密码
log4j.appender.DB.password=root
 
# 日志插入数据库 %d 日期 %C 类名 %p 优先级 %m 日志信息
log4j.appender.DB.sql=INSERT INTO LOGS VALUES('%t','%d{yyyy-MM-dd}','%C','%p','%m')
 
# 日志布局方式
log4j.appender.DB.layout=org.apache.log4j.PatternLayout

程序文件:
package com.qunar.log;
 
import org.apache.log4j.Logger;
 
public class JDBCAppenderDemo {
// 日志记录器
private static Logger logger = Logger.getLogger(JDBCAppenderDemo.class);
public static void main(String[] args) {
for(int i = 0;i < 5;++i){
logger.debug("this is an debug message:" + i);
}//for
}
}

必须加入mysql的驱动jar包:点击打开链接

执行结果:



[Java开发之路](16)学习log4j日志的更多相关文章

  1. Alibaba Java开发手册索引规约学习笔记

    最近一段时间再看阿里巴巴 Java开发手册索引规约,写篇帖子总结一下,索引规约内容如下 为了通用,更为了避免造数据的痛苦,文中所涉及表.数据,均来自于MySQL官网提供的示例库employees,可通 ...

  2. Java web 自动备份数据库和log4j日志

    利用监听自动备份 web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns: ...

  3. 【java开发】数组基本学习

    一维数组 定义:具有相同数据类型的一组数据. 声明:int []a=new int[3];    释义:该数组的数据类型为int型,该数组长度为3,有3个元素 可采用如下方式为元素赋值:a[0]=1; ...

  4. [Java开发之路](8)输入流和输出流

    1. Java流的分类 按流向分: 输入流: 能够从当中读入一个字节序列的对象称作输入流. 输出流: 能够向当中写入一个字节序列的对象称作输出流. 这些字节序列的来源地和目的地能够是文件,并且通常都是 ...

  5. [Java开发之路](7)RandomAccessFile类具体解释

    RandomAccessFile适用于大小已知的记录组成的文件.提供的对文件訪问.既能够读文件.也能够写文件,而且支持随机訪问文件.能够訪问文件的任何位置. 文件里记录的大小不一定都同样.仅仅要我们知 ...

  6. [Java开发之路](9)对象序列化与反序列化

    1. 对象序列化 当你创建对象时.仅仅要你须要.它会一直存在,可是程序终止时,不管何时它都不会继续存在.虽然这样做是很有意义的,可是在某些情况下.假设程序不执行时扔能存在而且保存其信息,那将对我们很实 ...

  7. java开发之多线程需要学习和理解的东西

    40个Java多线程问题总结 http://www.codeceo.com/article/40-java-thread-problems.html

  8. [Java开发之路](23)装箱与拆箱

    1. 简单介绍 大家对基本数据类型都很熟悉.比如 int.float.double.boolean.char 等.基本数据类型是不具备对象的特性,比方基本类型不能调用方法.功能简单. ..,为了让基本 ...

  9. [Java开发之路](6)File类的使用

    1. 构造方法 构造方法 描写叙述 File(String pathname) 通过将给定的路径名字符串转换为抽象路径名来创建一个新的文件实例. File(String parent , String ...

随机推荐

  1. TIME定时器

    一.定时器分类 STM32F1 系列中,除了互联型的产品,共有 8 个定时器,分为基本定时器,通用定时器和高级定时器.基本定时器 TIM6 和 TIM7 是一个 16 位的只能向上计数的定时器,只能定 ...

  2. IDEA使用技巧汇总

    使用IDEA也有一段时间了,今天又看到了一个不错的IDEA视频,觉得对IDEA熟悉得更多了,在这里做下笔记,如下 视频链接:https://www.imooc.com/video/16219 1.下载 ...

  3. BZOJ2020: [Usaco2010 Jan]Buying Feed II

    [传送门:BZOJ2020] 简要题意: 约翰开车回家,遇到了双十一节,那么就顺路买点饲料吧.回家的路程一共有E 公里,这一路上会经过N 家商店,第i 家店里有Fi 吨饲料,售价为每吨Ci 元.约翰打 ...

  4. 1.cocos_helloworld

    在class HelloWorld : public cocos2d::Layer中添加函数 void menuclose(cocos2d::Ref *psender); 实现: void Hello ...

  5. HDU 4359 Easy Tree DP? 组合数学+动归

    题意:定义一种树,每个节点的权值都是20到2n-1,每个权值出现一次,每个节点的左子树的权值和小于右子树,除非只有一个子树.给你n和d,问有n个节点且恰好深度是d的这种树有多少种. 比赛的时候我没有做 ...

  6. POJ 1610 Count the Colors

    Count the Colors Time Limit: 2 Seconds      Memory Limit: 65536 KB Painting some colored segments on ...

  7. ajax的几个面试题

    一.什么是AJAX(请谈一下你对Ajax的认识)AJAX是“Asynchronous JavaScript and XML”的缩写.他是指一种创建交互式网页应用的网页开发技术.Ajax包含下列技术:基 ...

  8. js预编译和函数执行

    javascript 执行过程 1.语法检测(有没有基本的语法错误,例如中文,关键字错误...)2.词法分析(预编译) (1)创建全局GO(global object)对象 (2)对var声明的变量进 ...

  9. element-ui表格控件前端分页方法

    <div id="app"> <el-table :data="tableData.slice((currentPage-1)*pageSize,cur ...

  10. COWRUN

    USACO COWRUN 随机化搜索+双重递归调用 题面描述:给出8*N(<=14)组牌,每次按顺序选择8张,FJ可以选择前4张或者后4张,COW从FJ选出的牌中选择前两张或者后两张,然后COW ...