java 使用log4j显示到界面和文件 并格式化

1.下载log4j 

jar包https://dlcdn.apache.org/logging/log4j/2.20.0/apache-log4j-2.20.0-bin.zip

2. 我只要到核心包 ,看需要

sources是源码包,可以看到说明。在IDEA里先加入class jar后,再双击这个class jar包或或右键选Navigate ,Add ,选对应的Sources.jar 

 3.示例代码

package util;

import org.apache.log4j.*;
import org.apache.log4j.spi.LoggingEvent;

import javax.swing.*;
import java.awt.*;
import java.io.*;

public class Log4j {
    public static final Logger LOGGER = Logger.getLogger(Log4j.class);



    private static JTextArea textArea;
    public static void main(String[] args) {
        // 创建并显示UI界面
        createUI();

        // 配置log4j日志记录器
        configureLogger(textArea);

        // 示例日志输出
        LOGGER.debug("Debug log message");
        LOGGER.info("Info log message");
        LOGGER.warn("Warn log message");
        LOGGER.error("Error log message chenhao");

        // 关闭log4j日志记录器
        LogManager.shutdown();
    }

    private static void createUI() {
        JFrame frame = new JFrame("Log Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 300);

        textArea = new JTextArea();
        textArea.setEditable(false);

        JScrollPane scrollPane = new JScrollPane(textArea);
        frame.getContentPane().add(scrollPane, BorderLayout.CENTER);

        frame.setVisible(true);
    }

    //配置为 界面输出 和 文件输出
    public static void configureLogger(JTextArea textArea) {
        // 创建UI界面输出的Appender
        JTextAreaAppender uiAppender = new JTextAreaAppender(textArea);
        //uiAppender.setLayout(new PatternLayout("%d{yyyy-MM-dd HH:mm:ss} %c [%p] - %m%n"));
        uiAppender.setLayout(new PatternLayout("%d{yyyy-MM-dd HH:mm:ss} [%p] - %m%n"));
        uiAppender.activateOptions();
        Logger.getRootLogger().addAppender(uiAppender);

        // 创建文件输出的Appender
        try {
            FileAppender fileAppender = new FileAppender(new PatternLayout("%d{yyyy-MM-dd HH:mm:ss} [%p] - %m%n"), "logs/logfile.log");
            fileAppender.setAppend(true); // 如果true,则追加到现有的日志文件末尾;如果false,则覆盖文件中的现有内容
            fileAppender.activateOptions();
            // 将Appender添加到日志记录器
            Logger.getRootLogger().addAppender(fileAppender);
        } catch (IOException e) {
            e.printStackTrace();
            return;
        }

        // 设置日志记录级别
        LOGGER.setLevel(Level.DEBUG);
    }
    //配置为 控制台输出 和 文件输出
    public static void configureLogger() {
        // 创建控制台输出的Appender
        ConsoleAppender consoleAppender = new ConsoleAppender();
        consoleAppender.setLayout(new PatternLayout("%d{yyyy-MM-dd HH:mm:ss} %c [%p] - %m%n"));
        consoleAppender.setTarget(ConsoleAppender.SYSTEM_OUT);
        consoleAppender.activateOptions();

        // 创建文件输出的Appender
        try {
            FileAppender fileAppender = new FileAppender(new PatternLayout("%d{yyyy-MM-dd HH:mm:ss} %c [%p] - %m%n"), "logs/logfile.log");
            fileAppender.setAppend(true); // 如果true,则追加到现有的日志文件末尾;如果false,则覆盖文件中的现有内容
            fileAppender.activateOptions();
            // 将Appender添加到日志记录器
            Logger.getRootLogger().addAppender(fileAppender);
        } catch (IOException e) {
            e.printStackTrace();
            return;
        }

        // 设置日志记录级别
        LOGGER.setLevel(Level.DEBUG);
    }

    private static class JTextAreaAppender extends AppenderSkeleton {
        private JTextArea textArea;

        public JTextAreaAppender(JTextArea textArea) {
            this.textArea = textArea;
        }

        @Override
        protected void append(LoggingEvent loggingEvent) {
            String logMessage = layout.format(loggingEvent);
            SwingUtilities.invokeLater(() -> textArea.append(logMessage));
        }

        @Override
        public void close() {
            // Nothing to do here
        }

        @Override
        public boolean requiresLayout() {
            return true;
        }
    }
}

4.格式化

解释一下"%d{yyyy-MM-dd HH:mm:ss} %c [%p] - %m%n"每个部分的含义:

  • %d{yyyy-MM-dd HH:mm:ss}:表示输出日志的时间戳,使用指定的日期时间格式("yyyy-MM-dd HH:mm:ss")。

  • %c:表示输出日志的类名。

  • [%p]:表示输出日志的级别(例如,DEBUG、INFO、WARN、ERROR)。

  • -%m:表示输出日志的消息。

  • %n:表示换行符。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/75511.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【贪心】CF1779 D

不会1700 Problem - 1779D - Codeforces 题意: 思路: 首先手推样例,可以发现一些零碎的性质: 然后考虑如何去计算贡献 难点在于,当一个区间的两端是区间max时,怎么去计算贡献 事实上,只需要…

【HttpRunnerManager】搭建接口自动化测试平台操作流程

一、需要准备的知识点 1. linux: 安装 python3、nginx 安装和配置、mysql 安装和配置 2. python: django 配置、uwsgi 配置 二、我搭建的环境 1. Centos7 (配置 rabbitmq、mysql 、Supervisord) 2. python 3.6.8 (配置 django、uwsgi&…

kubernetes二进制部署2之 CNI 网络组件部署

CNI 网络组件部署 一:K8S提供三大接口1容器运行时接口CRI2云原生网络接口CNI3云原生存储接口CSI 部署 flannelK8S 中 Pod 网络通信:Overlay Network:VXLAN:Flannel:Flannel udp 模式的工作原理:ETCD 之 Flannel 提供说…

麒麟arm架构 编译安装qt5.14.2

1、先在官网下载qt源码: https://download.qt.io/archive/qt/5.14/5.14.2/single/[qt源码下载地址] 2、解压编译 使用tar -xvf qt-everywhere-src-5.14.2.tar.xz 解压压缩包 cd qt-everywhere-src-5.14.2 执行 ./configure --prefix/usr/local/qt.5.14.2 make -…

计算机竞赛 python 爬虫与协同过滤的新闻推荐系统

1 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 python 爬虫与协同过滤的新闻推荐系统 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分工作量:3分创新点:4分 该项目较为新颖&…

Cpp学习——string模拟实现

目录 一,string的成员变量 二,string的各项功能函数 1.构造函数 2.析构函数 3.扩容函数 4.插入与删除数据的函数 5.运算符重载 6.打印显示函数 7,拷贝构造 8.find函数 一,string的成员变量 在模拟实现string之前&#xff…

云原生 AI 工程化实践之 FasterTransformer 加速 LLM 推理

作者:颜廷帅(瀚廷) 01 背景 OpenAI 在 3 月 15 日发布了备受瞩目的 GPT4,它在司法考试和程序编程领域的惊人表现让大家对大语言模型的热情达到了顶点。人们纷纷议论我们是否已经跨入通用人工智能的时代。与此同时,基…

二自由度机械臂的gazebo仿真

一、创建ros软件包 #1、创建工作空间 mkdir 2d_robot_ws cd 2d_robot_ws mkdir src cd src catkin_init_workspace #2、编译工作空间 cd .. catkin_make #3、创建软件包 catkin_create_pkg 2d_robot std_msgs rospy roscpp二、创建模型文件 1、编写urdf模型文件 在2d_robot_…

LLMs大模型plugin开发实战

一、概述 ChatGPT是通用语言大模型,如果用户想要在与大模型进行交互时能够使用到企业私有的数据,那么可以通过开发plugin(插件)的方式来实现,另外GPT3.5模型的训练数据是截止到2021年9月,如果想让模型能够…

mysql-5.5.62-win32安装与使用

1.为啥是这个版本而不是当前最新的8.0? 因为我要用32位。目前mysql支持win32的版本最新只到5.7.33。 首先,到官网MySQL :: MySQL Downloads 然后选 选一个自己喜欢的版本就好。我这里是如标题版本。下载32位的zip。然后回来解压。 完了创建系统环境变…

29 深度玻尔兹曼机

文章目录 29 深度玻尔兹曼机29.1 背景介绍29.2 DBM的叠加方式 29 深度玻尔兹曼机 29.1 背景介绍 过去在解决BM问题的时候,提出过多种模型:RBM、SBN、DBN 其中RBM是一种有限制条件的,简化的BM,限制了隐藏层和观测层内部都没有连…

【数据结构OJ题】移除链表元素

原题链接:https://leetcode.cn/problems/remove-linked-list-elements/description/ 1. 题目描述 2. 思路分析 我们可以定义一个结构体指针变量cur,让cur一开始指向头结点,同时定义一个结构体指针prev,令prev初始化为空指针NULL…

uniapp封装组件,选中后右上角显示对号√样式(通过css实现)

效果&#xff1a; 一、组件封装 1、在项目根目录下创建components文件夹&#xff0c;自定义组件名称&#xff0c;我定义的是xc-button 2、封装组件代码 <template><view class"handle-btn"><view :class"handleIdCode 1 ? select : unSelec…

Java多线程编程中的线程死锁

Java多线程编程中的线程死锁 ​ 在多线程编程中&#xff0c;线程死锁是一种常见的问题&#xff0c;它发生在两个或多个线程互相等待对方释放资源的情况下&#xff0c;导致程序无法继续执行。本文将介绍线程死锁的概念、产生原因、示例以及如何预防和解决线程死锁问题。 线程死…

less学习语法

1.CSS函数的补充 1.rgb/rgba/translate/rotate/scale 2.非常好用的css函数&#xff1a; var:使用css定义的变量calc:计算css值&#xff0c;通常用于计算元素的大小或位置blur:毛玻璃&#xff08;高斯模糊&#xff09;效果gradient:颜色渐变函数 var:定义变量 css中可以自定…

【Vue3】自动引入插件-`unplugin-auto-import`

Vue3自动引入插件-unplugin-auto-import&#xff0c;不必再手动 import 。 自动导入 api 按需为 Vite, Webpack, Rspack, Rollup 和 esbuild 。支持TypeScript。由unplugin驱动。 插件安装&#xff1a;unplugin-auto-import 配置vite.config.ts&#xff08;配置完后需要重启…

Verdi_traceX and autotrace

Verdi_traceX and autotrace Trace X From nWave/nTrace of from the Teporal Flow View. Show Paths on Flow ViewShow Paths on nWave 若Waveform中有X态&#xff0c;鼠标右键会有Trace X的选项&#xff1b; 会自动打开Temporal Flow View窗口&#xff0c;展示对应路径&am…

LangChain手记 Question Answer 问答系统

整理并翻译自DeepLearning.AILangChain的官方课程&#xff1a;Question Answer&#xff08;源代码可见&#xff09; 本节介绍使用LangChian构建文档上的问答系统&#xff0c;可以实现给定一个PDF文档&#xff0c;询问关于文档上出现过的某个信息点&#xff0c;LLM可以给出关于该…

docker打包运行中的容器,生成镜像文件保存到本地

因为想着方便部署&#xff0c;将所有没问题的项目容器打包成镜像&#xff0c;走到哪儿都离线安装自动部署。 第一步先把运行中的容器打包成镜像 docker commit 运行中容器id 像打包成的镜像名称第二步将大象装进冰箱&#xff0c;不好意思说错了&#xff0c;把镜像保存到本地 …

Hlang社区-社区导航栏实现

文章目录 前言项目结构导航实现创作中心移动小球消息提示完整代码前言 okey,这里的话是我们社区导航栏的实现: 废话不多说,看看效果: 我甚至为此用New Bing生成了一个Logo。 项目结构 废话不多说,先来看到我们的项目结构: 在这里导航栏是一个组件。 在App.vue里面直…