java 日志系统 java核心编程例子
简介
对于 经常使用 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核心编程例子的更多相关文章
- Java 日志系统
Java 日志系统 1. 创建日志记录器 private final Logger logger = LoggerFactory.getLogger(LoggerTest.class); 2. 打印日 ...
- Java日志系统及框架分析
最近在考虑将容器(Tomcat)内的应用日志统一成slf4j + logback,主要目的有: 快速定位应用日志输出路径,方便日志的采集: 能动态调整日志的级别,方便线上问题定位: 方便在容器层面做扩 ...
- Java日志系统框架的设计与实现
推荐一篇好的文章介绍java日志系统框架的设计的文章:http://soft.chinabyte.com/database/438/11321938.shtml 文章内容总结: 日志系统对跟踪调试.程 ...
- Java日志系统---Logger之简单入门
Java 中自带的日志系统,今天抽空了解了一点,算是入了门,所以将自己的一些心得记录下来,以备日后查看,有兴趣的朋友,看到此文章,觉得有错误或需要添加的地方,请在下方评论留言,大家可以共同进步,谢谢: ...
- 走进JavaWeb技术世界9:Java日志系统的诞生与发展
本文转自[码农翻身] ## 一个著名的日志系统是怎么设计出来的? # 1前言 Java帝国在诞生之初就提供了集合.线程.IO.网络等常用功能,从C和C++领地那里吸引了大量程序员过来加盟,但是却有意无 ...
- Java日志系统
前言 各组件之间的关系: slf4j是The Simple Logging Facade for Java的简称,是一个简单日志门面抽象框架,它本身只提供了日志Facade API和一个简单的日志类实 ...
- 常见java日志系统的搭配详解:关于slf4j log4j log4j2 logback jul jcl commons-logging jdk-logging
先看一张图: 是不是有点晕, 晕就对了.这个仅仅是 slf4j 的情况,实际上, 我们不仅要接触到 slf4j ,有时候还会接触其他的日志系统.且看下文分解. 1 直接使用各个日志系统 1.1 直接使 ...
- 【Java】Java日志框架Logback的简单例子
常用的日志框架 SLF4J,全称Simple Logging Facade for Java,即Java简单日志外观框架,顾名思义,它并非具体的日志实现,而是日志外观框架 java.util.logg ...
- java日志系统中的 NDC
NDC https://www.cnblogs.com/smile361/p/3853404.html
- java日志-纯Java配置使用slf4j配置log4j(转)
工程目录如下 代码里面用的是slf4j,但是想要用log4j来管理日志,就得添加slf4j本来的jar,然后添加log4j和slf4j箱关联的jar即可. 如果是maven项目的话添加下面的依赖即可 ...
随机推荐
- 根据返回值,判断是否执行下一步的方法(Run Keyword And Return Status指令的使用)
场景分析: 上图"通用模版测试"内容 满足,如果当前页面存在这条数据,即结束执行本条用例,自动执行下一条.如果没有,则调用新建模版关键字,执行新建模版. 脚本如下 1配置运费模版 ...
- Linux各种服务配置开机自启
一.Linux配置redis开机自启 (1)到redis配置文件中找到conf文件:vi redis.conf (2)daemonize no 修改为:daemonize yes (3)cd /etc ...
- 【踩坑系列】使用Comparator.comparing对中文字符串排序结果不对
1. 踩坑经历 假设有这样一个业务场景,需要对各个城市的订单量排序,排序规则为: 先根据订单量倒序排列,再根据城市名称正序排列. 示例代码: import lombok.Getter; import ...
- 测试获取 Github 信息
import json import requests from .fetch_github_info import AUTHENTICATED_USER_ENDPOINT, fetch_github ...
- 可持久化 01-trie 简记
本文略过了 trie 和 可持久化的介绍,如果没学过请先自学. 在求给定一个值 \(k\) 与区间中某些值的异或最大值时,可以考虑使用在线的数据结构可持久化 01-trie 来维护. 01-trie ...
- JuiceFS v1.3-beta1:新增 Python SDK,特定场景性能 3 倍于 FUSE
在当前众多 AI 和数据科学应用中,Python 已成为最主流的编程语言之一.为了方便用户在这些场景中更高效地使用 JuiceFS,我们在社区版 v1.3 中推出了 JuiceFS Python SD ...
- CentOS 7.6 安装 Mysql 5.7
一.查看CentOS版本 Mysql的版本必须要和CentOS的版本对应!查看CentOS版本的指令如下: cat /etc/redhat-release 二.下载yum源包 wget http:// ...
- Pytorch之线性回归
从零开始实现 %matplotlib inline import torch import numpy as np import random 生成数据集 设训练数据集样本数为1000,特征数为2,使 ...
- 基于Photon与Unreal Engine的VR协作平台开发实战教程
引言 在数字化转型加速的今天,虚拟现实(VR)技术正在重塑远程协作模式.本教程将带领读者从零开始构建一个支持多人协同的VR办公平台,通过Unreal Engine 5的强大渲染能力与Photon引擎的 ...
- 代码随想录第一天|数组part01
二分查找 题目建议: 大家今天能把 704.二分查找 彻底掌握就可以,至于 35.搜索插入位置 和 34. 在排序数组中查找元素的第一个和最后一个位置 ,如果有时间就去看一下,没时间可以先不看,二刷的 ...