`
SunnyYoona
  • 浏览: 365050 次
社区版块
存档分类
最新评论

[Java开发之路](16)学习log4j日志

阅读更多
1. 新建一个Java工程,导入Jar包(log4j-1.2.17.jar)
1.png


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-1320:55:05,622method:com.qunar.sjf.ImportMost.main(ImportMost.java:10)
Thisisadebug
[INFO]2016-01-1320:55:05,627method:com.qunar.sjf.ImportMost.main(ImportMost.java:12)
Thisisainfo
[ERROR]2016-01-1320:55:05,628method:com.qunar.sjf.ImportMost.main(ImportMost.java:14)
Thisisaerror

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-1321:36:37,967method:com.qunar.sjf.ImportMost.main(ImportMost.java:15)
WarnMessage!
[ERROR]2016-01-1321:36:37,967method:com.qunar.sjf.ImportMost.main(ImportMost.java:16)
ErrorMessage!
[FATAL]2016-01-1321:36:37,967method:com.qunar.sjf.ImportMost.main(ImportMost.java:17)
FatalMessage!

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.1HTMLLayout

如果想生成一个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) 设置日志事件的位置信息(所在目录,所在行数等)。
voidsetTitle(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.2PatternLayout

如果您希望基于某种模式生成特定格式的日志信息,可使用 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.1FileAppender

日志记录到文件中,主要用到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.2RollingFileAppender

当想要写日志信息转化多个文件要求一样,例如,如果文件大小达到一定的阈值等。
写日志记录信息分成多个文件,必须扩展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.3DailyRollingFileAppender

如果想它能够按一定的时间频率滚动日志记录文件,以保持日志记录信息的良好记录,就必须它扩展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 数据库用户名
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
);
2.png

日志配置文件:
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
# 用户名
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包:点击打开链接

运行结果:
QQ截图20160121151223.png





分享到:
评论

相关推荐

    Java Log4j所需Jar包

    Java Log4j 1,2 所需Jar包,一个完整的软件,日志是必不可少的。程序从开发、测试、维护、运行等环节,都需 要向控制台或文件等位置输出大量信息。这些信息的输出,在很多时候是使用 System.out.println()无法完成的。 ...

    Log4j日志根据模块不同输出到不同的日志文件开发配置,便于监控项目各功能模块的运行情况

    文件中内容包括模块中某个类单独输出到一个日志文件中、模块中某个package单独输出到一个日志文件中、同一模块不同package输出到一个日志文件中三种情况下log4j.properties配置项配置事例、Java类中代码如何一致编写...

    log4j.properties

    java开发中 log4j的基本配置,实现日志的记录 java开发中 log4j的基本配置,实现日志的记录

    log4j.jar_java开发包

    在导入log4j.jar包之后即可在java代码中使用log4j提供的api使用其响应功能

    使用Log4j进行日志操作

    在强调可重用组件开发的今天,除了自己从头到尾开发一个可重用的日志操作类外,Apache为我们提供了一个强有力的日志操作包-Log4j。 Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的...

    Java与log4j2整合mongoDB需要的jar包

    Java编程语言开发时,利用log4j2将日志输出到mongoDB中存储,整合以上功能时所需的jar包

    使用Log4j进行日志操作.zip_java 操作日志_java 日志_log4j_系统日志

    使用Log4j进行日志操作,LOG4J是记录日志文件的强大工具,非常方便较大系统的开发。

    log4j开发jar包

    java开发技术相关,日志必备资源包log4j的2个jar包:log4j-1.2.15.jar、log4j-1.2.11.jar 。

    log4J-1.2.17.zip

    在强调可重用组件开发的今天,除了自己从头到尾开发一个可重用的日志操作类外,Apache为我们提供了一个强有力的日志操作包-Log4j。 Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的...

    log4j的基础知识

    在强调可重用组件开发的今天,除了自己从头到尾开发一个可重用的日志操作类外,Apache为我们提供了一个强有力的日志操作包-Log4j。  官方站点:http://logging.apache.org/log4j/  此外,通过Log4j其他语言接口...

    java log4j.jar日志工具

    java log4j.jar日志工具,满足大多数人的日志开发要求

    log4j-2.17.1的jar包,导入即可使用

    log4j的jar包,用于代码开发,记录日志等

    log4j配置过程及配置讲解

    在强调可重用组件开发的今天,除了自己从头到尾开发一个可重用的日志操作类外,Apache为我们提供了一个强有力的日志操作包-Log4j。  官方站点:http://logging.apache.org/log4j/  此外,通过Log4j其他语言接口...

    重写log4j路径.rar

    重写Log4j中的日志名称。 在日志名称中增加进程id和启动的时间 (可自定义 更改Log4jRollingFileAppender.java就可以了) 例子 原日志名称:demo.log 更改后:demo_4740_20210824-212203.log 有疑问可加QQ:1148831243

    log4j2.xml

    使用log4j2.xml实现对日志的精准控制,对整个开发过程百利有之!但是也要也要注意使用的误区,具体可才看本博客下的Java异常和日志管理!

    Log4j学习和详细配置

    Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是...

    Apache的Log4J日志管理类库jar包

    java后台开发常用的类库jar包,为了方便大家查找下载,免去网上到处乱找

    log4j-core.jar的日志核心包

    log4j-core.jar是Apache Log4j的核心日志包之一,它提供了日志记录的核心功能,可以帮助开发人员在应用程序中实现灵活、高效的日志记录。以下是log4j-core.jar的详细介绍: 1.日志级别:log4j-core.jar支持多种日志...

    apache-log4j-2.9.1-bin

    apache-log4j-2.9.1-bin log4j日志,java开发必备工具

    log4jjava开发日志工具包

    java开发常用的日志工具类 log4j 包含了两个版本1.2.11 和1.2.14

Global site tag (gtag.js) - Google Analytics