java logging api_Java Logging API - Tutorial

1.2. 创建一个logger

包 java.util.logging提供了日志的功能,可以使用类似于下面的代码来创建一个logger:

import java.util.logging.Logger;

private final static Logger LOGGER = Logger.getLogger(MyClass.class .getName());

1.3. Level

Log的等级反映了问题的严重程度。Level类用于决定哪些信息被写入到log中。下面是一个按严重程度的降序排列的Log Level:

SEVERE (highest)

WARNING

INFO

CONFIG

FINE

FINER

FINEST

除此之外,您还可以使用OFF或ALL这两个level来关闭log或打开所有log。

下面这行代码是将logger设置为记录INFO级别:

LOGGER.setLevel(Level.INFO);

1.4. Handler

每个logger可以设置多个Handler。

Handler的作用是接收logger的信息,并将其以合适的格式发送到合适的地方。

一个Handler可以用setLevel(Level.OFF)来关闭,用setLevel(...)开启。

JDK提供了几个标准的handler,例如:

ConsoleHandler: 将log信息写到Console

FileHandler: 将log信息写到文件中

超过INFO(包含INFO)的信息将自动被写入到Console中。

1.5. Formatter

每个Handler的输出都可以使用一个formatter来配置

已有的formatter:

SimpleFormatter 将所有的log信息以文本格式编排

XMLFormatter 生成XML格式的log信息

您还可以自定义Formatter,下面的这个示例Formatter可以将log信息用html的格式包装:

package logging;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.logging.Formatter;

import java.util.logging.Handler;

import java.util.logging.Level;

import java.util.logging.LogRecord;

//This custom formatter formats parts of a log record to a single line

class MyHtmlFormatter extends Formatter

{

// This method is called for every log records

public String format(LogRecord rec)

{

StringBuffer buf = new StringBuffer(1000);

// Bold any levels >= WARNING

buf.append("

");

buf.append("

");

if (rec.getLevel().intValue() >= Level.WARNING.intValue())

{

buf.append("");

buf.append(rec.getLevel());

buf.append("");

} else

{

buf.append(rec.getLevel());

}

buf.append("

");

buf.append("

");

buf.append(calcDate(rec.getMillis()));

buf.append(' ');

buf.append(formatMessage(rec));

buf.append('\n');

buf.append("

");

buf.append("

\n");

return buf.toString();

}

private String calcDate(long millisecs)

{

SimpleDateFormat date_format = new SimpleDateFormat("MMM dd,yyyy HH:mm");

Date resultdate = new Date(millisecs);

return date_format.format(resultdate);

}

// This method is called just after the handler using this

// formatter is created

public String getHead(Handler h)

{

return "\n

\n" + (new Date()) + "\n\n\n
\n"

+ "

+ "

TimeLog Message\n";

}

// This method is called just after the handler using this

// formatter is closed

public String getTail(Handler h)

{

return "

\n \n\n";

}

}

1.6. Log Manager

log manager的职责是创建和管理logger,并负责维护log配置。

使用LogManager.setLevel(String name, Level level)方法,我们可以为一个包或一组包设置logging level。例如,我们可以将所有logger的logging

level设为Level.FINE:

LogManager.getLogManager().setLevel("logging", Level.FINE)

1.7. Best Practices

使用被logged的那个类的名称为logger命名是一种很好的方法,这种方法可以使程序员更好地查看日志和管理logger,同时,这也是Logging API推荐的一种方式。

2. 示例

您可以在项目“de.vogella.logger”中找到这个例子:

创建你自己的formatter:

package logging;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.logging.Formatter;

import java.util.logging.Handler;

import java.util.logging.Level;

import java.util.logging.LogRecord;

//This custom formatter formats parts of a log record to a single line

class MyHtmlFormatter extends Formatter

{

// This method is called for every log records

public String format(LogRecord rec)

{

StringBuffer buf = new StringBuffer(1000);

// Bold any levels >= WARNING

buf.append("

");

buf.append("

");

if (rec.getLevel().intValue() >= Level.WARNING.intValue())

{

buf.append("");

buf.append(rec.getLevel());

buf.append("");

} else

{

buf.append(rec.getLevel());

}

buf.append("

");

buf.append("

");

buf.append(calcDate(rec.getMillis()));

buf.append(' ');

buf.append(formatMessage(rec));

buf.append('\n');

buf.append("

");

buf.append("

\n");

return buf.toString();

}

private String calcDate(long millisecs)

{

SimpleDateFormat date_format = new SimpleDateFormat("MMM dd,yyyy HH:mm");

Date resultdate = new Date(millisecs);

return date_format.format(resultdate);

}

// This method is called just after the handler using this

// formatter is created

public String getHead(Handler h)

{

return "\n

\n" + (new Date()) + "\n\n\n
\n"

+ "

+ "

TimeLog Message\n";

}

// This method is called just after the handler using this

// formatter is closed

public String getTail(Handler h)

{

return "

\n \n\n";

}

}初始化logger

package logging;

import java.io.IOException;

import java.util.logging.FileHandler;

import java.util.logging.Formatter;

import java.util.logging.Level;

import java.util.logging.Logger;

import java.util.logging.SimpleFormatter;

public class MyLogger {

static private FileHandler fileTxt;

static private SimpleFormatter formatterTxt;

static private FileHandler fileHTML;

static private Formatter formatterHTML;

static public void setup() throws IOException {

// Create Logger

Logger logger = Logger.getLogger("");

logger.setLevel(Level.INFO);

fileTxt = new FileHandler("Logging.txt");

fileHTML = new FileHandler("Logging.html");

// Create txt Formatter

formatterTxt = new SimpleFormatter();

fileTxt.setFormatter(formatterTxt);

logger.addHandler(fileTxt);

// Create HTML Formatter

formatterHTML = new MyHtmlFormatter();

fileHTML.setFormatter(formatterHTML);

logger.addHandler(fileHTML);

}

}使用logger

package logging;

import java.io.IOException;

import java.util.logging.Level;

import java.util.logging.Logger;

public class UseLogger {

// Always use the classname, this way you can refactor

private final static Logger LOGGER = Logger.getLogger(UseLogger.class

.getName());

public void writeLog() {

// Set the LogLevel to Severe, only severe Messages will be written

LOGGER.setLevel(Level.SEVERE);

LOGGER.severe("Info Log");

LOGGER.warning("Info Log");

LOGGER.info("Info Log");

LOGGER.finest("Really not important");

// Set the LogLevel to Info, severe, warning and info will be written

// Finest is still not written

LOGGER.setLevel(Level.INFO);

LOGGER.severe("Info Log");

LOGGER.warning("Info Log");

LOGGER.info("Info Log");

LOGGER.finest("Really not important");

}

public static void main(String[] args) {

UseLogger logger = new UseLogger();

try {

MyLogger.setup();

} catch (IOException e) {

e.printStackTrace();

throw new RuntimeException("Problems with creating the log files");

}

logger.writeLog();

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值