您的位置:首页 > 编程语言 > Java开发

Java中的日志——Java.util.logging、log4j、commons-logging

2015-10-20 22:40 555 查看
Java中给项目程序添加log主要有三种方式,一使用JDK中的java.util.logging包,一种是log4j,一种是commons-logging。其中log4j和commons-logging都是apache软件基金会的开源项目。这三种方式的区别如下:

Java.util.logging,JDK标准库中的类,是JDK 1.4 版本之后添加的日志记录的功能包。

log4j,最强大的记录日志的方式。可以通过配置 .properties 或是 .xml 的文件, 配置日志的目的地,格式等等。

commons-logging,最综合和常见的日志记录方式,是Java中的一个日志接口,一般会与log4j一起使用。自带SimpleLog可用于日志记录。


1.Java.util.logging

【例1.1】:日志的简单使用

[java] view
plaincopy





package lwf.log.test;

import java.util.logging.Logger;

public class LogTest {

static String strClassName = LogTest.class.getName();

static Logger logger = Logger.getLogger(strClassName);

public static double division(int value1, int value2) {

double result = 0;

try {

result = value1 / value2;

} catch(ArithmeticException e) {

logger.warning("除数不能为0.");

e.printStackTrace();

}

return result;

}

public static void main(String[] args) {

System.out.println(division(5, 0));

}

}

结果:



从这个例子中你会看到控制台上输出了日期时间,类名,方法名和“[warning]除数不能为0.”的信息。

Logger是Java Logging API中的一个类,Logger.getLogger方法创建了一个Logger实例。每一个Logger实例都必须有个名称,通常的做法是使用类名称定义Logger实例。

logger.warning方法用来输出日志信息,除了warning处,还有severe、info等。我们可以把【例1】再改一下,让其输出各种日志信息。

【例1.2】:日志的级别

[java] view
plaincopy





public static double division(int value1, int value2) {

double result = 0;

try {

result = value1 / value2;

} catch(ArithmeticException e) {

logger.severe("[severe]除数不能为0.");

logger.warning("[warning]除数不能为0.");

logger.info("[info]除数不能为0.");

logger.config("[config]除数不能为0.");

logger.fine("[fine]除数不能为0.");

logger.finer("[finer]除数不能为0.");

logger.finest("[finest]除数不能为0.");

e.printStackTrace();

}

return result;

}

结果:



Java Logging API提供了七个日志级别用来控制输出。这七个级别分别是:
级别
SEVERE
WARNING
INFO
CONFIG
FINE
FINER
FINEST
调用方法
severe()
warning()
info()
config()
fine()
finer()
finest()
含意
严重
警告
信息
配置
良好
较好
最好
但在上面的例子中我们可以看到只输出了SEVERE、WARNING、INFO三个等级的日志,并没有如我们相像中的好样输出各个级别的日志信息。这是因为默认日志输出级别的设置是info,也就是说只有info或它以上的级别被输出,它以下的级别不被输出。那如何修改这个设置呢?

日志(Log)的配制:

1.代码设置

使用setLevel();但这种方式不能改变console的级别,只能改变输出到文件的日志的级别。

2.修改logging.properties

默认的外部配置文件 是JRE中lib/logging.properties文件。你可以打开这个文件,修改以下两行为:
.level=ALL

//...

java.util.logging.ConsoleHandler.level = ALL
这种方式会影响jre下所有用户。

为了不影响到所有的用户,我们还可以通过LogManager的readConfiguration(InputStream ins)读取指定的配制文件。

【例1.3】:LogManager管理日志

[java] view
plaincopy





package lwf.log.test;

import java.io.IOException;

import java.io.InputStream;

import java.util.logging.FileHandler;

import java.util.logging.Handler;

import java.util.logging.Level;

import java.util.logging.LogManager;

import java.util.logging.LogRecord;

import java.util.logging.Logger;

import java.util.logging.SimpleFormatter;

public class LogTest {

static String strClassName = LogTest.class.getName();

static Logger logger = Logger.getLogger(strClassName);

static LogManager logManager = LogManager.getLogManager();

static {

InputStream inputStream = null;

try {

//读取配制文件

inputStream = LogTest.class.getClassLoader().getResourceAsStream("log.properties");

logManager.readConfiguration(inputStream);

//添加Logger

logManager.addLogger(logger);

} catch (SecurityException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

public static double division(int value1, int value2) {

double result = 0;

try {

result = value1 / value2;

} catch(ArithmeticException e) {

logger.severe("[severe]除数不能为0.");

logger.warning("[warning]除数不能为0.");

logger.info("[info]除数不能为0.");

logger.config("[config]除数不能为0.");

logger.fine("[fine]除数不能为0.");

logger.finer("[finer]除数不能为0.");

logger.finest("[finest]除数不能为0.");

e.printStackTrace();

}

return result;

}

public static void main(String[] args) {

System.out.println(division(5, 0));

}

}

log.properties:
# "handlers" specifies a comma separated list of log Handler

#handlers= java.util.logging.ConsoleHandler

handlers= java.util.logging.FileHandler

# Default logging level.

.level= CONFIG

# default file output is in "E:\Test" directory.

java.util.logging.FileHandler.pattern = E:/Test/Log%u.log

java.util.logging.FileHandler.limit = 50000

java.util.logging.FileHandler.count = 1

java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter

# Limit the message that are printed on the console to CONFIG and above.

java.util.logging.ConsoleHandler.level = CONFIG

java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

# Facility specific properties.Provides extra control for each logger.

# For example, set the com.xyz.foo logger to only log SEVERE messages:

com.xyz.foo.level = SEVERE
这样,用户就可以自己定义配制文件了。在E:\Test下可以看到输出的日志文件Log0.log

java.util.logging包中类的关系图如下:



参考文章:

/article/2661795.html


2.log4j

1.项目串导入log4j的jar包

如Eclipse下项目名右键,Build Path\Add Libraries,添加一组用户自己的jar包。项目结构如下:



2.修改log4j的配制文件,设置日志输出的级别、格式等

log4j的log有5个级别:FATAL(严重的 )、ERROR(错误 )、WARN(警告)、INFO(信息)、DEBUG(调试 )。

3.在项目代码中适当添加日志。

【例2.1】

log4j.properties:
#set log level: show debug, info, error

log4j.rootLogger=DEBUG, A1

# A1 is set to be a ConsoleAppender which outputs to System.out.

#log4j.appender.A1=org.apache.log4j.ConsoleAppender

log4j.appender.A1=org.apache.log4j.FileAppender

# A1 uses PatternLayout.

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

#out

log4j.appender.A1.File=E:/test/log4j.log

# set log output format's style

log4j.appender.A1.layout=org.apache.log4j.TTC
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: