JDK17Src-2.java.logging
原生Logger的logging.properties配置文件简单分析_加倍努力中的博客-CSDN博客_logging.properties
前言
logging.properties配置文件用于原生的日志记录器进行配置,对该配置文件有一定了解可以更好的使用日志记录器。
文件路径
jre/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
java.util.logging.FileHandler.append = true
# 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
内容分析
# Default Logging Configuration File #
# You can use a different file by s filename
# with the java.util.logging.config.file system property.
# For example java -Djava.util.logging.config.file=myfile
java -Djava.util.logging.config.file=myfile
如果想要使用另一个配置文件,就要将java -Djava.util.logging.config.file特性设置成配置文件的存储位置
除了以上方法,还可以利用原生API进行设置,在main中执行
System.setProperty("java -Djava.util.logging.config.file",myfile);
该方法会调用readConfiguration()来重新初始化日志管理器
# "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
由注释可以得知,.level用于全局设置日志处理器处理对象信息的级别的阈值,这里的设置的级别是INFO。
# 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
java.util.logging.FileHandler.append = true
这里配置了日志文件的名字格式、文件格式(这里是XML格式)等,
通过注释,我们可以得知日志文件的存储位置位于User文件夹。
# 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
这里配置的是输出到日志信息输出到控制台的最低级别(这里是INFO,必须要注意该级别不能低于全局阈值)、输出到控制台日志信息的格式。
# For example, set the com.xyz.foo logger to only log SEVERE
# messages:com.xyz.foo.level = SEVERE
这里是对自定义的日志记录器配置,指定日志记录的记录级别,低于该级别的日志信息不会被处理。
Java.util.logging日志入门教程(二)properties配置(输出文件)_大漠帝国的博客-CSDN博客_java logging.properties
1.简介
(1)收获
最近在学日志,log4j2, logback, log4j 什么的,比较多的问题, 反倒忽略了最简单的Java.util.logging。
开始学Java.util.logging的日志,我还以为它没有什么输出方式呢,没想到居然还不错,由其是单例日志等。
试了很多错,不多说了。
(2)无论properties配置(输出文件),还是其他什么的,控制输出的都是
2.示例
(一)输出文件地址配置
a.直接上代码,properties配置,注意:需要更改文件输出的地址,改为自己的电脑上的就好,就是下面这句话
java.util.logging.FileHandler.pattern = D:\\workspace\\Log4JLogback\\Log4J2\\src\\main\\java\\util\\logging\\Logs\\TestProperties.log
-
# 输出到文件和控制台
-
handlers= java.util.logging.FileHandler,java.util.logging.ConsoleHandler
-
-
# root日志输出级别 level
-
.level= ALL
-
-
# 控制台输出级别和格式
-
java.util.logging.ConsoleHandler.level = FINER
-
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
-
-
-
# 文件输出级别和地址
-
java.util.logging.FileHandler.level=CONFIG
-
java.util.logging.FileHandler.pattern = D:\\workspace\\Log4JLogback\\Log4J2\\src\\main\\java\\util\\logging\\Logs\\TestProperties.log
-
#限制文件的大小(50000字节)
-
java.util.logging.FileHandler.limit = 50000
-
#过滤,总共保存1个文件,接着猜覆盖
-
java.util.logging.FileHandler.count = 1
-
#XMLFormatter是以xml样式输出,SimpleFormatter是以普通样式输出
-
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
-
#指定是否应该将 FileHandler 追加到任何现有文件上(false会覆盖,但默认为false)。
-
java.util.logging.FileHandler.append=true
java代码如下,注意InputStream in = getProperties.class.getResourceAsStream("/logging.properties");是有斜杠的;
推荐propreties配置读取六种方法网址:http://blog.csdn.net/Senton/article/details/4083127
-
/***Created by mo
-
*On 2017/9/14 ***13:14.
-
******/
-
import UtilTest.PropertiesTest.getProperties;
-
-
import java.io.IOException;
-
import java.io.InputStream;
-
import java.util.logging.LogManager;
-
import java.util.logging.Logger;
-
public class LoggerPropreties {
-
static Logger logger = Logger.getLogger("LoggerPropreties");
-
static LogManager logManager = LogManager.getLogManager();
-
public static void main(String[] args) throws IOException{
-
try {//读取配制文件
-
InputStream in = getProperties.class.getResourceAsStream("/logging.properties");//注意配置
-
logManager.readConfiguration(in);
-
logManager.addLogger(logger); //添加Logger
-
logger.severe("这是[severe]信息");
-
logger.warning("这是[warning]信息");
-
logger.info("这是[info]信息");
-
logger.config("这是[config]信息");
-
logger.fine("这是[fine]信息");
-
logger.finer("这是[finer]信息");
-
logger.finest("这是[finest]信息");
-
} catch (SecurityException e) {
-
e.printStackTrace();
-
} catch (IOException e) {
-
e.printStackTrace();
-
} catch(ArithmeticException e) {
-
e.printStackTrace();
-
}
-
}
-
}
得到结果:
1.控制台日志输出

2.log文件日志

希望对你有所帮助!
Java读取Properties文件的六种方法_Senton-CSDN博客
使用J2SE API读取Properties文件的六种方法
1。使用java.util.Properties类的load()方法
示例: InputStream in = lnew BufferedInputStream(new FileInputStream(name));
Properties p = new Properties();
p.load(in);
2。使用java.util.ResourceBundle类的getBundle()方法
示例: ResourceBundle rb = ResourceBundle.getBundle(name, Locale.getDefault());
3。使用java.util.PropertyResourceBundle类的构造函数
示例: InputStream in = new BufferedInputStream(new FileInputStream(name));
ResourceBundle rb = new PropertyResourceBundle(in);
4。使用class变量的getResourceAsStream()方法
示例: InputStream in = JProperties.class.getResourceAsStream(name);
Properties p = new Properties();
p.load(in);
5。使用class.getClassLoader()所得到的java.lang.ClassLoader的getResourceAsStream()方法
示例: InputStream in = JProperties.class.getClassLoader().getResourceAsStream(name);
Properties p = new Properties();
p.load(in);
6。使用java.lang.ClassLoader类的getSystemResourceAsStream()静态方法
示例: InputStream in = ClassLoader.getSystemResourceAsStream(name);
Properties p = new Properties();
p.load(in);
补充
Servlet中可以使用javax.servlet.ServletContext的getResourceAsStream()方法
示例:InputStream in = context.getResourceAsStream(path);
Properties p = new Properties();
p.load(in);
Object源码阅读随笔(JDK16)_ζ secant 、的博客-CSDN博客_object源码阅读
1.@IntrinsicCandidate
被@IntrinsicCandidate修饰的方法,在虚拟机内都有一套高效的实现代替JDK源码的实现,从而提高程序执行效率

2.泛型与通配符(存疑)

Class<?>和Class<? extends Object>的关系?

为什么在获取getClass的返回类型时,要声明成Class<? extends Number>/Class<?>而不是Class<Number>呢?
3.hashCode()
此方法是为了方便使用诸如java.util.HashMap所提供的散列表
在Java应用程序执行期间,无论何时在同一对象上多次调用hashCode方法,只要在对象的相等比较中使用的信息没有被修改,它必须一致地返回相同的整数。该整数在应用程序的一次执行和同一应用程序的另一次执行之间不必保持一致
如果两个对象通过equals(Object)的调用判断是相等的,那么这两个对象的hashCode必须相等
如果两个对象通过equals(Object)的调用判断是不等的,那么这两个对象的hashCode不要求必须相等,但是为了提高使用散列表时的效率,开发者应当设计使其不相等
4.System.identityHashCode(Object)
无论给定对象的类是否重写hashCode(),返回给定对象的哈希码与未重写的hashCode()返回的哈希码相同。空引用(Object o = null;)的哈希码是零。
identityHashCode类似对象的身份证号码,而hashCode类似对象的名字
5.equals(Object)
指示其他对象是否“等于”此对象。
equals方法实现了非空对象引用的等价关系:
它是自反的:对于任何非空参考值x, x.equals(x)应该返回true。
它是对称的:对于任何非空引用值x和y,当且仅当y.equals(x)返回true时,x.equals(y)应返回true。
它是可传递的:对于任何非空引用值x, y和z,如果x.equals(y)返回true, y.equals(z)返回true,那么x.equals(z)应该返回true。
它是一致的:对于任何非空的参考值x和y, x.equals(y)的多次调用一致地返回true或一致地返回false,前提是在对象的相等比较中使用的信息没有被修改。
对于任何非空参考值x, x.equals(null)应该返回false。
Object类的equals方法实现了对象上最具鉴别性的等价关系;也就是说,对于任何非空引用值x和y,当且仅当x和y指向同一对象时,该方法返回true (x == y的值为true)。
请注意,通常需要在重写hashCode方法时重写该方法,以便维护hashCode方法的一般契约,该契约规定相等的对象必须具有相等的哈希码。
6.clone()
创建并返回此对象的副本。“复制”的确切含义可能取决于对象的类。一般的意图是,对于任何对象x,表达式是: x.clone() != x 将为真,而表达式: x.clone().getClass() == x.getClass() 将为真, 但这些并不是绝对的要求。虽然通常情况是: x.clone().equals(x) 将为真,这不是一个绝对的要求。
按照惯例,返回的对象应该通过调用super.clone来获得。如果一个类和它的所有超类(除了Object)都遵守这个约定,那么就会出现x.clone(). getclass () == x.getClass()的情况。
按照惯例,这个方法返回的对象应该独立于这个对象(正在被克隆)。为了实现这种独立性,可能需要修改super返回的对象的一个或多个字段。在返回之前克隆它。通常,这意味着复制包含被克隆对象内部“深层结构”的任何可变对象,并用对副本的引用替换对这些对象的引用。如果一个类只包含基本字段或对不可变对象的引用,那么通常是super返回的对象中没有字段。需要修改“Clone”。
类Object的方法clone执行特定的克隆操作。首先,如果这个对象的类没有实现接口Cloneable,那么抛出一个CloneNotSupportedException。注意,所有数组都被认为实现了接口Cloneable,数组类型T[]的clone方法的返回类型是T[],其中T是任何引用或原始类型。否则,这个方法创建这个对象的类的一个新实例,并初始化它的所有字段,与这个对象的相应字段的内容完全相同,就像通过赋值一样;字段的内容本身不是克隆的。因此,该方法执行该对象的“浅拷贝”,而不是“深拷贝”操作。
类Object本身并不实现接口Cloneable,所以在类为Object的对象上调用clone方法将导致在运行时抛出异常。
7.toString()
默认返回对象的类名和哈希码信息,建议所有类都应该对此方法进行重写
8.notify()
唤醒正在等待这个对象的监视器的某个线程。如果有多个线程正在等待这个对象,则选择其中一个线程被唤醒。这种选择是任意的,是由实现的自由决定的。线程通过调用其中一个wait方法来等待对象的监视器。
在当前线程释放这个对象上的锁之前,被唤醒的线程将无法继续工作。被唤醒的线程将以通常的方式与其他可能正在竞争同步这个对象的线程竞争;例如,被唤醒的线程不享有作为下一个锁定该对象的线程的可靠特权或劣势。
该方法只能由该对象监视器的所有者的线程调用。线程通过以下三种方式之一成为对象监视器的所有者:
1.通过执行该对象的同步实例方法。
2.通过执行同步对象的同步语句体。
3.对于Class类型的对象,通过执行该类的同步静态方法。
同一时间只有一个线程可以拥有一个对象的监视器。如果当前线程不是这个对象监视器的所有者且调用了此方法,则会抛出IllegalMonitorStateException
9.notifyAll()
唤醒在这个对象的监视器上等待的所有线程。线程通过调用其中一个wait方法来等待对象的监视器。
在当前线程释放这个对象上的锁之前,被唤醒的线程将无法继续工作。被唤醒的线程将以通常的方式与其他可能正在竞争同步这个对象的线程竞争;例如,被唤醒的线程不享有作为下一个锁定该对象的线程的可靠特权或劣势。
该方法只能由该对象监视器的所有者的线程调用。如果当前线程不是这个对象监视器的所有者且调用了此方法,则会抛出IllegalMonitorStateException
10.wait(long,int)
使当前线程等待,直到它被唤醒,通常是通过被通知或被中断,或者直到经过一定的实时时间。
当前线程必须拥有这个对象的监视器锁。有关线程成为监视器锁所有者的方式的描述,请参阅notify方法。
该方法导致当前线程(这里称为T)将自己置于该对象的等待集中,然后放弃对该对象的所有同步声明。注意,只有这个对象上的锁会被释放;当前线程可能被同步的任何其他对象在线程等待时保持锁定。
线程T在线程调度中被禁用,并处于休眠状态,直到发生以下情况之一:
1.其他一些线程调用这个对象的notify方法,线程T碰巧被任意选择为要唤醒的线程。
2.其他线程调用这个对象的notifyAll方法。
3.其他线程中断线程T。
4.指定的实时时间已经过或多或少。实时时间的数量(以纳秒为单位)由表达式1000000 * timeoutMillis + nanos给出。如果timeoutMillis和nanos都为零,则不考虑实时时间,线程将等待,直到被其他原因之一唤醒。
5.线程T被虚假地唤醒。
然后从该对象的等待集中删除线程T,并重新启用线程调度。它以通常的方式与其他线程竞争对象的同步权;一旦它重新获得了对对象的控制,它对该对象的所有同步声明将恢复到之前的状态——即,到调用wait方法时的状态。然后线程T从wait方法的调用中返回。因此,从wait方法返回时,对象和线程T的同步状态与调用wait方法时完全一样。
线程可以在不被通知、中断或超时的情况下被唤醒,这就是所谓的虚假唤醒。虽然这种情况在实践中很少发生,但应用程序必须通过测试应该导致线程被唤醒的条件来防范这种情况,并在条件不满足时继续等待。
如果当前线程在等待之前或等待期间被任何线程中断,则会抛出InterruptedException异常。当抛出此异常时,当前线程的中断状态将被清除。在此对象的锁状态如前所述被恢复之前,不会引发此异常。
11.finalize()
在JDK9及其之后已被废弃使用

浙公网安备 33010602011771号