java.util.logging的使用
秉承着某种执念我今天决定不用Logback而是和Java的logging肛到底,现在总结一下研究成果:
日志等级
日志等级有七种,severe,warning,info,fine,finer,finest,config,这七种均可以作为方法名,且是枚举类Level中的枚举量。使用方法很简单,类似logger.info(String msg)的形式即可使用,但是接下来有一个比较坑的地方:默认只能打印info,warning,severe这三个等级的日志,如果你想用更低等级的日志,比如说debug时看信息,就要进行复杂的配置。
如果你仅仅将日志输出到文件而不需要使用控制台,则比较容易,直接使用setLevel方法即可。但是,如果你想使用控制台,就要知道,日志能否显示在控制台不仅取决于它这个级别能否被打印,还取决于全局Logger配置中是否允许这个级别的日志显示在控制台。所以,想在控制台中查看低等级日志,则需要手动改写loggerManager的配置类。
加载配置文件
java8以前的全局配置文件在jre/lib中,从java9开始挪到了jre/conf中,但是我极不推荐你更改这里的配置,我这里建议你对其进行单独加载,仅对你的应用生效。这里给出Springboot加载全局日志配置文件的方法,我将自定义的配置文件放在了/resources/logging.properties
@Component
public class LogConfig {
@PostConstruct
public void setLogManager(){
LogManager logManager = LogManager.getLogManager();
try {
logManager.readConfiguration(new ClassPathResource("logging.properties").getInputStream());
} catch (Exception e) {
//添加你方便的显示错误的方式。
}
}
}
这里我使用了Spring提供的ClassPathResource类,这个类十分方便,可以直接指向resources默认目录,并提供了转换成文件/IO流等多种方案方便你的类对其进行读取。另外logManager是一个单例,一旦更改配置全局的Log都会加载你的自定义配置。就不要吐槽我为什么要在Springboot里用java自己的日志类了,由于项目是多个项目合并而来的。这里不用ClassPathResource类也有很多方法去读,比如用文件操作,不再叙述。
配置文件
之后,我们就可以在对应目录编写配置文件了:
#handler
handlers= java.util.logging.ConsoleHandler
#全局日志等级
.level= INFO
#输出日志文件名格式
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.maxLocks = 100
#日志默认形式
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter
#控制台显示的日志等级
java.util.logging.ConsoleHandler.level = FINE
#选择日志输出格式
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
#对格式进行自定义
java.util.logging.SimpleFormatter.format=[%1$tF %1$tT] [%4$-7s] %5$s %n
#对特殊类的等级特殊说明
com.changhe.Utils.LogUtils.level=FINE
比如这里,我未设置handler,设置了全局显示INFO级,我的Debug用logger显示到Fine级(方法是将以该类类名为名的logger的等级设为FINE,参考代码),并允许控制台输出Fine级消息,并自定义了日志输出格式,有关于格式定义的写法,可以去查阅Java的Formatter类,这种写法常用于定义时间格式等,较为复杂。
一个单例模式的logger获取方式
最后提供一下我写的饿汉模式的日志类单例,考虑到日志要记录类名,这种方式并不真的很适合,但这里由于我写的这个logger只负责自定义输出,所以可以采用这种方便且减少内存消耗的做法:
import java.util.logging.*;
public class LogUtils {
private static LogUtils logUtils = new LogUtils();
public static LogUtils getLogUtils() {
return logUtils;
}
private Logger logger;
private LogUtils() {
logger = Logger.getLogger(LogUtils.class.getName());
}
public Logger getLogger() {
return logger;
}
}
java.util.logging的使用的更多相关文章
- Java程序日志:java.util.logging.Logger类
一.Logger 的级别 比log4j的级别详细,全部定义在java.util.logging.Level里面.各级别按降序排列如下:SEVERE(最高值)WARNINGINFOCONFIGFINEF ...
- java.util.logging.Logger 使用详解
概述: 第1部分 创建Logger对象 第2部分 日志级别 第3部分 Handler 第4部分 Formatter 第5部分 自定义 第6部分 Logger的层次关系 参考 第1部分 创建Logger ...
- java.util.logging.Logger使用详解
一.创建Logger对象 static Logger getLogger(String name) 为指定子系统查找或创建一个 logger. static Logger ge ...
- java.util.logging.Logger基础教程
从JDK1.4开始即引入与日志相关的类java.util.logging.Logger,但由于Log4J的存在,一直未能广泛使用.综合网上各类说法,大致认为: (1)Logger:适用于小型系统,当日 ...
- Java日志工具之java.util.logging.Logger
今天总结下JDK自带的日志工具Logger,虽然它一直默默无闻,但有时使用它却比较方便.更详细的信息可以查看JDK API手册,本文只是简单示例入门. 创建Logger 我们可以使用Logger的工厂 ...
- 基于java.util.logging实现轻量级日志记录库(增加根据当前类class初始化,修复线程池模型(javaEE)下的堆栈轨迹顺序与当前调用方法不一致问题)
前言: 本章介绍自己写的基于java.util.logging的轻量级日志记录库(baseLog). 该版本的日志记录库犹如其名,baseLog,是个实现日志记录基本功能的小库,适合小型项目使用,方便 ...
- 深入分析Java的内置日志API(java.util.logging)(一)
简介 任何的软件系统,日志都是非常重要的一部分.良好统一的日志规范会大大提高应用程序的可维护性.可靠性,并进而提高开发效率,指导业务.在早期,Java工程师往往都是利用 System.err.pr ...
- java.util.logging.Logger基础
1. 定义 java.util.logging.Logger是Java自带的日志类,可以记录程序运行中所产生的日志.通过查看所产生的日志文件,可以分析程序的运行状况,出现异常时,分析及定位异常. 2. ...
- 2.java.util.logging.Logger使用详解
一.java.util.logging.Logger简介 java.util.logging.Logger不是什么新鲜东西了,1.4就有了,可是因为log4j的存在,这个logger一直沉默着, 其实 ...
随机推荐
- Linux Shell -- 无网不利
这篇文章中我介绍几个非常实用的和网络相关的命令 一.ifconfig 这个命令在Windows下被"翻译为ipconfig",它用于显示网络接口,子网掩码等详细信息. 注:在每个系 ...
- mpi中程序在集群中的分发
我们在开发mpi程序时,由于其是分布式程序,我们在单个节点上完成编码后,需要将代码拷贝到整个集群进行测试.集群之间的文件拷贝可以通过scp命令完成.但是scp命令是针对两个节点之间文件互传设计,为了将 ...
- Dynamics CRM 2011 仪表盘(dashbord)中加入公告(announcement)模块
具体步骤如下: 1.将一下代码黏贴入一个取名叫"announcementsondashboard.htm"的html文件中,当然文件名你随便起无所谓. <span style ...
- Mapreduce 框架解析
MapReduce过程解析 一.客户端 Map-Reduce的过程首先是由客户端提交一个任务开始的. public static RunningJob runJob(JobConf job) thro ...
- 关于使用Xcode自带的单元测试UnitTest的介绍
什么是单元测试? 单元测试就是为你的方法专门多写一个测试函数.以保证你的方法在不停的修改开发中.保持正确.如果出错,第一时间让你知道,这样从最小单位开始监控来保证软件的质量. 什么时候用到单元测试: ...
- mongodb系列之--分片的原理与配置
1.分片的原理概述 分片就是把数据分成块,再把块存储到不同的服务器上,mongodb的分片是自动分片的,当用户发送读写数据请求的时候,先经过mongos这个路由层,mongos路由层去配置服务器请求分 ...
- 安卓学习笔记--已root设备应用请求root权限
网上查到的方法 Process process = null; DataOutputStream os = null; try { String cmd = "chmod 777 " ...
- 初探linux子系统集之写在前言
毕业两周年,进入嵌入式linux这个行业也已两个年头有余,从开始的linux驱动,android的framework,到现在的linux应用,android的app以及产品的零零总总,其实很想把这些都 ...
- lpad函数
函数介绍 lpad函数是Oracle数据库函数,lpad函数从左边对字符串使用指定的字符进行填充.从其字面意思也可以理解,l是left的简写,pad是填充的意思,所以lpad就是从左边填充的意思. 2 ...
- day07_Tomcat服务器与http学习笔记
============================================================ 一.Tomcat服务器(很熟悉) 1.Web开发概述 WEB,在英语中web即 ...