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();

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/273129.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

内存查看工具RAMMAP说明

参考 Technet Process Private: 分配给单一Process专用的内存 Mapped File: 用来储放档案内容快取(Cache)的内存空间 Shared Memory: 标注给多个Process共用的内存分页(Page,内存管理单位) Page Table: 用来描述虚拟内存位址的分页表(裡面是一笔一笔的PTE&…

php接口和java接口_java和php接口的区别是什么

java和php接口的区别是:1、php接口中的抽象方法只能是public的,默认也是public权限;2、java中私有方法使用private修饰,供接口中的默认方法或者静态方法调用。【相关学习推荐:php编程(视频)】php:规范:接口…

成都优步uber司机第四组奖励政策

万能的优步成都团队放出了优步司机第四组,一二三组奖励已经骤降,在月末放出第四组车主档,这是要让一切归于平静的节奏么!!! 滴滴快车单单2.5倍,注册地址:http://www.udache.com/如何…

java hql多条件查询_使用hql语句怎样实现多条件查询

展开全部这里只写了DAO和业务62616964757a686964616fe59b9ee7ad9431333264623331逻辑组件、ACTION的具体实现类,PO和和接口自己应该会写吧,HQL采用的是结合SQL的那种写法,增删改查全在里面了,修改下马上就能跑了,不清楚…

BZOJ 1008 [HNOI2008]越狱

1008: [HNOI2008]越狱 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 5166 Solved: 2242[Submit][Status][Discuss]Description 监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种。如果相邻房间…

android mysql开发工具_Android开发工具--adb的使用

adb(Android Debug Bridge)是Android提供的一个通用的调试工具,借助这个工具,我们可以管理设备或手机模拟器的状态。还可以进行以下的操作:1、快速更新设备或手机模拟器中的代码,如应用或Android系统升级;2、在设备上运…

java headless_使用Chrome Headless 快速实现java版数据的抓取

Java: cdp4j - Java library for CDP,使用这个类库实现。maven引入:io.webfoldercdp4j1.1.0官方例子:import io.webfolder.cdp.Launcher;import io.webfolder.cdp.session.Session;import io.webfolder.cdp.session.SessionFactory;public class HelloWo…

闪回数据库

Flashbacking a database means going back to a previous database state.闪回数据库到之前数据库的状态The Flashback Database feature provides a way to quickly revert entire Oracle database to the state it was in at a past point in time. 闪回数据库特性提供了一种…

Ruby on Rails Tutorial 第六章 用户模型

1、用户模型(1)数据库迁移Rails默认使用关系数据库存储数据,数据库中的表有数据行组成,每一行都有相应的列,对应数据属性。把列名命名为相应的名字后,ActiveRecord会自动把他们识别为用户对象的属性。 $ ra…

java dcl 失效解决_DCL失效原因和解决方案

Java内存模型 在了解Java的同步秘密之前,先来看看JMM(Java Memory Model)。Java被设计为跨平台的语言,在内存管理上,显然也要有一个统一的模型。而且Java语言最大的特点就是废除了指针,把程序员从痛苦中解脱出来,不…

李宁-2015年7月13日-个人文档

姓名 李宁 日期 2015年7月13日 主要工作及心得 由于我负责服务器端的编写工作,而各部分的客户端的操作都要与服务器端通信,所以在今天的调试中,我贯穿于各部分模块的调试和检测,主要负责在出现问题…

java.net.unknown_android -------- java.net.UnknownServiceException

最近升级了Android的API版本时 ,导致我的网络请求失败了,出现了这个错误 java.net.UnknownServiceException,这个错误,我在网上查到这个主要是由于,我们的OkHttp3会默认使用密文传输,而我们的代码中使用Htt…

无忧开通了博客园博客主页

无忧开通了博客园博客主页,今后在这里安家了。 分享一点工作经验和学习心得,有事没事常来看看。另一个独立博客www.wuyouseo.com 转载于:https://www.cnblogs.com/wuyoublog/p/4646481.html

pythonif语句的多分支使用_Python多分支if语句的使用

注意:if语句代码是从上往下执行的,当执行到满足条件的语句时,代码会停止往下执行注意:if语句后面要加上冒号score int (input("score:"))if score > 90:print("A")elif score > 80:print(&…

Visual Studio下Qt调用IDL

一.简单介绍: 1.ActiveQt包含QAxContainer和QAxServer组件。 1) QAxContainer允许使用COM对象,并且可以将ActiveX控件嵌入到Qt程序中去。 QAxContainer是有三个类组成的。分别是: QAxObject封装了COM对象 QAxWidget封装了ActiveX控…

安装java过程_Java的安装过程

记录一下自己在Windowns下安装java的过程打开网址后要先登录,如果没有号就先注册,然后才能下载step1:下载JDK(1)将鼠标指向download,会出现如下界面:(2)点击左上角PopularDownloads下的 Java for Developers进入如下界面&#xff…

HDU2571

早期昨晚,跪,体倦,简直太CF该。早上起来刷标题。Then,写python,shell,一天后基础。 标题或标题中国~!思维:本主题开始寻找一个dfs,但是,这个矩阵外观似太大,d…

dockerfile源码安装mysql_docker容器详解五: dockerfile实现tomcat环境以及源码安装mysql...

tomcat上一节讲到了dockerfile的基础,这一次咱们来作一个小的练习首先要了解tomcat安装的整个过程首先搭建 jdk环境:下载jdk包,解压以后添加环境变量而后搭建tomcat:下载tomcat包,解压,修改配置文件到一个工…

pom.xml的配置详解

<!--可以免费转载&#xff0c;转载时请注明出处 http://pengqb.iteye.com 。--><project xmlns"http://maven.apache.org/POM/4.0.0 " xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance " xsi:schemaLocation"http://maven.apache.or…

azkaban 与 java任务_azkaban任务报错java.lang.RuntimeException: The root scratch dir: /tmp/hive...

azkaban运行任务的时候失败报错如下&#xff1a;23-03-2016 08:16:14 CST analyzer-kafka2hdfs_new ERROR - Exception in thread "main" org.apache.hive.service.cli.HiveSQLException: java.lang.RuntimeException: The root scratch dir: /tmp/hive on HDFS shou…