Java 项目日志实例基础:Log4j

点击下方关注我,然后右上角点击...“设为星标”,就能第一时间收到更新推送啦~~~

介绍几个日志使用方面的基础知识。

1

Log4j

fb6ceead2c427c5462b2aaef9e2182f1.png

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)以上代码示例生成的日志文件及日志详情

d8dca088e245a94c7d6464f872b31714.png

57a8e00a38ed84091694908ad1a33cc5.png

2

JUL ( java.util.logging

24ce41531186c37c60b09e1095dc099a.png

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。

387d9265d990bdd29350d4a52868ce45.png

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

3

java common logging

d6739a7b48838816908b712dc6b667d8.png

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

4

SLF4J 介绍

7054e01b7c44537c79f8a8cb9dbcbb6f.png

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 使用示例。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从零开始学习 Java:简单易懂的入门指南之Objects、BigInteger、BigDecimal(十四)

常用API&#xff0c;Objects、BigInteger、BigDecimal 5 Objects类5.1 概述5.2 常见方法 6 BigInteger类6.1 引入6.2 概述6.3 常见方法6.4 底层存储方式&#xff1a; 7 BigDecimal类7.1 引入7.2 概述7.3 常见方法7.4 底层存储方式&#xff1a; 5 Objects类 5.1 概述 tips&…

Tesla Model S 3对比分析拆解图

文章来源&#xff1a;网络 需要特斯拉电驱样件的请&#xff1a;shbinzer &#xff08;拆车邦&#xff09; 5 款电机&#xff0c;其中扁线永磁同步电机最大功率从 202kW 提升至 220kW&#xff0c;最大扭矩从 404Nm提升至 440Nm。 Model S/X→Model 3/Y&#xff1a;双电机版本…

使用SpringBoot + Thymeleaf 完成简单的用户登录

&#x1f600;前言 本篇博文是关于Thymeleaf 的综合案例&#xff0c; 使用SpringBoot Thymeleaf 完成简单的用户登录-列表功能&#xff0c;希望你能够喜欢&#x1f60a; &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨…

PyTorch训练深度卷积生成对抗网络DCGAN

文章目录 DCGAN介绍代码结果参考 DCGAN介绍 将CNN和GAN结合起来&#xff0c;把监督学习和无监督学习结合起来。具体解释可以参见 深度卷积对抗生成网络(DCGAN) DCGAN的生成器结构&#xff1a; 图片来源&#xff1a;https://arxiv.org/abs/1511.06434 代码 model.py impor…

win系统部署Apollo-quick-start-2.1.0

win系统部署Apollo-quick-start-2.1.0 携程Apollo配置中心&#xff0c;官方部署包里提供了2个sql文件&#xff0c;需要刷入数据库。之后修改demo.sh里的数据库配置,最后使用git bash启动demo.sh刷sql脚本 官方部署包里提供了2个sql文件 修改demo.sh文件 使用git bash启动demo…

WinCC V7.5 中的C脚本对话框不可见,将编辑窗口移动到可见区域的具体方法

WinCC V7.5 中的C脚本对话框不可见&#xff0c;将编辑窗口移动到可见区域的具体方法 由于 Windows 系统更新或使用不同的显示器&#xff0c;在配置C动作时&#xff0c;有可能会出现C脚本编辑窗口被移动到不可见区域的现象。 由于该窗口无法被关闭&#xff0c;故无法进行进一步…

安防监控视频云存储EasyCVR平台H.265转码功能更新:新增分辨率配置

安防视频集中存储EasyCVR视频监控综合管理平台可以根据不同的场景需求&#xff0c;让平台在内网、专网、VPN、广域网、互联网等各种环境下进行音视频的采集、接入与多端分发。在视频能力上&#xff0c;视频云存储平台EasyCVR可实现视频实时直播、云端录像、视频云存储、视频存储…

微服务中间件-分布式缓存Redis

分布式缓存 a.Redis持久化1) RDB持久化1.a) RDB持久化-原理 2) AOF持久化3) 两者对比 b.Redis主从1) 搭建主从架构2) 数据同步原理&#xff08;全量同步&#xff09;3) 数据同步原理&#xff08;增量同步&#xff09; c.Redis哨兵1) 哨兵的作用2) 搭建Redis哨兵集群3) RedisTem…

小程序的数据绑定和事件绑定

小程序的数据绑定 1.需要渲染的数据放在index.js中的data里 Page({data: {info:HELLO WORLD,imgSrc:/images/1.jpg,randomNum:Math.random()*10,randomNum1:Math.random().toFixed(2)}, }) 2.在WXML中通过{{}}获取数据 <view>{{info}}</view><image src"{{…

设计模式之责任链模式

简介 责任链模式是一种行为设计模式&#xff0c; 允许你将请求沿着处理者链&#xff08;单向链表&#xff09;进行发送。 收到请求后&#xff0c; 每个处理者根据自身条件对请求进行处理&#xff0c; &#xff0c;如果处理不了则将其传递给链上的下个处理者&#xff0c;以此类…

【LVS】3、LVS+Keepalived群集

为什么用它&#xff0c;为了做高可用 服务功能 1.故障自动切换 2.健康检查 3.节点服务器高可用-HA Keepalived的三个模块&#xff1a; core&#xff1a;Keepalived的核心&#xff0c;负责主进程的启动、维护&#xff1b;调用全局配置文件进行加载和解析 vrrp&#xff1a;实…

5个高清视频素材网站

推荐5个高清视频素材网站&#xff0c;免费、付费、商用的都有&#xff0c;可根据自己需求去选择&#xff0c;赶紧收藏吧&#xff01; 菜鸟图库 https://www.sucai999.com/video.html?vNTYxMjky ​ 菜鸟图库网素材非常丰富&#xff0c;网站主要还是以设计类素材为主&#xff…

Spring-Bean的生命周期

目录 生命周期汇总 细分生命周期 1.实例化 2.属性赋值&#xff08;依赖注入&#xff09; 3.Aware接口 4.BeanPostProcessor接口 5.初始化 6.销毁 测试验证 类结构 业务类 测试类 生命周期汇总 Spring Bean 的生命周期见下图 &#xff08;一定记忆好下图&#x…

二进制数的左移和右移位运算numpy.left_shift()numpy.right_shift()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 二进制数的左移和右移位运算 numpy.left_shift() numpy.right_shift() [太阳]选择题 下列代码最后一次输出的结果是&#xff1f; import numpy as np a 8 print("【显示】a ", a)…

【编织时空四:探究顺序表与链表的数据之旅】

本章重点 链表的分类 带头双向循环链表接口实现 顺序表和链表的区别 缓存利用率参考存储体系结构 以及 局部原理性。 一、链表的分类 实际中链表的结构非常多样&#xff0c;以下情况组合起来就有8种链表结构&#xff1a; 1. 单向或者双向 2. 带头或者不带头 3. 循环或者非…

CANoe软件Tools中无法找到LDF Explorer

关联文章&#xff1a; LDF概述和LDF Explorer工具介绍 问题描述 使用CANoe软件的菜单栏Tools中无法找到LDF Explorer 原因分析/解决方案&#xff1a; ①查看CANoe硬件是否带LIN license&#xff0c;并且license在正常激活时间内。 ②查看CANoe是否配置了LIN通道&#xff0c;…

【链表】经典链表题LeetCode

文章目录 160. 相交链表 简单&#x1f525;206. 反转链表 简单&#x1f525;876. 链表的中间结点 简单234. 回文链表 简单&#x1f525;141. 环形链表 简单&#x1f525;142. 环形链表 II 中等&#x1f525;21. 合并两个有序链表 简单&#x1f525;2. 两数相加 中等&#x1f52…

【Unity】ShaderGraph应用(模型膨胀流动)

【Unity】ShaderGraph应用&#xff08;模型膨胀流动&#xff09; 实现效果 ShaderGraph是 unity的图形化 Shader 编程工具。本文介绍使用ShaderGraph实现模型的膨胀流动效果。该效果可以由于模拟流体在管线中的流动等相关功能。 一、实现的方法 1.使用节点介绍 关键节点 UV…

【Redis实践篇】使用Redisson 优雅实现项目实践过程中的5种场景

文章目录 1.前言2.使用方式1. 添加Redisson依赖&#xff1a;2. 配置Redis连接信息3. 使用场景3.1. 分布式锁3.2. 限流器&#xff08;Rate Limiter&#xff09;3.3. 可过期的对象&#xff08;Expirable Object&#xff09;3.4. 信号量&#xff08;Semaphore&#xff09;3.5. 分布…

首起针对国内金融企业的开源组件投毒攻击事件

简述 2023年8月9日&#xff0c;墨菲监控到用户名为 snugglejack_org (邮件地址&#xff1a;SnuggleBearrxxhotmail.com&#xff09;的用户发布到 NPM 仓库中的 ws-paso-jssdk 组件包具有发向 https://ql.rustdesk[.]net 的可疑流量&#xff0c;经过确认该组件包携带远控脚本&a…