当前位置: 首页 > news >正文

java日志

日志是软件开发的重要组成部分。一个精心编写的日志代码提供快速的调试,维护方便,以及应用程序的运行时信息结构化存储。日志记录确实也有它的缺点。它可以减缓的应用程序

Log4j

Log4j是Apache的一个开放源代码项目,通过使用Log4j,

我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务 器、NT的事件记录器、UNIX Syslog守护进程等;

我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。

日志级别

DEBUG < INFO < WARN < ERROR < FATAL,分别用来指定这条日志信息的重要程度

如下定义日志级别为info级别,那么error和warn的日志可以显示而比他优先级低的debug信息就不显示

log4j.rootLogger=info,A1,B2,C3 

log4j.properties

lg4j使用:第⼀步,在 pom.xml ⽂件中引⼊ Log4j 包:

<dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version>
</dependency>

第⼆步,在 resources ⽬录下创建 log4j.properties ⽂件

这个配置文件告 诉Log4J以什么样的格式、把什么样的信息、输出到什么地方。

log4j.rootLogger = info,stdout### 输出信息到控制台 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
Log4j有三个主要的组件:Loggers(记录器),Appenders(输出源)和Layouts(布局),这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出

Appenders 输出源

Log4j日志系统允许把日志输出到不同的地方,如控制台(Console)、文件(Files)、根据天数或者文件大小产生新的文件、以流的形式发送到其它地方等等。

  •  org.apache.log4j.ConsoleAppender(控制台)

  •  org.apache.log4j.FileAppender(文件)

  •  org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)

  • org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)

  •  org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

配置时语法如下:

log4j.appender.appenderName = fully.qualified.name.of.appender.class 
log4j.appender.appenderName.option1 = value1 
… 
log4j.appender.appenderName.option = valueN

第一次看,我就很懵。这option1、value1啥玩意???


Layouts 布局

有时用户希望根据自己的喜好格式化自己的日志输出。Log4j可以在Appenders的后面附加Layouts来完成这个功能。

Log4j 提供的格式有下⾯ 4 种:

  • org.apache.log4j.HTMLLayout:HTML 表格

  • org.apache.log4j.PatternLayout:⾃定义

  • org.apache.log4j.SimpleLayout:包含⽇志信息的级别和信息字符串

  • org.apache.log4j.TTCCLayout:包含⽇志产⽣的时间、线程、类别等等信息

配置时语法如下:

log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class 
log4j.appender.appenderName.layout.option1 = value1 
… 
log4j.appender.appenderName.layout.option = valueN

⾃定义格式的参数

%m:输出代码中指定的消息

%p:输出优先级

%r:输出应⽤启动到输出该⽇志信息时花费的毫秒数

%c:输出所在类的全名

%t:输出该⽇志所在的线程名

%n:输出⼀个回⻋换⾏符

%d:输出⽇志的时间点

%l:输出⽇志的发⽣位置,包括类名、线程名、⽅法名、代码⾏数

[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

Log4j程序中使用

在对Logger实例进行命名时,没有限制,可以取任意自己感兴趣的名字。一般情况下建议以类的所在位置来命名Logger实例,这是目前来讲比较有效的Logger命名方式。这样可以使得每个类建立自己的日志信息,便于管理。比如:

Logger.getLogger(Log4jExample.class.getName ())

import org.apache.log4j.Logger;/*** @Description:* @Author: 小羽毛* @Date: 2023/3/7 20:41*/
public class Log4jExample {static Logger logger = Logger.getLogger(Log4jExample.class.getName ()) ;public static void main(String[] args) {// 记录debug级别的信息logger.debug("debug.");// 记录info级别的信息logger.info("info.");// 记录error级别的信息logger.error("error.");}
}

因为配置了日志级别是info级别,所以debug级别的信息不会打印到控制台


Log4j使用注意点

  1. 在打印 DEBUG 级别的⽇志时,切记要使⽤ isDebugEnabled()

如果⽇志系统的级别不是 DEBUG,就会多执⾏了字符串拼接的操作,⽩⽩浪费了性能。
if(logger.isDebugEnabled()) {logger.debug("⽤户名是:" + getName());
}

2、在打印⽇志的时候带上类的全名和线程名,在多线程环境下,这点尤为重要,否则定位问题的时候就太难了


SLF4J

为什么让你用slf4j

  1. 在使⽤⽇志系统的时候,⼀定要使⽤ SLF4J 作为⻔⾯担当

  1. SLF4J 可以统⼀⽇志系统,作为上层的抽象接⼝,不需要关注底层的⽇志实现,可以是 Log4j,也可

以是 Logback,或者 JUL、JCL。

3.使用slf4j后不再需要 isDebugEnabled() 先进⾏判断

slf4j是如何将自己的通用日志格式转成不同的日志系统的格式的呢?
不同日志系统包都会有一个Adapter,用来在slf4j和不同日志系统之间做转换

第⼀步,把 log4j 的依赖替换为 slf4j-log4j12

<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.25</version>
</dependency>

第⼆步,在 resources ⽬录下创建 log4j.properties ⽂件,内容和上面⼀篇完全相同


SLF4J 参数化日志消息

SLF4J 在打印⽇志的时候使⽤了占位符 {} 。

解决锚点:字符串拼接会创建很多不必要的字符串对象,极⼤的消耗了内存空间.如下

String name = "小羽毛";
int age = 8;
logger.debug(name + ",年纪:" + age + ",阿姨有糖吃吗");
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class SLF4jExample {static Logger logger = LoggerFactory.getLogger(SLF4jExample.class.getName ()) ;public static void main(String[] args) {logger.info("{},想问问阿姨有糖吃吗","小羽毛");}
}

还可以在消息中使用两个参数 -

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class SLF4jExample {static Logger logger = LoggerFactory.getLogger(SLF4jExample.class.getName ()) ;public static void main(String[] args) {logger.info("颜值:{} 分, 天赋 {}分", 100, 99);}
}

Logback

Spring Boot默认

Spring Boot 的默认⽇志框架使⽤的是 Logback。

第⼀步,在 pom.xml ⽂件中添加 Logback 的依赖:

<dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.3</version>
</dependency>

Maven 会⾃动导⼊另外两个依赖:

logback-core 是 Logback 的核⼼,logback-classic 是 SLF4J 的实现

切换零改动

如果项⽬是从 Log4j + SLF4J 切换到 Logback 的话,此时的代码是零改动的。

第二步,在 resource ⽬录下增加 logback-test.xml ⽂件

<configuration debug="true">
<!--    配置⽇志的输出⽬的地--><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder>
<!--            pattern ⽤来指定⽇志的输出格式--><pattern>%d{HH:mm:ss.SSS} %relative [%thread] %-5level %logger{36}- %msg%n</pattern></encoder></appender><root level="debug"><appender-ref ref="STDOUT" /></root>
</configuration>

如果你很懒,那么 https://logback.qos.ch/translator/

可以直接把 log4j.properties 转成 logback-test.xml:

Log4j 2

Log4j、SLF4J、Logback 是⼀个爹——Ceki Gulcu,但 Log4j 2 却是例外,它是 Apache 基⾦会的产

品。

相关文章:

java日志

日志是软件开发的重要组成部分。一个精心编写的日志代码提供快速的调试&#xff0c;维护方便&#xff0c;以及应用程序的运行时信息结构化存储。日志记录确实也有它的缺点。它可以减缓的应用程序Log4jLog4j是Apache的一个开放源代码项目&#xff0c;通过使用Log4j&#xff0c;我…...

研发中台拆分过程的一些心得总结

背景在 21 年&#xff0c;中台拆分在 21 年&#xff0c;以下为中台拆分的过程心得&#xff0c;带有一定的主观&#xff0c;偏向于中小团队中台建设参考&#xff08;这里的中小团队指 3-100 人的团队&#xff09;&#xff0c;对于大型团队不太适用&#xff0c;毕竟大型团队人中 …...

HTTP介绍

HTTP1、简介HTTP概念&#xff1a;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff0c;规定了浏览器和服务器之间数据传输的规则。数据传输的规则指的是请求数据和响应数据需要按照指定的格式进行传输。如果想知道具体的格式&#xff0c;可以打开浏览器&#xf…...

10 卷积神经网络及python实现

1 卷积神经网络简介 卷积神经网络(Convolutional Neural Network, CNN)由LeCun在上世纪90年代提出。 LeCun Y., Bottou L., Bengio Y., and Haffner P., Gradient-based learning applied to document recognition, Proceedings of the IEEE, pp. 1-7, 1998. 卷积核和特征图&…...

【立体匹配论文阅读】AANet: Adaptive Aggregation Network for Efficient Stereo Matching

Authors: Haofei Xu, Juyong Zhang Link: https://arxiv.org/abs/2004.09548 Years: 2020 Credit Novelty and Question set up 主流的立体匹配模型的代价聚合操作主要用了3D卷积&#xff0c;这部分操作的算力和内存消耗过大&#xff0c;因此作者提出一种新的模型AANet&#x…...

服务器防入侵攻击,安全加固措施

服务器防入侵攻击&#xff0c;安全加固措施当服务器被入侵&#xff0c;被攻击的时候&#xff0c;很多服务器维护人员不懂得如何去防止入侵&#xff0c;防止黑客的攻击&#xff0c;只能眼巴巴的看着服务器被任意的攻击&#xff0c;给服务器上的网站造成严重的经济损失&#xff0…...

解读:“出境标准合同”与“出境安全评估”要点与异同

《数据安全法》第四条及《个人信息保护法》第三章对数据出境、个人信息跨境提出明确要求&#xff0c;《数据安全法》与《个人信息保护法》存在互相包含、被包含、衔接、特性、独立性、相互补充等内涵。本文通过上位法互相衔接、关联、特性的思路&#xff0c;去观察《个人信息出…...

python带你成功复刻热门手机游戏——飞翔的小鸟

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 飞翔的小鸟&#xff08;游戏英文名&#xff1a;Flappy Bird&#xff09; 一款由越南独立开发者开发的手机游戏&#xff0c;是之前非常流行的一款手机游戏 小游戏目标&#xff1a;让小鸟穿过管子&#xff0c;不要碰到任何物体…...

YOLOv8初体验:检测、跟踪、模型部署

安装 YOLOv8有两种安装方式&#xff0c;一种是直接用pip命令安装&#xff1a; pip install ultralytics另外一种是通过源码安装&#xff1a; git clone https://github.com/ultralytics/ultralytics cd ultralytics pip install -e .[dev]安装完成后就可以通过yolo命令在命令…...

Vue 监听(watch handler)

普通监听 缺点&#xff1a;不能深度监听&#xff08;对象属性的改变&#xff09;&#xff0c;刷新或首次加载不能执行。 watch: { carts: function (val, oldVal) { console.log(new: %s, old: %s, val, oldVal) } } 高级监…...

前端代码质量-圈复杂度原理和实践

1. 导读 你们是否也有过下面的想法&#xff1f; 重构一个项目还不如新开发一个项目…这代码是谁写的&#xff0c;我真想… 你们的项目中是否也存在下面的问题&#xff1f; 单个项目也越来越庞大&#xff0c;团队成员代码风格不一致&#xff0c;无法对整体的代码质量做全面的…...

汽车微控制器芯片F280039CPZRQ1、F280039CSPM、F280039CSPN规格参数

F280039CPZRQ1、F280039CSPM、F280039CSPN是C2000实时微控制器系列中的一款器件。C2000微控制器是可扩展、超低延迟器件&#xff0c;旨在提高电力电子设备的效率&#xff0c;包括但不限于&#xff1a;高功率密度、高开关频率&#xff0c;并支持使用 GaN和SiC技术。F280039CPZRQ…...

禾观科技三面经历

智力题 一天中时针和分钟重合多少次 由于时针1分钟旋转的圆心角度数为0.5度(30/60min) 分针1分钟旋转的圆心角度为6度(30/5min) 当两针第一次重合时后到第二次重合,分针比时针多旋转过的圆心角度数为360度。(快的比慢的多跑一圈,也就是360度) 这类问题实际上是分针追时…...

Spring Boot 实现接口幂等性的 4 种方案

一、什么是幂等性 幂等是一个数学与计算机学概念&#xff0c;在数学中某一元运算为幂等时&#xff0c;其作用在任一元素两次后会和其作用一次的结果相同。 在计算机中编程中&#xff0c;一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数或幂…...

Android Studio开发APP

1.下载Android Studio 官网下载:Android Studio for Window ... 百度云下载:android-studio-bundle-141.1903250-windows.exe Android Studio 是谷歌推出的一个Android集成开发工具,基于IntelliJ IDEA. 类似 Eclipse ADT,Android Studio 提供了集成的 Android 开发工具用…...

Spring之实例化Bean _ @Resource和@Autowired实现原理(3)

目录 1. 搜集注解信息 applyMergedBeanDefinitionPostProcessor(*) 2. 将实例化的Bean放入3级缓存中 addSingletonFactory&#xff08;***&#xff09;为循环依赖做准备 3. 根…...

华为HCIE学习之Openstack Cinder组件(cinder对接glusterfs)

文章目录一、MQ的作用二、cinder架构图三、各组件的作用四、cinder对接glusterfs一、MQ的作用 服务内各组件交互通过MQ进行 二、cinder架构图 IET&#xff0c;Linux用软件做存储&#xff0c;CNA识别过去就是IETTGT&#xff0c;物理存储&#xff0c;CNA识别过去就是TGT 三、…...

关于Go语言的底层,你想知道的都在这里!

文章目录1. GoLang语言1.1 Slice1.2 Map1.3 Channel1.4 Goroutine1.5 GMP调度1.6 垃圾回收机制1.7 其他知识点2. Web框架Gin和微服务框架Micro2.1 Gin框架2.2 Micro框架2.3 Viper2.4 Swagger2.5 Zap2.6 JWT文章字数大约1.95万字&#xff0c;阅读大概需要65分钟&#xff0c;建议…...

每日一问-ChapGPT-20230308-关于技术与思考的问题

文章目录每日一问-ChapGPT系列起因每日一问-ChapGPT-20230308-关于技术与思考的问题matplotlib_venn 中 venn2函数调用时&#xff0c;subsets传入A list (or a tuple) containing two set objects&#xff0c;怎么理解plt.pie() 包含哪些参数&#xff0c;以及每个参数的意义mat…...

Oracle表分区的创建、新增、拆分

Oracle中为了方便管理、查询数据当数据量大于500w或者2G时最好用分区表&#xff0c;常见的一种是使用时间作为分区。 分区表添加新的分区有 2 种情况&#xff1a; (1) 原分区里边界是 maxvalue 或者 default。 这种情况下&#xff0c;我们需要把边界分区 drop 掉&#xff0c;加…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发&#xff0c;其初衷是为了满足他自己的一个项目需求&#xff0c;即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源&#xff0c;Redis凭借其简单易用、…...

Caliper 配置文件解析:fisco-bcos.json

config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...

鸿蒙(HarmonyOS5)实现跳一跳小游戏

下面我将介绍如何使用鸿蒙的ArkUI框架&#xff0c;实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...