JUL日志系统
项目中有大量控制台输出语句,实际运行不打印日志,直接输出很难实现,需要日志框架规范化日志输出
JDK自带日志框架
示例
| public static void main(String[] args) { |
| Logger logger = Logger.getLogger(Main.class.getName()); |
| logger.info("hello,world"); |
| } |
日志优先级
- SEVERE 严重错误
- WARNING 某些警告
- INFO 常规消息
- CONFIG
- FINE
- FINER
- FINST 最低值
设置日志级别
| logger.setLevel(Level.CONFIG); |
不使用父日志处理器
| logger.setUseParentHandlers(false); |
使用日志处理器
| ConsoleHandler consoleHandler = new ConsoleHandler(); |
| consoleHandler.setLevel(Level.CONFIG); |
| logger.addHandler(consoleHandler); |
父日志打印器
| System.out.println(logger.getParent().getClass()); |
文件处理器
| |
| FileHandler fileHandler = new FileHandler("test.log"); |
| fileHandler.setLevel(Level.WARNING); |
| logger.addHandler(fileHandler); |
| |
| |
自定义打印格式
| |
| ConsoleHandler handler = new ConsoleHandler(); |
| handler.setLevel(Level.CONFIG); |
| handler.setFormatter(new XMLFormatter()); |
| logger.addHandler(handler); |
| |
| |
自行实现打印
| public static void main(String[] args) throws IOException { |
| Logger logger = Logger.getLogger(Main.class.getName()); |
| logger.setUseParentHandlers(false); |
| |
| |
| ConsoleHandler handler = new ConsoleHandler(){{ |
| setOutputStream(System.out); |
| }}; |
| |
| handler.setFormatter(new Formatter() { |
| @Override |
| public String format(LogRecord record) { |
| SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); |
| String time = format.format(new Date(record.getMillis())); |
| String level = record.getLevel().getName(); |
| |
| String thread = String.format("%10s", Thread.currentThread().getName()); |
| long threadID = record.getThreadID(); |
| String className = String.format("%-20s", record.getSourceClassName()); |
| String msg = record.getMessage(); |
| |
| |
| return "\033[38m" + time + " \033[33m" + level + " \033[35m" + threadID |
| + "\033[38m --- [" + thread + "] \033[36m" + className + "\033[38m : " + msg + "\n"; |
| } |
| }); |
| logger.addHandler(handler); |
| |
| logger.info("我是测试消息1..."); |
| logger.log(Level.INFO, "我是测试消息2..."); |
| logger.log(Level.WARNING, "我是测试消息3..."); |
| } |
| |
过滤某些日志
| public static void main(String[] args) throws IOException { |
| Logger logger = Logger.getLogger(Main.class.getName()); |
| |
| |
| logger.setFilter(record -> !record.getMessage().contains("普通")); |
| |
| logger.log(Level.SEVERE, "严重的错误", new IOException("我就是错误")); |
| logger.log(Level.WARNING, "警告的内容"); |
| logger.log(Level.INFO, "普通的信息"); |
| } |
| |
Properties
java的一种配置文件
| name = Test |
| desc = Description |
格式:配置项=配置值
| public static void main(String[] args) throws IOException { |
| Properties properties = new Properties(); |
| properties.load(new FileInputStream("test.properties")); |
| System.out.println(properties); |
| } |
| |
Properties本质上是一种Map结构,把所有的配置项映射成Map,快速读取对应配置的值
将Properties放到输出流保存,打印到控制台
| public static void main(String[] args) throws IOException { |
| Properties properties = new Properties(); |
| |
| properties.put("test", "lbwnb"); |
| properties.store(System.out, "????"); |
| |
| } |
| |
获取系统参数
| public static void main(String[] args) throws IOException { |
| System.getProperties().store(System.out, "系统信息:"); |
| } |
| |
日志配置文件
| |
| handlers= java.util.logging.ConsoleHandler |
| |
| .level= CONFIG |
| |
| public static void main(String[] args) throws IOException { |
| |
| LogManager manager = LogManager.getLogManager(); |
| |
| manager.readConfiguration(new FileInputStream("logging.properties")); |
| |
| Logger logger = Logger.getLogger(Main.class.getName()); |
| logger.log(Level.CONFIG, "我是一条日志信息"); |
| } |
Lombok 日志
| @Log(topic = "hello,world") |
| public class Main{ |
| public static void main(String[] args) throws Exception{ |
| System.out.println(log.getName()); |
| } |
| } |
Mybatis日志系统
开启日志
| <setting name="logImpl" value="STDOUT_LOGGING" /> |
| |
logImpl后可以填很多项:
SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING
示例
| @Log(topic = "hello,world") |
| public class Main{ |
| private SqlSessionFactory sqlSessionFactory; |
| @Before |
| public void before(){ |
| try{ |
| sqlSessionFactory = new SqlSessionFactoryBuilder() |
| .build(new FileInputStream("mybatis-config.xml")); |
| }catch (FileNotFoundException e){ |
| e.printStackTrace(); |
| } |
| } |
| |
| @Test |
| public void test(){ |
| try (SqlSession sqlSession = sqlSessionFactory.openSession(true)){ |
| TestMapper mapper = sqlSession.getMapper(TestMapper.class); |
| mapper.selectStudent().forEach(System.out::println); |
| mapper.selectStudent().forEach(System.out::println); |
| } |
| } |
| } |
查找两次只会打开一次数据库连接
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!