一、日志
1. 日志API简介
public static void main(String[] args) throws IOException {
Logger logger = Logger.getLogger(Main.class.getName());
logger.setLevel(Level.FINE);
for (Handler handler : logger.getParent().getHandlers()) {
handler.setLevel(Level.FINE);
}
//日志信息要经过Logger和Handler的同时过滤,所以要同时设置Logger和Handler的level才能输出日志
logger.log(Level.WARNING, "WARNING");
logger.log(Level.INFO, "INFO");
logger.log(Level.CONFIG, "CONFIG");
logger.log(Level.FINE, "FINE");
}
- 如果客户端调用了logger的log方法,首先会根据Level过滤信息,在看看Logger有无设定Filter接口的实例,如果有且其isLoggable()返回true,才会调用Handler实例的publish()方法,Handler也可以设定自己的Filter实例,如果有且其isLoggable()返回true,就调用Formatter实例的format()方法格式化信息,最后才调用输出对象,将格式化后的信息输出。
- 简单来说,Logger是记录信息的起点,要输出的信息必须先经过Logger的Level与Filter过滤,再通过Handler的Level与Filter过滤,格式化信息的动作交给Formatter,输出信息的动作实际上是Handler负责
2. 指定日志层级
logger.setLevel(Level.FINE);
for (Handler handler : logger.getParent().getHandlers()) {
handler.setLevel(Level.FINE);
}
3. 使用Handler与Formatter
public static void main(String[] args) throws IOException {
Logger logger = Logger.getLogger(Main.class.getName());
logger.setLevel(Level.CONFIG);
//%h表示用户根目录 C:\Users\username
//%t表示系统暂存目录 %g表示按照序号递增log文件
Handler handler = new FileHandler("%h/config%g.log");
handler.setLevel(Level.CONFIG);
logger.addHandler(handler);
logger.log(Level.WARNING, "WARNING");
logger.log(Level.INFO, "INFO");
logger.log(Level.CONFIG, "CONFIG");
logger.log(Level.FINE, "FINE");
}
- FileHandler默认的Formatter是XMLFormatter,所以输出的文件为xml格式的
- 可以通过handler的setFormatter()方法设定Formatter
- 如果不想让父Logger的Handler处理日志,可以调用Logger实例的setUseParentHandler()为false
- handler setEncoding()可以设置文字编码
4. 自定义Handler、Formatter、与Filter
package com.leo;
import java.util.logging.Handler;
import java.util.logging.LogRecord;
/** * @ClassName: CustomHandler * @Author: Leo * @Description: * @Date: 8/6/2019 2:55 PM */
public class CustomHandler extends Handler {
@Override
public void publish(LogRecord record) {
if (isLoggable(record)) {
return;
}
String longMsg = getFormatter().format(record);
//输出到控制台 这里可以自定义目的地
System.out.println(longMsg);
}
@Override
public void flush() {
//出清信息
}
@Override
public void close() throws SecurityException {
//关闭输出对象
}
}
public static void main(String[] args) throws IOException {
Logger logger = Logger.getLogger(Main.class.getName());
logger.setLevel(Level.CONFIG);
//%h表示用户根目录 C:\Users\username
//%t表示系统暂存目录 %g表示按照序号递增log文件
Handler handler = new FileHandler("%h/config%g.log");
handler.setLevel(Level.CONFIG);
logger.addHandler(handler);
logger.log(Level.WARNING, "WARNING");
logger.log(Level.INFO, "INFO");
logger.log(Level.CONFIG, "CONFIG");
logger.log(Level.FINE, "FINE");
handler.setFormatter(new Formatter() {
@Override
public String format(LogRecord record) {
return "日志来自:" + record.getSourceClassName();
}
});
}
5. 使用logging.properties
- 在jdk的conf文件夹中,有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
# Default number of locks FileHandler can obtain synchronously.
# This specifies maximum number of attempts to obtain lock file by FileHandler
# implemented by incrementing the unique field %u as per FileHandler API documentation.
java.util.logging.FileHandler.maxLocks = 100
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
- 修改此配置文件,然后放到项目的classpath中,通常为resources文件夹,然后在启动jvm的时候添加参数:
- -Djava.util.logging.config.file=logging.properties
二、国际化
internationalization 简称i18n(因为i到n之间有18个字母)
地区(Locale)
资源包(Resource bundle)
基础名称(Base Name)
三、正则表达式
API:https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/util/regex/Pattern.html
- 字面意义字符
字符 | 说明 |
---|---|
\ | 反斜杠字符 |
\0ñ | 八进制值为0n (0 <= n <= 7)的字符 |
\0NN | 八进制值0nn (0 <= n <= 7)的字符 |
\0MNN | 八进制值的字符0MNN (0 <= 米 <= 3,0 <= Ñ <= 7) |
\xHH | 具有十六进制值的字符0xhh |
\uHHHH | 具有十六进制值的字符 0xhhhh |
\x{H … H} | 具有十六进制值0xh … h (Character.MIN_CODE_POINT <= 0xh … h <= Character.MAX_CODE_POINT)的字符 |
\N | {名称} Unicode字符名称’name’的字符 |
\t | 制表符(’\u0009’) |
\n | 换行符(换行符)(’\u000A’) |
\r | 回车符(’\u000D’) |
\f | 换页字符(’\u000C’) |
\a | 警报(铃)字符(’\u0007’) |
\e | 转义字符(’\u001B’) |
\cX | 对应于x的控制字符 |
- 字符类
字符类 | 说明 |
---|---|
[abc] | a, b或c(简单类) |
[^abc] | 任何字符除了a,b或c(否定) |
[a-zA-Z] | a通过z 或A通过Z,包容性(范围) |
[a-d[m-p]] | a通过d或m通过p:( [a-dm-p]联盟) |
[a-z&&[def]] | d,e,或f(交集) |
[a-z&&[^bc]] | a通过z,除了b和c:( [ad-z]减法) |
[a-z&&[^m-p]] | a通过z,而不是m通过p:( [a-lq-z]减法) |
预定义字符 | 说明 |
---|---|
. | 任何字符(可能与行终止符匹配也可能不匹配) |
\d | 一个数字: [0-9] |
\D | 非数字: [^0-9] |
\h | 一个水平的空白字符: [ \t\xA0\u1680\u180e\u2000-\u200a\u202f\u205f\u3000] |
\H | 非水平空白字符: [^\h] |
\s | 一个空白字符: [ \t\n\x0B\f\r] |
\S | 非空白字符: [^\s] |
\v | 垂直空白字符: [\n\x0B\f\r\x85\u2028\u2029] |
\V | 非垂直空白字符: [^\v] |
\w | 一个字符: [a-zA-Z_0-9] |
\W | 非单词字符: [^\w] |
四、处理数字
BigInteger、BigDecimal