简介

对于 经常使用 printf or cout 的人来说 如果有这个日志系统的话,对于每次程序中的发生的错误可以了如职掌。 没必要 每次遇到问题 了解大致的逻辑然后 添加打印。后面章节中还提到一些技巧jconsole 的使用之类的。

java 日志代码

package cn;

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.logging.FileHandler;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
import java.util.logging.StreamHandler; import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTextArea; public class LoggingImageViewer {
public static void main(String[] args){
if(System.getProperty("java.util.logging.config.class") == null && System.getProperty("java.util.logging.config.file") == null){
try{
Logger.getLogger("com.horstmann.corejava").setLevel(Level.ALL);
final int LOG_ROTATION_COUNT = 10;
Handler handler = new FileHandler("%h/LoggingImageViewer.log", 0, LOG_ROTATION_COUNT);
Logger.getLogger("com.horstmann.corejava").addHandler(handler);
}
catch (IOException e){
Logger.getLogger("com.horstmann.corejava").log(Level.SEVERE, "Can't create log file handler", e);
}
}
EventQueue.invokeLater(()->{
Handler windowHandler = new WindowHandler();
windowHandler.setLevel(Level.ALL);
Logger.getLogger("com.horstmann.corejava").addHandler(windowHandler); JFrame frame = new ImageViewerFrame();
frame.setTitle("LoggingImageViewer");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Logger.getLogger("com.horstmann.corejava").fine("Showing frame");
frame.setVisible(true);
});
} } class ImageViewerFrame extends JFrame{
private static final int DEFAULT_WIDTH = 300;
private static final int DEFAULT_HEIGHT = 400;
private JLabel label;
private static Logger logger = Logger.getLogger("com.horstmann.corejava"); public ImageViewerFrame(){
logger.entering("ImageViewerFrame", "<int>");
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT); // set up menu bar
JMenuBar menuBar = new JMenuBar();
setJMenuBar(menuBar); JMenu menu = new JMenu("File");
menuBar.add(menu); JMenuItem openItem = new JMenuItem("Open");
menu.add(openItem); openItem.addActionListener(new FileOpenListener()); JMenuItem exitItem = new JMenuItem("Exit");
menu.add(exitItem);
exitItem.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event){
logger.fine("Exiting.");
System.exit(0);
}
}); // use a label to display the images
label = new JLabel();
add(label);
logger.exiting("ImageViewerFrame", "<int>");
} private class FileOpenListener implements ActionListener{
public void actionPerformed(ActionEvent event){
logger.entering("ImageViewerFrame.FileOpenListener", "actionPerformed", event); // set up file chooser
JFileChooser chooser = new JFileChooser();
chooser.setCurrentDirectory(new File(".")); chooser.setFileFilter(new javax.swing.filechooser.FileFilter(){
public boolean accept(File f){
return f.getName().toLowerCase().endsWith(".gif") || f.isDirectory();
} public String getDescription(){
return "GIF Images";
}
}); // show file chooser dialog
int r = chooser.showOpenDialog(ImageViewerFrame.this); // if image file accepted, set it as icon of the label
if(r == JFileChooser.APPROVE_OPTION){
String name = chooser.getSelectedFile().getPath();
logger.log(Level.FINE, "Reading file {0}", name);
label.setIcon(new ImageIcon(name));
}
else logger.fine("File open dialog canceled.");
logger.exiting("ImageViewerFrame.FileOpenListener", "actionPerformed");
}
}
} class WindowHandler extends StreamHandler{
private JFrame frame; public WindowHandler(){
frame = new JFrame();
final JTextArea output = new JTextArea();
output.setEditable(false);
frame.setSize(200, 200);
frame.add(new JScrollPane(output));
frame.setFocusableWindowState(false);
frame.setVisible(true);
setOutputStream(new OutputStream(){
public void write(int b){} public void write(byte[] b, int off, int len){
output.append(new String(b, off, len));
}
});
}
public void publish(LogRecord record){
if(!frame.isVisible()) return;
super.publish(record);
flush();
}
}

Q&A

Q: 为什么要重写 publish 函数

publish 函数是因为数据流有缓冲区,当有数据过来的时候直接输出,而不是将其缓冲起来等待一定的时间再输出

public void publish(LogRecord record){

if(!frame.isVisible()) return;

super.publish(record);

flush();

}

Q: "%h/LoggingImageViewer.log" 是什么意思

%h 表示在用户主目录 user.home 在windows 中是 C:\Users\lee 目录下面 生成文件 LoggingImageViewer.log.0

Logger.getLogger("com.horstmann.corejava").addHandler(handler); // logger 都是要在某个处理器下工作的。

简单介绍 ImageViewerFrame 类的功能

就是现实图片,但是异常处理主要通过另外一个类来实现 FileOpenListener 。所有的关于读取文件的异常通过这个文件的接口实现。

java 日志系统 java核心编程例子的更多相关文章

  1. Java 日志系统

    Java 日志系统 1. 创建日志记录器 private final Logger logger = LoggerFactory.getLogger(LoggerTest.class); 2. 打印日 ...

  2. Java日志系统及框架分析

    最近在考虑将容器(Tomcat)内的应用日志统一成slf4j + logback,主要目的有: 快速定位应用日志输出路径,方便日志的采集: 能动态调整日志的级别,方便线上问题定位: 方便在容器层面做扩 ...

  3. Java日志系统框架的设计与实现

    推荐一篇好的文章介绍java日志系统框架的设计的文章:http://soft.chinabyte.com/database/438/11321938.shtml 文章内容总结: 日志系统对跟踪调试.程 ...

  4. Java日志系统---Logger之简单入门

    Java 中自带的日志系统,今天抽空了解了一点,算是入了门,所以将自己的一些心得记录下来,以备日后查看,有兴趣的朋友,看到此文章,觉得有错误或需要添加的地方,请在下方评论留言,大家可以共同进步,谢谢: ...

  5. 走进JavaWeb技术世界9:Java日志系统的诞生与发展

    本文转自[码农翻身] ## 一个著名的日志系统是怎么设计出来的? # 1前言 Java帝国在诞生之初就提供了集合.线程.IO.网络等常用功能,从C和C++领地那里吸引了大量程序员过来加盟,但是却有意无 ...

  6. Java日志系统

    前言 各组件之间的关系: slf4j是The Simple Logging Facade for Java的简称,是一个简单日志门面抽象框架,它本身只提供了日志Facade API和一个简单的日志类实 ...

  7. 常见java日志系统的搭配详解:关于slf4j log4j log4j2 logback jul jcl commons-logging jdk-logging

    先看一张图: 是不是有点晕, 晕就对了.这个仅仅是 slf4j 的情况,实际上, 我们不仅要接触到 slf4j ,有时候还会接触其他的日志系统.且看下文分解. 1 直接使用各个日志系统 1.1 直接使 ...

  8. 【Java】Java日志框架Logback的简单例子

    常用的日志框架 SLF4J,全称Simple Logging Facade for Java,即Java简单日志外观框架,顾名思义,它并非具体的日志实现,而是日志外观框架 java.util.logg ...

  9. java日志系统中的 NDC

    NDC https://www.cnblogs.com/smile361/p/3853404.html

  10. java日志-纯Java配置使用slf4j配置log4j(转)

    工程目录如下 代码里面用的是slf4j,但是想要用log4j来管理日志,就得添加slf4j本来的jar,然后添加log4j和slf4j箱关联的jar即可. 如果是maven项目的话添加下面的依赖即可 ...

随机推荐

  1. 根据返回值,判断是否执行下一步的方法(Run Keyword And Return Status指令的使用)

    场景分析: 上图"通用模版测试"内容 满足,如果当前页面存在这条数据,即结束执行本条用例,自动执行下一条.如果没有,则调用新建模版关键字,执行新建模版. 脚本如下 1配置运费模版 ...

  2. Linux各种服务配置开机自启

    一.Linux配置redis开机自启 (1)到redis配置文件中找到conf文件:vi redis.conf (2)daemonize no 修改为:daemonize yes (3)cd /etc ...

  3. 【踩坑系列】使用Comparator.comparing对中文字符串排序结果不对

    1. 踩坑经历 假设有这样一个业务场景,需要对各个城市的订单量排序,排序规则为: 先根据订单量倒序排列,再根据城市名称正序排列. 示例代码: import lombok.Getter; import ...

  4. 测试获取 Github 信息

    import json import requests from .fetch_github_info import AUTHENTICATED_USER_ENDPOINT, fetch_github ...

  5. 可持久化 01-trie 简记

    本文略过了 trie 和 可持久化的介绍,如果没学过请先自学. 在求给定一个值 \(k\) 与区间中某些值的异或最大值时,可以考虑使用在线的数据结构可持久化 01-trie 来维护. 01-trie ...

  6. JuiceFS v1.3-beta1:新增 Python SDK,特定场景性能 3 倍于 FUSE

    在当前众多 AI 和数据科学应用中,Python 已成为最主流的编程语言之一.为了方便用户在这些场景中更高效地使用 JuiceFS,我们在社区版 v1.3 中推出了 JuiceFS Python SD ...

  7. CentOS 7.6 安装 Mysql 5.7

    一.查看CentOS版本 Mysql的版本必须要和CentOS的版本对应!查看CentOS版本的指令如下: cat /etc/redhat-release 二.下载yum源包 wget http:// ...

  8. Pytorch之线性回归

    从零开始实现 %matplotlib inline import torch import numpy as np import random 生成数据集 设训练数据集样本数为1000,特征数为2,使 ...

  9. 基于Photon与Unreal Engine的VR协作平台开发实战教程

    引言 在数字化转型加速的今天,虚拟现实(VR)技术正在重塑远程协作模式.本教程将带领读者从零开始构建一个支持多人协同的VR办公平台,通过Unreal Engine 5的强大渲染能力与Photon引擎的 ...

  10. 代码随想录第一天|数组part01

    二分查找 题目建议: 大家今天能把 704.二分查找 彻底掌握就可以,至于 35.搜索插入位置 和 34. 在排序数组中查找元素的第一个和最后一个位置 ,如果有时间就去看一下,没时间可以先不看,二刷的 ...