原生Logger的logging.properties配置文件简单分析

本文深入解析Java原生日志配置文件logging.properties的配置项,包括日志处理器、全局日志级别、文件输出配置及控制台输出配置,帮助开发者更好地理解和使用Java日志系统。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

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

这里是对自定义的日志记录器配置,指定日志记录的记录级别,低于该级别的日志信息不会被处理。

<think>嗯,用户的问题是关于如何配置Java的日志系统,使得log.info的信息只输出到文件,而不在控制台显示。根据用户提供的引用内容,我需要参考他们提到的不同日志框架的配置方法,比如java.util.logging、Log4j和LogBack。不过用户现在特别问的是java.util.logging,也就是JDK自带的日志库。 首先,我需要回顾用户提供的引用内容。引用[1]提到了java.util.logging.FileHandler的配置,其中指定了日志文件的路径。引用[4]和[5]也讨论了java.util.logging的基本配置和日志级别。而用户之前的对话中,我给出了Log4j和LogBack的配置方法,但这次用户明确要求使用java.util.logging。 接下来,我需要确认java.util.logging如何配置Handler。根据引用[1]和[4],FileHandler用于文件输出,ConsoleHandler用于控制台输出。用户的需求是禁用控制台输出,所以可能需要移除ConsoleHandler或者调整日志级别。 但是,用户希望log.info级别的信息不显示在控制台,而只写入文件。默认情况下,java.util.logging的根Logger会同时使用ConsoleHandler和FileHandler吗?可能需要检查默认配置。根据引用[4],java.util.logging的默认配置可能比较简单,可能默认只有ConsoleHandler。 解决方案应该是配置一个FileHandler,并将ConsoleHandler的日志级别设置为高于INFO,比如WARNING或SEVERE,这样INFO级别的信息就不会出现在控制台了。或者,直接移除ConsoleHandler,只保留FileHandler。 另外,需要考虑如何设置Logger的级别和Handler的级别。根Logger的级别需要允许INFO,而ConsoleHandler的级别设置为更高的,这样log.info的信息不会被ConsoleHandler处理。 还需要注意,java.util.logging配置文件logging.properties,用户可能需要创建或修改这个文件,并在启动时通过系统属性指定。 用户可能没有提到具体的配置文件位置,所以需要指导他们如何指定配置文件,比如通过-Djava.util.logging.config.file参数。 另外,用户可能在之前的对话中已经尝试过其他日志框架的配置,但现在转向JDK自带的,可能需要确保没有其他日志框架的依赖冲突,比如引用[3]提到的commons-logging和Log4j的排除方法,但这里可能不适用。 总结步骤应该是: 1. 创建logging.properties配置文件。 2. 配置FileHandler,设置日志文件路径和级别为INFO。 3. 配置ConsoleHandler,将其级别设置为高于INFO,比如WARNING,或者移除ConsoleHandler。 4.Logger的Handler指向FileHandler,并确保ConsoleHandler不被使用。 5. 在代码中加载该配置文件,或者在启动时指定。 需要验证配置是否正确,确保log.info的信息只写入文件,而控制台不显示。同时,可能需要处理默认的ConsoleHandler,因为java.util.logging默认可能会有ConsoleHandler存在,需要显式地禁用它。 最后,用户可能需要示例配置文件和代码片段来测试,确保配置有效。此外,提醒用户注意路径权限和文件是否存在的问题,避免日志无法写入。</think>#### Java.util.logging专项配置方案 根据引用[1][4][5]的配置规范,以下是实现`log.info`仅输出到文件的核心配置步骤: --- ### 一、配置文件`logging.properties` ```properties # 全局日志级别设置(引用[5]级别定义) .level=INFO # 禁用默认ConsoleHandler(关键配置) handlers=java.util.logging.FileHandler # 文件处理器配置(引用[1]路径示例) java.util.logging.FileHandler.pattern = /logs/app_%u_%g.log java.util.logging.FileHandler.limit = 1048576 # 单个文件最大1MB java.util.logging.FileHandler.count = 5 # 最多保留5个文件 java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter java.util.logging.FileHandler.level = INFO # 仅记录INFO及以上级别(引用[5]) # 强制关闭控制台输出(引用[4]对比说明) java.util.logging.ConsoleHandler.level = OFF # 显式关闭控制台 ``` --- ### 二、启动参数配置 ```bash # 加载自定义配置文件 java -Djava.util.logging.config.file=/path/to/logging.properties YourMainClass ``` --- ### 三、代码验证示例 ```java import java.util.logging.Logger; public class LogDemo { private static final Logger logger = Logger.getLogger(LogDemo.class.getName()); public static void main(String[] args) { logger.info("该信息仅出现在文件中"); // 符合引用[1]文件路径配置 logger.warning("该信息同时出现在文件和控制台"); } } ``` --- ### 四、技术原理说明 1. **层级过滤机制** - 通过`handlers=java.util.logging.FileHandler`禁用默认控制台输出(引用[4]原生特性) - 使用`.level=INFO`全局设置确保日志采集范围 2. **双保险机制** - 显式设置`java.util.logging.ConsoleHandler.level = OFF`彻底关闭控制台(引用[5]级别控制) 3. **文件滚动策略** - `%u`表示文件序列号,`%g`表示代际编号(引用[1]路径模式) --- ### 五、常见问题排查 1. **日志文件未生成** ```bash # 检查文件路径权限 chmod 755 /logs # 检查磁盘空间 df -h /logs ``` 2. **配置未生效** ```java // 在代码中强制重载配置 LogManager.getLogManager().readConfiguration( new FileInputStream("/path/to/logging.properties")); ``` 3. **与其他日志框架冲突** 参考引用[3]的解决方法,检查依赖树: ```bash mvn dependency:tree | grep logging ``` --- #### 相关问题 1. 如何实现按日期分割日志文件? 2. Java.util.logging与Log4j性能差异有多大? 3. 怎样自定义日志输出格式?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值