Java 项目日志实例基础:Log4j
点击下方关注我,然后右上角点击...“设为星标”,就能第一时间收到更新推送啦~~~
介绍几个日志使用方面的基础知识。
1
Log4j

1、Log4j 介绍
Log4j(log for java)是 Apache 的一个开源项目,通过使用 Log4j,我们可以控制日志信息输出到日志文件、也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用程序的代码。
2、Log4j 使用步骤说明
(1)选择 jar 包
加入 log4j-1.2.17.jar 到 Libraries 下,如果使用 maven 项目,也可以选择在 pom.xml 中新增依赖如下:
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency> (2)log4j.properties 配置
Log4j 有三个主要组件:记录器, appender 和布局。这三种类型的组件协同工作,使开发人员能够根据消息类型和级别记录消息,并在运行时控制这些消息的格式和报告位置。
Log4j 建议只使用四个级别,优先级从高到低分别是 ERROR、WARN、INFO、DEBUG。
比如定义了 INFO 级别,只有等于及高于这个级别的才进行处理,则应用程序中所有 DEBUG 级别的日志信息将不被打印出来。ALL,打印所有的日志;OFF,关闭所有的日志输出。
appenderName,就是指定日志信息输出到哪个地方。可同时指定多个输出目的地。
在 src 根目录下建立 log4j.properties,根据自己的需求,相应的修改其中的配置,其内容如下所示:
#配置根Logger
#改代码表示输输出info级别以上的日志,文件分别输出,一个是file,一个是errorlog4j.rootLogger=info,file,error
#配置file日志信息输出目的地Appender
#定义名为file的输出端是每天产生一个日志文件log4j.appender.file=org.apache.log4j.DailyRollingFileAppender #指定日志信息的最低输出级别位INFO,默认为DEBUG。log4j.appender.file.Threshold=INFO #指定当前消息输出到jpm/log4j/log.log文件中log4j.appender.file.File=/jpm/log4j/log.log #指定按天来滚动日志文件log4j.appender.file.DatePattern=yyyy-MM-dd #配置日志信息的格式(布局)Layout是可以灵活地指定布局模式log4j.appender.file.layout=org.apache.log4j.PatternLayout #格式化日志,Log4j采用类似C语言中的printf函数的打印格式格式化日志信息log4j.appender.file.layout.ConversionPattern=[%d{yyyy-MM-ddHH:mm:ss}][%-5p][jpm-%c{1}-%M(%L)]-%m%n #指定输出信息的编码log4j.appender.file.encoding=UTF-8
#配置error日志信息输出目的地Appender
#定义名为error的输出端是每天产生一个日志文件log4j.appender.error=org.apache.log4j.DailyRollingFileAppender #指定日志信息的最低输出级别位ERROR,默认为DEBUG。log4j.appender.error.Threshold=ERROR #指定当前消息输出到jpm/log4j/error.log文件中log4j.appender.error.File=/jpm/log4j/error.log #指定按月来滚动日志文件log4j.appender.error.DatePattern=yyyy-MM #配置日志信息的格式(布局)Layout是可以灵活地指定布局模式log4j.appender.error.layout=org.apache.log4j.PatternLayout #格式化日志,Log4j采用类似C语言中的printf函数的打印格式格式化日志信息log4j.appender.error.layout.ConversionPattern=[%d{yyyy-MM-ddHH:mm:ss}][%-5p][jpm-%c{1}-%M(%L)]-%m%n #指定输出信息的编码log4j.appender.error.encoding=UTF-8
#使某个功能的日志单独输出到指定的日志文件log4j.logger.saveUserLog=INFO,saveUserLog #该配置就是让job的日志只输出到自己指定的日志文件中,表示Logger不会在父Logger的appender里输出,默认为true。log4j.additivity.saveUserLog=falselog4j.appender.saveUserLog=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.saveUserLog.File=/jpm/log4j/saveUserLog.loglog4j.appender.saveUserLog.DatePattern=yyyy-MM-ddlog4j.appender.saveUserLog.Append=truelog4j.appender.saveUserLog.layout=org.apache.log4j.PatternLayoutlog4j.appender.saveUserLog.layout.ConversionPattern=%m%nlog4j.appender.error.encoding=UTF-8 (3)输出日志的代码示例
package jpm;
import org.apache.log4j.Logger;
public class TestLog4j {
public static void main(String[] args) {
final Logger logger = Logger.getLogger(TestLog4j.class); final Logger saveUserLog = Logger.getLogger("saveUserLog"); if (logger.isDebugEnabled()) {logger.debug("debug");logger.info("info");logger.error("error");saveUserLog.info("张三,男,26岁,北京大学,2018-05-19,学霸");}
} 4)以上代码示例生成的日志文件及日志详情


2
JUL ( java.util.logging)

1、JUL( java.util.logging) 介绍
Java Logging API 是 Sun 公司于 2002 年 5 月正式发布的。它是自 J2SE 1.4 版本开始提供的一个新的应用程序接口,JUL(在 java.util.logging 包下),需 JDK1.4 版本以上才能支持,java.util.logging.* 包是 JDK 的日志记录 API。

强烈不推荐使用 java.util.logging 记录日志,因此这里不提供对应示例。
3
java common logging

commons-logging 提供的是一个日志接口,是为那些需要建立在不同环境下使用不同日志架构的组件或库的开发者创建的,其中包括 log4j 以及 Java log 的日志架构。commons-logging 有两个基本的抽象类:Log(基本记录器) 和 LogFactory(负责创建 Log 实例)。把日志信息抽象成 commons-logging 的 Log 接口,并由 commons-logging 在运行时决定使用哪种日志架构。因为 Log4j 的强大功能,commons-logging 一般会和 Log4j 一起使用,这几乎成为了 Java 日志的标准工具。
4
SLF4J 介绍

SLF4J 全称为 Simple Logging Facade for JAVA,即 java 简单日志门面。和 commons-loging 一样也是对不同日志框架提供的一个门面封装,可以在部署的时候不修改任何配置即可接入一种日志实现方案,能支持多个参数,并通过 {} 占位符进行替换。
看这个 Log4J 示例:
Logger.debug("Hello " + name); 由于字符串拼接的问题(注:上述语句会先拼接字符串,再根据当前级别是否低于 debug 决定是否输出本条日志,即使不输出日志,字符串拼接操作也会执行),因此许多公司一般强制使用下面的语句,这样只有当前处于DEBUG级别时才会执行字符串拼接:
if (logger.isDebugEnabled()) {LOGGER.debug(“Hello ” + name);
} 它避免了字符串拼接问题,可是有点太繁琐了。而 SLF4J 提供下面这样简单的语法:
LOGGER.debug("Hello {}", name); 它的形式类似第一条示例,但是又没有字符串拼接问题,也不像第二条那样繁琐。
正是因为 SLF4J 的这个占位符功能,使得人们越来越多的地使用 SLF4J 这个接口用到实际开发项目中。
为什么需要日志接口,直接使用具体的实现不就行了吗?
接口用于定制规范,可以有多个实现,使用时是面向接口的(导入的包都是 SLF4J 的包或者是 JCL 的包,而不是具体某个日志框架中的包),即直接和接口交互,不直接使用实现,所以当需要更换实现的时候,直接更换实现就可以了,而不用更改代码中的日志相关代码。
比如:SLF4J 定义了一套日志接口,项目中使用的日志框架是 log4j,开发中调用的所有接口都是 SLF4J 的,不直接使用 log4j,项目应用调用 SLF4J 的接口,SLF4J 的接口去调用 log4j 的实现,整个应用程序并没有直接使用 log4j,当项目需要更换更加优秀的日志框架时(如 logback)只需要引入 logback 的 jar 和 logback 对应的配置文件即可,完全不用更改 Java 代码中的日志相关的代码 logger.info(“hello world”),也不用修改日志相关的类的导入的包(import org.slf4j.Logger; import org.slf4j.LoggerFactory;)。
因此日志门面的使用,为后续具体日志系统的实现更换带来了方便。
后面为大家介绍项目中的 Logback 使用示例。
相关文章:
Java 项目日志实例基础:Log4j
点击下方关注我,然后右上角点击...“设为星标”,就能第一时间收到更新推送啦~~~ 介绍几个日志使用方面的基础知识。 1 Log4j 1、Log4j 介绍 Log4j(log for java)是 Apache 的一个开源项目,通过使用 Log4j,我…...
K8S应用笔记 —— 签发自签名证书用于Ingress的https配置
一、需求描述 在本地签发自命名证书,用于K8S集群的Ingress的https配置。 前提条件: 完成K8S集群搭建。完成证书制作机器的openssl服务安装。 二、自签名证书制作 2.1 脚本及配置文件准备 2.1.1 CA.sh脚本准备 注意事项: openssl服务默认CA…...
webpack 和 ts 简单配置及使用
如何使用webpack 与 ts结合使用 新建项目 ,执行项目初始化 npm init -y会生成 {"name": "tsdemo01","version": "1.0.0","description": "","main": "index.js","scripts&…...
MATLAB算法实战应用案例精讲-【图像处理】交并比
目录 交并比 非极大值抑制 Soft NMS Soft NMS 提出背景 Soft NMS 算法流程 Soft NMS 算法示例...
[Machine Learning] decision tree 决策树
(为了节约时间,后面关于机器学习和有关内容哦就是用中文进行书写了,如果有需要的话,我在目前手头项目交工以后,用英文重写一遍) (祝,本文同时用于比赛学习笔记和机器学习基础课程&a…...
【数学建模】-- 数学规划模型
概述: 什么是数学规划? 数学建模中的数学规划是指利用数学方法和技巧对问题进行数学建模,并通过数学规划模型求解最优解的过程。数学规划是一种数学优化方法,旨在找到使目标函数达到最大值或最小值的变量取值,同时满足…...
SpringBoot使用RabbitMQ自动创建Exchange和Queue
背景 小项目,使用RabbitMQ作为消息队列,发布到不同的新环境时,由于新搭建的MQ中不存在Exchange和Queue,就会出错,还得手动去创建,比较麻烦,于是想在代码中将这些定义好后,自动控制M…...
【设计模式】订单状态流传中的状态机与状态模式
文章目录 1. 前言2.状态模式2.1.订单状态流转案例2.1.1.状态枚举定义2.1.2.状态接口与实现2.1.3.状态机2.1.4.测试 2.2.退款状态的拓展2.2.1.代码拓展2.2.2.测试 2.3.小结 3.总结 1. 前言 状态模式一般是用在对象内部的状态流转场景中,用来实现状态机。 什么是状态…...
2.js中attr()用来修改或者添加属性或者属性值
attr()可以用来修改或者添加属性或者属性值 例:<input type"button" class"btn btn-info" id"subbtn" style"font-size:12px" value"我也说一句"/>1.如果想获取input中value的值 $(#subbtn).attr(value);…...
【虫洞攻击检测】使用多层神经网络的移动自组织网络中的虫洞攻击检测研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
微分流形学习之一:基本定义
微分流形学习之一:基本定义引入 引言一、微分流形的历史简介二、拓扑空间三、微分流形 引言 本文是作者在学习微分流形的时候的笔记,尽量严格完整,并带有一定理解,绝不是结论的简单罗列。如果读者知道数学分析中的 ϵ − δ \ep…...
[C++]笔记-制作自己的静态库
一.静态库的创建 在项目属性c/c里面,选用无预编译头,创建头文件与cpp文件,需要注意release模式下还是debug模式,在用库时候要与该模式相匹配,库的函数实现是外界无法看到的,最后在要使用的项目里面导入.h文件和.lib文件 二.使用一个循环给二维数组赋值 行数 : 第几个元素 / …...
优酷视频码率、爱奇艺视频码率、B站视频码率、抖音视频码率对比
优酷视频码率、爱奇艺视频码率与YouTube视频码率对比 优酷视频码率: 优酷的视频码率可以根据视频质量、分辨率和内容类型而变化。一般而言,优酷提供了不同的码率选项,包括较低的标清(SD)码率和较高的高清(…...
用pytorch实现google net
GoogleNet(也称为Inception v1)是由Google在2014年提出的一个深度卷积神经网络架构。它在ImageNet Large Scale Visual Recognition Challenge (ILSVRC) 2014比赛中取得了优秀的成绩,并引起了广泛的关注。 GoogleNet的设计目标是构建一个更…...
2023-8-15差分矩阵
题目链接:差分矩阵 #include <iostream>using namespace std;const int N 1010;int n, m, q; int a[N][N], b[N][N];void insert(int x1, int y1, int x2, int y2, int c) {b[x1][y1] c;b[x1][y2 1] - c;b[x2 1][y1] - c;b[x2 1][y2 1] c; }int main…...
物理公式分类
(99 封私信 / 81 条消息) 定义式和决定式有什么区别,怎么区分? - 知乎 (zhihu.com) 1、首先,定义一个物理符号(物理量)来表征物理世界最直观/最基本的物理现象,例如,长度(米…...
vue实现登录注册
目录 一、登录页面 二、注册页面 三、配置路由 一、登录页面 <template><div class"login_container" style"background-color: rgb(243,243,243);height: 93.68vh;background-image: url(https://ts1.cn.mm.bing.net/th/id/R-C.f878c96c4179c501a6…...
SpringBoot复习:(55)在service类中的方法上加上@Transactional注解后,Spring底层是怎么生成代理对象的?
SpringBoot run方法代码如下: 可以看到它会调用refreshContext方法来刷新Spring容器,这个refreshContext方法最终会调用AbstractApplicationContext的refresh方法,代码如下 如上图,refresh方法最终会调用finisheBeanFactoryInit…...
常用的图像校正方法
在数字图像处理中,常用的校正方法包括明场均匀性校正、查找表(LUT)校正和伽玛(Gamma)校正。这些校正方法分别针对不同的图像问题,可以改善图像质量,提升图像的可读性和可分析性。下面是这三种校…...
AWS security 培训笔记
云计算的好处 Amazon S3 (Storage) Amazon EC2 (Compute) 上图aws 的几个支柱:安全是其中一个啦 其中安全有几个方面 IAMdetection基础架构保护数据保护应急响应 关于云供应商的责任 data center 原来长这样 ,据说非常之隐蔽的 如果有天退役了…...
2026年AI工程化的5大发展趋势:从模型到产品的必经之路
2026年AI工程化的5大发展趋势:从模型到产品的必经之路 导读: AI模型越来越强大,但如何将其稳定、高效地部署到生产环境?本文结合我过去3年的MLOps实战经验,深度剖析2026年AI工程化的核心趋势,助你从“会调参…...
STM32F4智能灯光控制系统实战:LVGL界面、传感器与MQTT物联网开发
1. 项目概述与核心价值最近在整理手头的嵌入式项目,翻出来一个基于STM32F4的智能灯光控制系统,感觉挺有代表性的。这个项目麻雀虽小,五脏俱全,它把单片机控制、传感器数据采集、GUI界面开发(LVGL)、物联网通…...
基于WiFi与OPC协议的可穿戴LED灯光同步系统设计与实现
1. 项目概述:打造你的无线光影秀发想象一下,你亲手制作的LED帽子、发光外套,甚至是手中的光绘道具,都能随着你电脑屏幕上的音乐可视化效果或视频内容同步闪烁、流动。无需复杂的编程,只需一个简单的播放指令࿰…...
别再给Claude送钱了!7个硬核技巧让Token消耗爆降80%,我亲测有效
文章目录前言1. 杀鸡不用牛刀:根据任务复杂度切换模型,别用导弹打蚊子2. 把CLAUDE.md当“项目宪法”,别当“信息垃圾场”3. 把脏活累活交给Subagent,但别滥用4. 精准打击!明确指定文件和行号,别让Claude大海…...
2025届毕业生推荐的AI辅助论文网站解析与推荐
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 当下,学术研究越发受到人们的重视,在此种背景状况之下,论…...
3步解锁Figma中文界面:设计师效率翻倍的终极指南
3步解锁Figma中文界面:设计师效率翻倍的终极指南 【免费下载链接】figmaCN 中文 Figma 插件,设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 还在为Figma的英文界面而烦恼?每次操作都要在大脑中翻译一遍&am…...
TPS40192与TPS40193多相降压控制器:DCR与CS电流检测方案深度对比与设计实践
1. 项目概述:从两颗芯片说起最近在做一个大电流的分布式电源项目,板子上需要给核心处理器和一堆外围芯片供电,电流需求从几安培到几十安培不等,电压轨也有好几路。这种场景下,传统的线性稳压器(LDO…...
[实战] 制造业全尺寸报告(Full Dimension Report)编制规范与数字化处理流程详解
在 2026 年的精密制造与质量管理体系中,全尺寸报告(Full Dimension Report,简称 FDR)已成为首件检验(FAI)和生产件批准程序(PPAP)中不可或缺的核心文档。今天分享一下在数字化工厂环…...
OpenClaw自动化配置实战:从入门到精通,打造高效工作流
1. 项目概述与核心价值最近在折腾开源自动化工具,发现了一个宝藏仓库:ShuyuZ1999/awesome-openclaw-configs。这个项目乍一看名字有点长,但核心价值非常明确——它是一个专门为开源自动化工具OpenClaw收集、整理和分享高质量配置文件的集合。…...
WarcraftHelper:5分钟解决魔兽争霸3现代系统兼容性问题
WarcraftHelper:5分钟解决魔兽争霸3现代系统兼容性问题 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 你是否还在为魔兽争霸3在现代电脑上…...
