log4j,slf4j (日志记录工具)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 一个logger对应着若干个appender和一个日志级别。 一个appender对应着一个输出位置与格式。 1.获取 <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</vers

一个logger对应着若干个appender和一个日志级别。

一个appender对应着一个输出位置与格式。

1.获取

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

需要的jar包、log4j.properties文件等项目结构见图1。


图1 log4j.properties文件的默认位置

也可以自己指定配置文件路径,见下;

void org.apache.log4j.PropertyConfigurator.configure(String configFilename)

2.日志格式

layout指定了布局与内容。常用的见下表:

Layout类名
作 用
org.apache.log4j.HTMLLayout
以HTML表格形式布局
org.apache.log4j.PatternLayout
可以灵活地指定布局模式
org.apache.log4j.SimpleLayout
包含日志信息的级别和信息字符串
org.apache.log4j.TTCCLayout
包含日志产生的时间、线程、类别等等信息
其中 PatternLayout最为灵活,它的一些格式占位符见下:

%c 输出日志信息所属的类的全名 
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy-MM-dd HH:mm:ss },输出类似:2002-10-18- 22:10:28 
%f 输出日志信息所属的类的类名 
%l 输出日志事件的发生位置,即输出日志信息的语句处于它所在的类的第几行 
%m 输出代码中指定的信息,如log(message)中的message 
%n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n” 
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL。如果是调用debug()输出的,则为DEBUG,依此类推 
%r 输出自应用启动到输出该日志信息所耗费的毫秒数 
%t 输出产生该日志事件的线程名

如下行配置的显示效果见下下行;
log4j.appender.appender1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%c]-[%p]-[%l] %m%n 

2015-08-03 10:52:23 [com.ctrip.search.antibot.esper.worker.RuleWorker]-[DEBUG]-[com.ctrip.search.antibot.esper.worker.RuleWorker.modifyAntibotEplTable(RuleWorker.java:54)] 日志具体内容

3.常用函数

void com.ctrip.search.logging.ESLogger.error(String msg, Object... params)

用于记录string。

void com.ctrip.search.logging.ESLogger.error(String msg,Throwablecause, Object... params)

我们catch(Exception e)到的异常都是Throwable类型的,若想打印错误栈信息,可将e放入此函数的第二个实参位置上,log4j就帮我们打印调用栈了。

比如logger.error(e,e),就等价于logger.error(e.toString(),e),就等价于logger.error(e.getMessage(),e);。

注意:若程序抛出了RuntimeException e,而我们没有try{}catch{ logger.error(e,e)},那么日志中就没有这个异常信息。所以启动脚本一般会这么写;

4.例子

log4j.properties文件内容见下:

#可以设置级别:debug>info>error
#debug:显示debug、info、error
#info:显示info、error
#error:只error
#log4j.rootLogger=debug,appender1
#输出到多个目的地
log4j.rootLogger=info,appender1,appender2
#log4j.rootLogger=error,appender1

#输出到控制台
log4j.appender.appender1=org.apache.log4j.ConsoleAppender
#样式为TTCCLayout
log4j.appender.appender1.layout=org.apache.log4j.TTCCLayout

#输出到文件,每天一个文件
log4j.appender.appender2=org.apache.log4j.DailyRollingFileAppender
#指定输出文件,${catalina.home}为tomcat启动时设置的变量,就是tomcat工作目录
log4j.appender.appender2.file=${catalina.home}/logs/qing-WebLog.log
#样式为TTCCLayout
log4j.appender.appender2.layout=org.apache.log4j.TTCCLayout
对应的效果见图2:

图2 与上面配置对应的输出内容
qing-WebLog.log是总记录。每过一天会把当天的单独写到带日期的文件里。

5.多个logger

多个logger更为灵活,可以记录特定的信息。比如自己的项目proA依赖了proB,proB里面有很多打日志的代码,干扰了我们proA的业务日志,那么就可以让它们使用不同的logger,记往不同的地方。
有两种做法——限定包名或指定logger名字。

5.1 指定logger名字

log4j.logger.myLogger=info,appender3
#若不加这一行,rootLogger同样会记载此logger的日志
log4j.additivity.myLogger=false
log4j.appender.appender3=org.apache.log4j.ConsoleAppender
log4j.appender.appender3.layout=org.apache.log4j.TTCCLayout
对应的java语句见下:
	static final Logger myLogger = LoggerFactory.getLogger("myLogger");

5.2 限定包名

如 log4j.logger. com.likeyichu.proa=info,myAppender
在java中正常用 Logger logger=Logger.getLogger(myClass.class);

6.自定义appender

例子见下。
#use own appender
log4j.rootLogger = INFO,YICHU
log4j.appender.YICHU = com.yichudu.logger.appender.YichuAppender
log4j.appender.YICHU.layout = org.apache.log4j.PatternLayout
log4j.appender.YICHU.layout.ConversionPattern = [%d{yyyy-MM-dd HH:mm:ss}][%p][%c]%m%n

7.指定配置文件

若不指定,则默认找classpath下的log4j.properties或log4j.xml。
在spring-web项目中,可用下面的配置。注意log4j初试在context前。
	<context-param>
	   <param-name>contextConfigLocation</param-name>
	   <param-value>classpath:service.xml</param-value>
	</context-param> 
	<context-param>
		<param-name>log4jConfigLocation</param-name>
		<param-value>/WEB-INF/log4j.xml</param-value>
	</context-param>
	
	<listener>
		<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
	</listener> 
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

8. slf4j

获取

<!--以与log4j搭配为例-->
<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>slf4j-log4j12</artifactId>
	<version>1.7.7</version>
</dependency>

slf4j,Simple Logging Facade for Java,用于java的简单日志门面系统。它不是具体的日志记录工具,类似于jdbc,提供了日志记录的统一接口。
使用哪种工具实现日志记录,不需要代码指定,只要将与你打算使用的日志系统对应的jar包加入到项目中,SLF4J就会自动选择使用你加入的那种日志系统。
slf4j中,使用下行语句得到logger:
Logger org.slf4j.LoggerFactory.getLogger(Class clazz)

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
图解MySQL【日志】——Redo Log
Redo Log(重做日志)是数据库中用于记录数据页修改的物理日志,确保事务的持久性和一致性。其主要作用包括崩溃恢复、提高性能和保证事务一致性。Redo Log 通过先写日志的方式,在内存中缓存修改操作,并在适当时候刷入磁盘,减少随机写入带来的性能损耗。WAL(Write-Ahead Logging)技术的核心思想是先将修改操作记录到日志文件中,再择机写入磁盘,从而实现高效且安全的数据持久化。Redo Log 的持久化过程涉及 Redo Log Buffer 和不同刷盘时机的控制参数(如 `innodb_flush_log_at_trx_commit`),以平衡性能与数据安全性。
26 5
图解MySQL【日志】——Redo Log
图解MySQL【日志】——Undo Log
Undo Log(回滚日志)是 MySQL 中用于实现事务原子性和一致性的关键机制。在默认的自动提交模式下,MySQL 隐式开启事务,每条增删改语句都会记录到 Undo Log 中。其主要作用包括:
25 0
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log、原理、写入过程;binlog与redolog区别、update语句的执行流程、两阶段提交、主从复制、三种日志的使用场景;查询日志、慢查询日志、错误日志等其他几类日志
101 35
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log
MySQL事务日志-Undo Log工作原理分析
事务的持久性是交由Redo Log来保证,原子性则是交由Undo Log来保证。如果事务中的SQL执行到一半出现错误,需要把前面已经执行过的SQL撤销以达到原子性的目的,这个过程也叫做"回滚",所以Undo Log也叫回滚日志。
107 7
MySQL事务日志-Undo Log工作原理分析
RAG Logger:专为检索增强生成(RAG)应用设计的开源日志工具,支持查询跟踪、性能监控
RAG Logger 是一款专为检索增强生成(RAG)应用设计的开源日志工具,支持查询跟踪、检索结果记录、LLM 交互记录和性能监控等功能。
93 7
RAG Logger:专为检索增强生成(RAG)应用设计的开源日志工具,支持查询跟踪、性能监控
什么是Apache日志?为什么Apache日志分析很重要?
Apache是全球广泛使用的Web服务器软件,支持超过30%的活跃网站。它通过接收和处理HTTP请求,与后端服务器通信,返回响应并记录日志,确保网页请求的快速准确处理。Apache日志分为访问日志和错误日志,对提升用户体验、保障安全及优化性能至关重要。EventLog Analyzer等工具可有效管理和分析这些日志,增强Web服务的安全性和可靠性。
什么是事件日志管理系统?事件日志管理系统有哪些用处?
事件日志管理系统是IT安全的重要工具,用于集中收集、分析和解释来自组织IT基础设施各组件的事件日志,如防火墙、路由器、交换机等,帮助提升网络安全、实现主动威胁检测和促进合规性。系统支持多种日志类型,包括Windows事件日志、Syslog日志和应用程序日志,通过实时监测、告警及可视化分析,为企业提供强大的安全保障。然而,实施过程中也面临数据量大、日志管理和分析复杂等挑战。EventLog Analyzer作为一款高效工具,不仅提供实时监测与告警、可视化分析和报告功能,还支持多种合规性报告,帮助企业克服挑战,提升网络安全水平。
127 2
Flutter前端开发中的调试技巧与工具使用方法,涵盖调试的重要性、基本技巧如打印日志与断点调试、常用调试工具如Android Studio/VS Code调试器和Flutter Inspector的介绍
本文深入探讨了Flutter前端开发中的调试技巧与工具使用方法,涵盖调试的重要性、基本技巧如打印日志与断点调试、常用调试工具如Android Studio/VS Code调试器和Flutter Inspector的介绍,以及具体操作步骤、常见问题解决、高级调试技巧、团队协作中的调试应用和未来发展趋势,旨在帮助开发者提高调试效率,提升应用质量。
96 8
什么是日志管理,如何进行日志管理?
日志管理是对IT系统生成的日志数据进行收集、存储、分析和处理的实践,对维护系统健康、确保安全及获取运营智能至关重要。本文介绍了日志管理的基本概念、常见挑战、工具的主要功能及选择解决方案的方法,强调了定义管理目标、日志收集与分析、警报和报告、持续改进等关键步骤,以及如何应对数据量大、安全问题、警报疲劳等挑战,最终实现日志数据的有效管理和利用。
440 0
使用EventLog Analyzer日志分析工具监测 Windows Server 安全威胁
Windows服务器面临多重威胁,包括勒索软件、DoS攻击、内部威胁、恶意软件感染、网络钓鱼、暴力破解、漏洞利用、Web应用攻击及配置错误等。这些威胁严重威胁服务器安全与业务连续性。EventLog Analyzer通过日志管理和威胁分析,有效检测并应对上述威胁,提升服务器安全性,确保服务稳定运行。
113 2
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等