【java】java自带的java.util.logging.Logger日志功能

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 偶然翻阅到一篇文章,注意到Java自带的Logger日志功能,特地来细细的看一看,记录一下。1.Java自带的日志功能,默认的配置  ①Logger的默认配置,位置在JRE安装目录下lib中的logging.

偶然翻阅到一篇文章,注意到Java自带的Logger日志功能,特地来细细的看一看,记录一下。

1.Java自带的日志功能,默认的配置

  ①Logger的默认配置,位置在JRE安装目录下lib中的logging.properties中

  ②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
View Code

  关于日志文件中,需要关注的第一点是:

  

  需要关注的第二点是:

  需要关注的第三点是:

  需要关注的第四点是:

 

2.java.util.logging.Level类设定了日志级别类的设定

 

可以从API看出来,出了以下的Level各个级别,还有OFF和ALL两个级别。

如果设置为Level.INFO级别的话,日志只会显示INFO以及以上的级别。

 

 

 

 3.Logger的简单使用

首先明确一点,java.util.logging.Logger的初始化方法

  

static Logger getLogger(String name) 

name代表你的Logger名称,如果指定getLogeger相同名称,则仅会创建一个对象

static Logger getLogger(String name, String resourceBundleName) 

name代表你的Logger名称,resourceBundleName代表本地化的Logger名称,也就是记录到本地磁盘的日志文件中,每一条Logger的名称

 

接下来,看看效果:

  

package com.sxd.util;

import java.util.logging.Level;
import java.util.logging.Logger;

import org.junit.Test;


/**
 * 测试Java自带的Log日志功能
 * @author sxd
 *
 */
public class TestLog {
    
    @Test
    public void test(){
        Logger log1 = Logger.getLogger("log-Test");
        log1.setLevel(Level.INFO);
        Logger log2 = Logger.getLogger("log-Test");
        System.out.println("log1和log2是否相等:"+(log1 == log2));    //true
        Logger log3 = Logger.getLogger("log-test");
        System.out.println("log1和log3是否相等:"+(log1 == log3));    //false
        log3.setLevel(Level.WARNING);
        
        log1.info("info级别打印:info级别的日志信息");
        log3.info("warning级别打印:info级别的日志信息");        //打印不出来
        log3.severe("warning级别打印:severe级别的日志信息");
        
        
        
    }
}
View Code

由此,可以证明,①设定的日志级别仅能打印到本级别以及高级别的日志信息;②同名的Logger仅会创建一个。

 

4.设定FileHandler,为日志本地化设定

package com.sxd.util;

import java.io.IOException;
import java.util.logging.ConsoleHandler;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.junit.Test;


/**
 * 测试Java自带的Log日志功能
 * @author sxd
 *
 */
public class TestLog {
    
    @Test
    public void test() throws SecurityException, IOException{
        Logger log1 = Logger.getLogger("log-Test");
        ConsoleHandler consoleHandler = new ConsoleHandler();
        consoleHandler.setLevel(Level.ALL);
        log1.addHandler(consoleHandler);
        
        FileHandler fileHandler = new FileHandler("d:/testLog%g.log");
        fileHandler.setLevel(Level.WARNING);
        log1.addHandler(fileHandler);
        
        log1.info("ALL级别打印:info级别的日志信息");
        log1.severe("warning级别打印:severe级别日志信息");
        
    }
}
View Code

控制台:

【注意】这里控制台打印了两遍相同的日志,是因为,java默认的已经设定了一个ConsoleHandler,但是这个级别是INFO级别的。

    而程序中有重新设定了一个新的ConsoleHandler,这个级别是ALL的,两个不一样,所以都执行了打印,所以打印了两遍一模一样的。

 本地日志文件:

 

【注意】仅打印了一个日志,这个根据代码日志级别就可以理解。

    关键日志文件是XML格式的内容,是因为上面解释了FileHandler的相关设置中,默认是XML格式

【注意2】FileHandler指定日志文件名称,有以下的规范:

 

 5.为本地化的日志文件设置自定义的日志格式

java.util.logging.LogRecord;

java.util.logging.Formatter;

package com.sxd.util;

import java.io.IOException;
import java.util.logging.ConsoleHandler;
import java.util.logging.FileHandler;
import java.util.logging.Formatter;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.Logger;

import org.junit.Test;


/**
 * 测试Java自带的Log日志功能
 * @author sxd
 *
 */
public class TestLog {
    
    @Test
    public void test() throws SecurityException, IOException{
        Logger log1 = Logger.getLogger("log-Test");
        
        FileHandler fileHandler = new FileHandler("d:/testLog%g.log");
        fileHandler.setLevel(Level.WARNING);
        fileHandler.setFormatter(new MyFormatter());
        log1.addHandler(fileHandler);
        
        log1.severe("warning级别打印:severe级别日志信息");
        
    }
    
    class MyFormatter extends Formatter{

        @Override
        public String format(LogRecord record) {
            return record.getLoggerName() 
                    + ">>"
                    +record.getLevel()
                    +">>"
                    +record.getMessage();
        }
        
    }
    
}
View Code

 

 

 

 

=======================================到这里,告一段落=========================================

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
3月前
|
Rust 前端开发 JavaScript
Tauri 开发实践 — Tauri 日志记录功能开发
本文介绍了如何为 Tauri 应用配置日志记录。Tauri 是一个利用 Web 技术构建桌面应用的框架。文章详细说明了如何在 Rust 和 JavaScript 代码中设置和集成日志记录,并控制日志输出。通过添加 `log` crate 和 Tauri 日志插件,可以轻松实现多平台日志记录,包括控制台输出、Webview 控制台和日志文件。文章还展示了如何调整日志级别以优化输出内容。配置完成后,日志记录功能将显著提升开发体验和程序稳定性。
153 1
Tauri 开发实践 — Tauri 日志记录功能开发
|
13天前
|
Java Maven
java项目中jar启动执行日志报错:no main manifest attribute, in /www/wwwroot/snow-server/z-server.jar-jar打包的大小明显小于正常大小如何解决
在Java项目中,启动jar包时遇到“no main manifest attribute”错误,且打包大小明显偏小。常见原因包括:1) Maven配置中跳过主程序打包;2) 缺少Manifest文件或Main-Class属性。解决方案如下:
java项目中jar启动执行日志报错:no main manifest attribute, in /www/wwwroot/snow-server/z-server.jar-jar打包的大小明显小于正常大小如何解决
|
1月前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
88 34
|
2月前
|
安全 Java 测试技术
🎉Java零基础:全面解析枚举的强大功能
【10月更文挑战第19天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
127 60
|
17天前
|
监控 安全 Linux
启用Linux防火墙日志记录和分析功能
为iptables启用日志记录对于监控进出流量至关重要
|
2月前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
42 2
|
3月前
|
人工智能 Oracle Java
解决 Java 打印日志吞异常堆栈的问题
前几天有同学找我查一个空指针问题,Java 打印日志时,异常堆栈信息被吞了,导致定位不到出问题的地方。
53 2
|
3月前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
76 2
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
|
3月前
|
Java 程序员
在Java编程中,关键字不仅是简单的词汇,更是赋予代码强大功能的“魔法咒语”。
【10月更文挑战第13天】在Java编程中,关键字不仅是简单的词汇,更是赋予代码强大功能的“魔法咒语”。本文介绍了Java关键字的基本概念及其重要性,并通过定义类和对象、控制流程、访问修饰符等示例,展示了关键字的实际应用。掌握这些关键字,是成为优秀Java程序员的基础。
42 3
|
3月前
|
Java 数据安全/隐私保护
Java ffmpeg 实现视频加文字/图片水印功能
【10月更文挑战第22天】在 Java 中使用 FFmpeg 实现视频加文字或图片水印功能,需先安装 FFmpeg 并添加依赖(如 JavaCV)。通过构建 FFmpeg 命令行参数,使用 `drawtext` 滤镜添加文字水印,或使用 `overlay` 滤镜添加图片水印。示例代码展示了如何使用 JavaCV 实现文字水印。
231 1