jdk logging解析
来源:互联网 发布:mac 腾讯vip视频缓存 编辑:程序博客网 时间:2024/06/02 13:27
Logger 日志处理主类,是Api入口
LoggerManager 日志管理器,Logger的工厂类,进行初始化Logger,Handler,Formatter等
Handler
将日志信息记录到指定的流之中,可能是控制台或者是一个文件或者是任意存储区域。
常用实现类 ConsoleHandler, FileHandler, SocketHandler,一个Logger可以有多个handler
Formatter 日志信息格式化类。常用实现类 SimpleFormatter, XMLFormatter,可以自定义类,每个handler都可以持有一个formatter,默认ConsoleHandler使用SimpleFormatter,而FileHandler使用XMLFormatter
Level
日志记录级别。
SEVERE(最高值) 、WARNING 、INFO 、CONFIG 、FINE 、FINER 、FINEST(最低值)
ALL(记录所有信息) OFF(不记录任何级别信息)
Filter
过滤器,不同与日志级别,用于确定是否处理日志,,每个handler都可以持有一个filter,Logger会全局持有一个filter
LogRecord
日志内容的封装类
jdk logging默认的配置文件是JRE_HOME/lib/logging.properties
############################################################
# Default Logging Configuration File
#
# You can use a different file by specifying a filename
# with the java.util.logging.config.file system property.
# For example java -Djava.util.logging.config.file=myfile
############################################################
############################################################
# Global properties
############################################################
# "handlers" specifies a comma separated list of log Handler
# classes. These handlers will be installed during VM startup.
# Note that these classes must be on the system classpath.
# By default we only configure a ConsoleHandler, which will only
# show messages at the INFO and above levels.
handlers= java.util.logging.ConsoleHandler
# To also add the FileHandler, use the following line instead.
#handlers= java.util.logging.FileHandler, java.util.logging.ConsoleHandler
# Default global logging level.
# This specifies which kinds of events are logged across
# all loggers. For any given facility this global level
# can be overriden by a facility specific level
# Note that the ConsoleHandler also has a separate level
# setting to limit messages printed to the console.
.level= INFO
############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################
# default file output is in user's home directory.
java.util.logging.FileHandler.pattern = %h/java%u.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter
# Limit the message that are printed on the console to INFO and above.
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
# Example to customize the SimpleFormatter output format
# to print one-line log message like this:
# <level>: <log message> [<date/time>]
#
# java.util.logging.SimpleFormatter.format=%4$s: %5$s [%1$tc]%n
############################################################
# 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
可以看到默认只是开启了ConsoleHandler,
可以自定义配置文件,handler和formatter:
下面代码演示从新的配置文件加载文件,并添加自己的handler\
配置文件:
#Level的五个等级SEVERE(最高值) 、WARNING 、INFO 、CONFIG 、FINE 、FINER 、FINEST(最低值) 。这个不同于log4j
#指定默认logger级别
.level= ALL
#为 Handler 指定默认的级别(默认为 Level.INFO)。
java.util.logging.ConsoleHandler.level=INFO
# 指定要使用的 Formatter 类的名称(默认为 java.util.logging.SimpleFormatter)。
java.util.logging.ConsoleHandler.formatter=com.hx.log.jdk.custom.MySimpleFormatter
# 为 Handler 指定默认的级别(默认为 Level.ALL)。
java.util.logging.FileHandler.level=INFO
# 指定要使用的 Formatter 类的名称(默认为 java.util.logging.XMLFormatter)。
java.util.logging.FileHandler.formatter=java.util.logging.XMLFormatter
# 指定要写入到任意文件的近似最大量(以字节为单位)。如果该数为 0,则没有限制(默认为无限制)。
java.util.logging.FileHandler.limit=1024000
# 指定有多少输出文件参与循环(默认为 1)。
java.util.logging.FileHandler.count=1
# 为生成的输出文件名称指定一个模式。有关细节请参见以下内容(默认为 "%h/java%u.log")。
java.util.logging.FileHandler.pattern=u.xml
# 指定是否应该将 FileHandler 追加到任何现有文件上(默认为 false)。
java.util.logging.FileHandler.append=true
handlers= java.util.logging.ConsoleHandler,java.util.logging.FileHandler
package com.hx.log.jdk.custom;
import java.io.IOException;
import java.io.InputStream;
import java.util.logging.*;
public class MyLogManager {
public static void resetFromPropertyFile(String filePath) {
LogManager logManager = LogManager.getLogManager();
logManager.reset();
InputStream inputStream = MyLogManager.class.getClassLoader().getResourceAsStream(filePath);
try {
logManager.readConfiguration(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
public static Logger getLogger(String name) {
Logger logger = Logger.getLogger(name);
logger.setLevel(Level.ALL);
for (Handler handler : logger.getHandlers()) {
logger.removeHandler(handler);
}
// add console handler
ConsoleHandler consoleHandler = new ConsoleHandler();
consoleHandler.setLevel(Level.INFO);
consoleHandler.setFormatter(new MySimpleFormatter());
consoleHandler.setFilter(new Filter() {
@Override
public boolean isLoggable(LogRecord record) {
return true;
}
});
logger.addHandler(consoleHandler);
// add file handler
FileHandler fileHandler;
try {
fileHandler = new FileHandler("file.log", true);
fileHandler.setLevel(Level.INFO);
fileHandler.setFormatter(new MySimpleFormatter());
logger.addHandler(fileHandler);
} catch (SecurityException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// add default stream handler
MyStreamHandler defaultStreamHandler = new MyStreamHandler();
defaultStreamHandler.setLevel(Level.INFO);
defaultStreamHandler.setFormatter(new MySimpleFormatter());
defaultStreamHandler.setOutputStream(System.out);
logger.addHandler(defaultStreamHandler);
return logger;
}
}
MySimpleFormatter.java:
package com.hx.log.jdk.custom;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.SimpleFormatter;
public class MySimpleFormatter extends SimpleFormatter {
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Override
public synchronized String format(LogRecord record) {
StringBuilder sb = new StringBuilder();
Level level = record.getLevel();
String time = sdf.format(new Date(record.getMillis()));
String loggerName = record.getLoggerName();
String message = record.getMessage();
sb.append("[").append(level).append("]");
sb.append(" ").append(time);
sb.append(" ").append(loggerName);
sb.append(" :").append(message);
sb.append("\n");
return sb.toString();
}
}
MyStreamHandler.java:
package com.hx.log.jdk.custom;
import java.io.OutputStream;
import java.util.logging.StreamHandler;
public class MyStreamHandler extends StreamHandler {
@Override
public synchronized void setOutputStream(OutputStream out)
throws SecurityException {
super.setOutputStream(out);
}
}
Test.java:
package com.hx.log.jdk.custom;
/**
* Created by hx on 17-1-7.
*/
import junit.framework.TestCase;
import java.io.IOException;
import java.util.logging.Filter;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
public class Test extends TestCase{
public void testDefault(){
Logger logger=Logger.getLogger(Test.class.getName());//使用默认的配置
logger.setFilter(new Filter() {
@Override
public boolean isLoggable(LogRecord record) {
return true;
}
});
logger.info(" test!");
}
public void testMy() throws SecurityException, IOException {
MyLogManager.resetFromPropertyFile("log/jdk/logging.properties");
Logger logger=MyLogManager.getLogger(Test.class.getName());
logger.setFilter(new Filter() {
@Override
public boolean isLoggable(LogRecord record) {
return true;
}
});
logger.info(" test!");
}
}
使用方法testdefault,只是在控制台打印信息:ConsoleHandler(System.err)
使用方法testMy测试,会输出到五个目的地,包括自定义配置文件的ConsoleHandler(System.err),FileHandler(u.xml文件)和
MyLoggerManager中添加的ConsoleHandler(System.err),FileHandler(file.log)和MyStreamHandler(System.out)
LoggerManager 日志管理器,Logger的工厂类,进行初始化Logger,Handler,Formatter等
Handler
将日志信息记录到指定的流之中,可能是控制台或者是一个文件或者是任意存储区域。
常用实现类 ConsoleHandler, FileHandler, SocketHandler,一个Logger可以有多个handler
Formatter 日志信息格式化类。常用实现类 SimpleFormatter, XMLFormatter,可以自定义类,每个handler都可以持有一个formatter,默认ConsoleHandler使用SimpleFormatter,而FileHandler使用XMLFormatter
Level
日志记录级别。
SEVERE(最高值) 、WARNING 、INFO 、CONFIG 、FINE 、FINER 、FINEST(最低值)
ALL(记录所有信息) OFF(不记录任何级别信息)
Filter
过滤器,不同与日志级别,用于确定是否处理日志,,每个handler都可以持有一个filter,Logger会全局持有一个filter
LogRecord
日志内容的封装类
jdk logging默认的配置文件是JRE_HOME/lib/logging.properties
############################################################
# Default Logging Configuration File
#
# You can use a different file by specifying a filename
# with the java.util.logging.config.file system property.
# For example java -Djava.util.logging.config.file=myfile
############################################################
############################################################
# Global properties
############################################################
# "handlers" specifies a comma separated list of log Handler
# classes. These handlers will be installed during VM startup.
# Note that these classes must be on the system classpath.
# By default we only configure a ConsoleHandler, which will only
# show messages at the INFO and above levels.
handlers= java.util.logging.ConsoleHandler
# To also add the FileHandler, use the following line instead.
#handlers= java.util.logging.FileHandler, java.util.logging.ConsoleHandler
# Default global logging level.
# This specifies which kinds of events are logged across
# all loggers. For any given facility this global level
# can be overriden by a facility specific level
# Note that the ConsoleHandler also has a separate level
# setting to limit messages printed to the console.
.level= INFO
############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################
# default file output is in user's home directory.
java.util.logging.FileHandler.pattern = %h/java%u.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter
# Limit the message that are printed on the console to INFO and above.
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
# Example to customize the SimpleFormatter output format
# to print one-line log message like this:
# <level>: <log message> [<date/time>]
#
# java.util.logging.SimpleFormatter.format=%4$s: %5$s [%1$tc]%n
############################################################
# 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
可以看到默认只是开启了ConsoleHandler,
可以自定义配置文件,handler和formatter:
下面代码演示从新的配置文件加载文件,并添加自己的handler\
配置文件:
#Level的五个等级SEVERE(最高值) 、WARNING 、INFO 、CONFIG 、FINE 、FINER 、FINEST(最低值) 。这个不同于log4j
#指定默认logger级别
.level= ALL
#为 Handler 指定默认的级别(默认为 Level.INFO)。
java.util.logging.ConsoleHandler.level=INFO
# 指定要使用的 Formatter 类的名称(默认为 java.util.logging.SimpleFormatter)。
java.util.logging.ConsoleHandler.formatter=com.hx.log.jdk.custom.MySimpleFormatter
# 为 Handler 指定默认的级别(默认为 Level.ALL)。
java.util.logging.FileHandler.level=INFO
# 指定要使用的 Formatter 类的名称(默认为 java.util.logging.XMLFormatter)。
java.util.logging.FileHandler.formatter=java.util.logging.XMLFormatter
# 指定要写入到任意文件的近似最大量(以字节为单位)。如果该数为 0,则没有限制(默认为无限制)。
java.util.logging.FileHandler.limit=1024000
# 指定有多少输出文件参与循环(默认为 1)。
java.util.logging.FileHandler.count=1
# 为生成的输出文件名称指定一个模式。有关细节请参见以下内容(默认为 "%h/java%u.log")。
java.util.logging.FileHandler.pattern=u.xml
# 指定是否应该将 FileHandler 追加到任何现有文件上(默认为 false)。
java.util.logging.FileHandler.append=true
handlers= java.util.logging.ConsoleHandler,java.util.logging.FileHandler
MyLogManager.java:
package com.hx.log.jdk.custom;
import java.io.IOException;
import java.io.InputStream;
import java.util.logging.*;
public class MyLogManager {
public static void resetFromPropertyFile(String filePath) {
LogManager logManager = LogManager.getLogManager();
logManager.reset();
InputStream inputStream = MyLogManager.class.getClassLoader().getResourceAsStream(filePath);
try {
logManager.readConfiguration(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
public static Logger getLogger(String name) {
Logger logger = Logger.getLogger(name);
logger.setLevel(Level.ALL);
for (Handler handler : logger.getHandlers()) {
logger.removeHandler(handler);
}
// add console handler
ConsoleHandler consoleHandler = new ConsoleHandler();
consoleHandler.setLevel(Level.INFO);
consoleHandler.setFormatter(new MySimpleFormatter());
consoleHandler.setFilter(new Filter() {
@Override
public boolean isLoggable(LogRecord record) {
return true;
}
});
logger.addHandler(consoleHandler);
// add file handler
FileHandler fileHandler;
try {
fileHandler = new FileHandler("file.log", true);
fileHandler.setLevel(Level.INFO);
fileHandler.setFormatter(new MySimpleFormatter());
logger.addHandler(fileHandler);
} catch (SecurityException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// add default stream handler
MyStreamHandler defaultStreamHandler = new MyStreamHandler();
defaultStreamHandler.setLevel(Level.INFO);
defaultStreamHandler.setFormatter(new MySimpleFormatter());
defaultStreamHandler.setOutputStream(System.out);
logger.addHandler(defaultStreamHandler);
return logger;
}
}
MySimpleFormatter.java:
package com.hx.log.jdk.custom;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.SimpleFormatter;
public class MySimpleFormatter extends SimpleFormatter {
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Override
public synchronized String format(LogRecord record) {
StringBuilder sb = new StringBuilder();
Level level = record.getLevel();
String time = sdf.format(new Date(record.getMillis()));
String loggerName = record.getLoggerName();
String message = record.getMessage();
sb.append("[").append(level).append("]");
sb.append(" ").append(time);
sb.append(" ").append(loggerName);
sb.append(" :").append(message);
sb.append("\n");
return sb.toString();
}
}
MyStreamHandler.java:
package com.hx.log.jdk.custom;
import java.io.OutputStream;
import java.util.logging.StreamHandler;
public class MyStreamHandler extends StreamHandler {
@Override
public synchronized void setOutputStream(OutputStream out)
throws SecurityException {
super.setOutputStream(out);
}
}
Test.java:
package com.hx.log.jdk.custom;
/**
* Created by hx on 17-1-7.
*/
import junit.framework.TestCase;
import java.io.IOException;
import java.util.logging.Filter;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
public class Test extends TestCase{
public void testDefault(){
Logger logger=Logger.getLogger(Test.class.getName());//使用默认的配置
logger.setFilter(new Filter() {
@Override
public boolean isLoggable(LogRecord record) {
return true;
}
});
logger.info(" test!");
}
public void testMy() throws SecurityException, IOException {
MyLogManager.resetFromPropertyFile("log/jdk/logging.properties");
Logger logger=MyLogManager.getLogger(Test.class.getName());
logger.setFilter(new Filter() {
@Override
public boolean isLoggable(LogRecord record) {
return true;
}
});
logger.info(" test!");
}
}
使用方法testdefault,只是在控制台打印信息:ConsoleHandler(System.err)
使用方法testMy测试,会输出到五个目的地,包括自定义配置文件的ConsoleHandler(System.err),FileHandler(u.xml文件)和
MyLoggerManager中添加的ConsoleHandler(System.err),FileHandler(file.log)和MyStreamHandler(System.out)
0 0
- jdk logging解析
- 探究JDK-logging
- JDK Logging深入分析
- jdk中的logging
- JDK Logging 深入分析
- 深入源码之JDK Logging
- JDK Logging模块深入分析
- common-logging源码解析
- common-logging源码解析
- log4j,log4j2,slf4j,common-logging,jdk-logging集成以及切换
- log4j1,commons-logging,jdk-logging快速切换slf4j工具
- java.util.logging源码解析
- JDK提供的日志API--------Logging(初识)
- JDK自带的日志Logging
- JDK中logging包中的类
- JDK解析
- JDK解析
- Logging
- 【JZOJ3987】Tree 题解
- Mac下Eclipse连接不上Android手机的解决方法
- [React-Native]常用组件
- Android开发之SQLite详解
- JVM调优总结系列之七:调优方法
- jdk logging解析
- 用maven创建spring的hello工程
- 23种设计模式:观察者模式
- 开灯问题
- 深入理解线程带来的风险
- No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK
- Spring-MyBatis整合简单例子及个人的经验杂谈
- 移动最小二乘法(MLS)曲线曲面拟合C++代码实现
- UML五类图