日志相关的学习记录
Logger.error还不知道怎么传参打印?看完这个你就明白了-CSDN博客
日志使用的方式
-
使用e.getMessage()、e .toString() 都不会打印堆栈信息,最好直接打印e。
-
当使用两个参数error(String message, Throwable t),且第二个参数为Throwable(就是catch的的exception e)时,才会将完整的异常堆栈(就是显示哪一行出了问题,而不是只是输出报什么错)打印出来
-
使用多个参数的error方法时,如果需要包含e参数,要把e参数放在末尾,才会完整的打印出错误堆栈信息。如:Logger.error("打印1{},打印2{},异常信息: ",123,“456”,e)。
以后写代码一定报错输出一定要先打印出日志的prefix,要不看日志都不知道是啥哪个报文出问题
java Logger.error打印错误异常的详细堆栈信息-CSDN博客
使用Logger.error(e)、Logger.error(e.getMessage())、Logger.error(“some msg” + e)、Logger.error(“some msg” + e.getMessage()) 都是调用的error(Object message),这个方法都会将入参当作Object输出,不会打印堆栈信息。
在使用Logger.error("first param ",e)时会调用error(String message, Throwable t),此方法会完整的打印出错误堆栈信息。
通常情况下,我们都是使用Logger所在的类的名称来作为Logger的名称
示例:
public class TestLogError {
public static final Logger log = LoggerFactory.getLogger(TestLogError.class);
public class test {
public class test { public static final Logger LOGGER = LogManager.getLogger(test.class);
两种使用的区别
maven项目构建以及原因:
使用maven的原因:因为使用maven,会使得项目管理比较容易。
团队中某一人新导入了一个jar包,如果没有maven,他则需要给团队中每个人拷贝一个jar包,并提示他们添加jar包到项目中,如果有maven,他则需要提示团队中的人更新一下pom.xml文件,maven则会帮你把相关jar包都完美地添加到项目中。
新建maven项目
通过idea建立maven项目_ideal只想创建一个有pom文件的maven项目-CSDN博客
普通项目变成maven项目:
1.暴力
普通java web项目转为maven项目_java项目改成maven项目-CSDN博客
2.推荐,引入maven后会生成一个pom.xml文件和对应的目录结构(但是需要自己新增配置文件)
3步将普通Java项目转成maven项目(IntelliJ IDEA)_怎樣將一個新建的普通java項目手動變成一個maven項目-CSDN博客
在IDEA中创建properties配置文件_idea创建properties配置文件-CSDN博客
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;/*** @author hw* @PROJECT_NAME:* @DESCRIPTION:*/
public class Test {public static final Logger LOGGER = org.apache.log4j.Logger.getLogger(Test.class);
// 在代码中显式指定 log4j 配置文件的路径:static {PropertyConfigurator.configure("src/main/resources/Test.properties");}public static void main(String[] args) {try{// 模拟空指针异常//Integer nullInt = Integer.valueOf(null);int[] array = {1,2,3,4,5};int outBoundInt = array[5];}catch (Exception e){// 直接打印,则只输出异常类型LOGGER.error(e);// 使用字符串拼接LOGGER.error("使用 + 号连接直接输出 e : " + e);LOGGER.error("使用 + 号连接直接输出 e.getMessage() : " + e.getMessage());LOGGER.error("使用 + 号连接直接输出 e.toString() : " + e.toString());// 使用逗号分隔,调用两个参数的error方法LOGGER.error("使用 , 号 使第二个参数作为Throwable : ", e);// 尝试使用分隔符,第二个参数为Throwable,会发现分隔符没有起作用,第二个参数的不同据,调用不同的重载方法LOGGER.error("第二个参数为Throwable,使用分隔符打印 {} : ", e);}}
}
注意:如果配置文件命名是log4j.properties就不需要指定路径了
如图:
输出到控制台:
pom文件:可以在先在代码里面import class时候再去点击代码里面的import 想学习,就会显示提示add depencies
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>groupId</groupId><artifactId>test</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency></dependencies>
<!-- 确保项目构建时将 log4j.properties 文件包含在最终的 JAR 或 WAR 文件中。--><build><resources><resource><directory>src/main/resources</directory><includes><include>**/*.properties</include></includes></resource></resources></build></project>
配置文件:
# 设置根日志级别为 INFO
log4j.rootLogger=INFO, console
# 这一行设置了根日志记录器的日志级别为 INFO,并指定了一个名为 "console" 的 appender。这意味着只有 INFO 及以上级别的日志会被记录,并且这些日志会通过 "console" appender 输出。# 定义控制台日志记录器
log4j.appender.console=org.apache.log4j.ConsoleAppender
# 这一行定义了一个名为 "console" 的 appender,类型为 `org.apache.log4j.ConsoleAppender`。这个 appender 会将日志输出到控制台。# 设置控制台日志记录器的目标
log4j.appender.console.Target=System.out
# 这一行指定了 "console" appender 的目标为 `System.out`,即标准输出流,也就是控制台。# 设置日志布局
log4j.appender.console.layout=org.apache.log4j.PatternLayout
# 这一行设置了 "console" appender 的布局格式为 `org.apache.log4j.PatternLayout`,允许自定义日志的输出格式。# 设置日志格式
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
# 这一行定义了日志的具体输出格式:
# - `%d{yyyy-MM-dd HH:mm:ss}`:日期和时间格式,例如 "2023-10-01 12:34:56"。
# - `%-5p`:日志级别,左对齐,宽度为 5 个字符,例如 "INFO "。
# - `%c{1}`:日志记录器的名称,只显示最后一级,例如 "Test"。
# - `%L`:日志记录的行号,例如 "123"。
# - `%m`:
一般都设置同时输出到控制台和文件:
# 设置根日志级别为 INFO,日志通过 console 和 file 两个 appender 输出
log4j.rootLogger=INFO,console,file# 定义控制台日志记录器
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n# 定义文件日志记录器
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=logs/app.log # 输出到文件 logs/app.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
Appenders 必须存在,否则根日志记录器就没有输出目标,日志消息就无法被处理。
没有app.log就会自动新建一个,这个文件是自定义的,如图
log4j.rootLogger=INFO,console,file2
log4j.appender.file2=org.apache.log4j.FileAppender
#默认输出到当前项目根目录下的 logs/app.log 文件中
log4j.appender.file2.File=logs/app.log # 输出到文件 logs/app.log
log4j.appender.file2.layout=org.apache.log4j.PatternLayout
这几个属性是必备的,没有就没法输出
拓展:
为什么配置文件要放在 classpath
中?
-
自动加载:Log4j 会自动加载类路径中的配置文件,无需额外的配置或代码。只要配置文件位于类路径下,Log4j 会自动加载它。
- 可移植性:当项目被打包成 JAR 或 WAR 文件时,配置文件依然会被包含在其中并可被读取。
-
环境独立性:你可以根据不同的环境(如开发、测试、生产)提供不同的配置文件。通过不同的类路径配置文件,Log4j 可以在不同的环境中使用不同的日志策略。
拓展:
C:\path\to\libs\* 表示 C:\path\to\libs 目录下的所有 JAR 文件。这是 Java 类路径(Classpath)的一种常见表示方式,用于告诉 JVM 或编译器在指定目录下查找所有的 JAR 文件。
至于为什么不能是 WAR 文件:
文件格式不同:
JAR 文件:Java Archive 文件,用于打包 Java 类文件、资源文件等。JAR 文件可以被 JVM 直接加载和使用。
WAR 文件:Web Application Archive 文件,用于打包 Web 应用程序,包括 JSP、HTML、JavaScript、CSS 文件以及 JAR 文件等。WAR 文件通常部署在应用服务器(如 Tomcat、Jetty)上,而不是直接被 JVM 加载
public class Test {
public static final Logger LOGGER = org.apache.log4j.Logger.getLogger(StringBufferExample.class);
修改一开始加载的文件,日志就会显示别的文件名
点击getlogger方法可以看到有很多重载方式;
相关文章:

日志相关的学习记录
Logger.error还不知道怎么传参打印?看完这个你就明白了-CSDN博客 日志使用的方式 使用e.getMessage()、e .toString() 都不会打印堆栈信息,最好直接打印e。 当使用两个参数error(String message, Throwable t),且第二个参数为Throwable(就是…...

HTML和JavaScript实现商品购物系统
下面是一个更全面的商品购物系统示例,包含新增商品、商品的增加删除以及结算找零的功能。这个系统使用HTML和JavaScript实现。 1.功能说明: 这个应用程序使用纯HTML和JavaScript实现。 包含一个商品列表和一个购物车区域。商品列表中有几个示例商品&a…...

深度学习中的激活函数
激活函数(activation function)是应用于网络中各个神经元输出的简单变换,为其引入非线性属性,使网络能够对更复杂的数据进行建模,使其能够学习更复杂的模式。如果没有激活函数,神经元只会对输入进行枯燥的线性数学运算。这意味着&…...

编写php项目所需环境
需要编写php项目,需要看到编写的代码展现的效果,这里我选择用xampp来展现 准备工作: https://learncodingfast.com/how-to-install-xampp-and-brackets/#Installing_and_Running_XAMPP xampp下载地址:https://www.apachefriends.…...
华为机试HJ108 求最小公倍数
首先看一下题 描述 正整数A和正整数B 的最小公倍数是指 能被A和B整除的最小的正整数值,设计一个算法,求输入A和B的最小公倍数。 数据范围: 1≤a,b≤100000 输入描述: 输入两个正整数A和B。 输出描述: 输出A和B的最小公…...

【Python技术】同花顺wencai涨停分析基础上增加连板分析
周末,有读者加我, 说 之前的涨停分析 是否可以增加连板分析。 这个可以加上。 先看效果 这里附上完整代码: import streamlit as st import pywencai import pandas as pd from datetime import datetime, timedelta import plotly.graph_o…...

《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(五)
《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(五) 你好,我是拉依达。 感谢所有阅读关注我的同学支持,目前博客累计阅读 27w,关注1.5w人。其中博客《最全Linux驱动开发全流程详细解析(持续更新)-CSDN博客》已经是 Linux驱动 相关内容搜索的推荐首位,感谢大家支持。 《拉…...

【LeetCode】3356、零数组变换 II
【LeetCode】3356、零数组变换 II 文章目录 一、数据结构-差分-一维差分、二分1.1 数据结构-差分-一维差分、二分1.1.1 题意复述1.1.2 思路1.1.3 手写二分1.1.4 sort.Search() 二分1.1.5 sort.Find() 二分 二、多语言解法 一、数据结构-差分-一维差分、二分 1.1 数据结构-差分…...
Vue 子组件修改父组件传过来的值的三种方式
方式1:子组件发送emit,触发父组件修改 父组件 <template><div><son :count"count" updateCount"updateCount" /></div> </template><script> import son from "./son"; export def…...
4.Python 数字类型
Python 数字类型总结 文章目录 Python 数字类型总结1. 数字类型概述特点 2. 数字类型的创建与赋值3. 数字类型转换4. 数学运算与函数math 模块cmath 模块 5. 随机数生成6. 三角函数7. 数学常量 总结 Python 提供了多种数字类型来存储和操作数值数据。这些类型包括整数、浮点数、…...
MacOs 日常故障排除troubleshooting
1. 关闭开机自启动 app X macOs 15.1 System settings -> General -> Login Items & Extensions->Open at Login -> Select app X and click -...

(补)算法刷题Day19:BM55 没有重复项数字的全排列
题目链接 给出一组数字,返回该组数字的所有排列 例如: [1,2,3]的所有排列如下 [1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2], [3,2,1]. (以数字在数组中的位置靠前为优先级,按字典序排列输出。) 思路: 使用回…...
golang中的值传递与引用传递,如何理解结构体的方法?
先从一个例子说起 type Counter struct {count int }func (c Counter) Inc() {c.count }func test1() {c : Counter{}do : func() {for i : 0; i < 10; i {c.count}fmt.Println("done")}go do()go do()time.Sleep(3 * time.Second)fmt.Println(c.count) }func te…...

linux部署ansible自动化运维
ansible自动化运维 1,编写ansible的仓库(比赛已经安装,无需关注) 1、虚拟机右击---设置---添加---CD/DVD驱动器---完成---确定 2、将ansible.iso的光盘连接上(右下角呈绿色状态) 3、查看光盘挂载信息 df -h…...
docker—私有仓库搭建
docker—私有仓库搭建 HTTP 部署 docker run -d \-p 5000:5000 \--restartalways \--name registry \-v /opt/data/registry:/var/lib/registry \registry:2使用官方的 registry 镜像来启动私有仓库。默认情况下,仓库会被创建在容器的 /var/lib/registry 目录…...

【SpringAOP】深入浅出SpringAOP从原理到源码
AOP对象是如何创建的 对于熟悉Spring IOC流程源码的同学来说,一定了解bean的整个生命周期,也就是从实例化、属性填充、初始化三个过程。那么对于Bean 工厂来说,是如何保证需要创建代理的对象创建代理的呢。 从图中可以看到,本质…...

Java 从查询超时到性能提升 (实战讲解)
目录 1. 问题所示2. 原理分析3. 解决方法3.1 代码优化3.2 索引优化3.3 删数据 1. 问题所示 查询返回速度慢,导致前端页面无数据显示 前端和后端均未报错,但后端未能在合理时间内返回结果到前端 后端没有报错日志 2. 原理分析 单独分析代码中的对算法…...
《C 语言携手 PaddlePaddle C++ API:开启深度学习开发新征程》
在深度学习领域,PaddlePaddle 作为一款强大的深度学习框架,为开发者提供了丰富的功能和高效的计算能力。而 C 语言,凭借其高效性和广泛的应用场景,与 PaddlePaddle 的 C API 相结合,能够为深度学习开发带来独特的优势。…...
Mysql之存储过程
MySQL 存储过程(Stored Procedure) 1. 概念 存储过程是一组预编译的 SQL 语句集合,可以通过调用名称来执行。存储过程可以接收参数,并支持复杂的业务逻辑(如条件语句、循环、异常处理等)。它们可以提高代…...

XV6 开发环境搭建
Step 1 搭建ubuntu 20.04 虚拟机 注意:一定要使用ubuntu 20.04,该版本可以直接通过deb安装gnu编译工具链。 安装完虚拟机后,换apt源。 ubuntu20.04镜像下载链接 设置root账户密码: sudo passwd root Step 2 下载解压qemu 5.1.0 wget ht…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...
xmind转换为markdown
文章目录 解锁思维导图新姿势:将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件(ZIP处理)2.解析JSON数据结构3:递归转换树形结构4:Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...
flow_controllers
关键点: 流控制器类型: 同步(Sync):发布操作会阻塞,直到数据被确认发送。异步(Async):发布操作非阻塞,数据发送由后台线程处理。纯同步(PureSync…...
深入理解 React 样式方案
React 的样式方案较多,在应用开发初期,开发者需要根据项目业务具体情况选择对应样式方案。React 样式方案主要有: 1. 内联样式 2. module css 3. css in js 4. tailwind css 这些方案中,均有各自的优势和缺点。 1. 方案优劣势 1. 内联样式: 简单直观,适合动态样式和…...

【PX4飞控】mavros gps相关话题分析,经纬度海拔获取方法,卫星数锁定状态获取方法
使用 ROS1-Noetic 和 mavros v1.20.1, 携带经纬度海拔的话题主要有三个: /mavros/global_position/raw/fix/mavros/gpsstatus/gps1/raw/mavros/global_position/global 查看 mavros 源码,来分析他们的发布过程。发现前两个话题都对应了同一…...

RushDB开源程序 是现代应用程序和 AI 的即时数据库。建立在 Neo4j 之上
一、软件介绍 文末提供程序和源码下载 RushDB 改变了您处理图形数据的方式 — 不需要 Schema,不需要复杂的查询,只需推送数据即可。 二、Key Features ✨ 主要特点 Instant Setup: Be productive in seconds, not days 即时设置 :在几秒钟…...