Log日志系统

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 简单时日志使用包括Log4j、logback、slf4j

Log

一、引言

1.1 日志介绍

用于记录系统中发生的各种事件。就的位置常见的有:控制台、磁盘文件等

1.2 日志级别

日志级别从低到高

TRACE、DEBUG、INFO、WARN、ERROR、FATAL

1.3 日志的作用

  • 通过日志观察、分析项目的运行情况(项目维护)
  • 通过日志根系用户的使用情况(大数据分析)
  • ...

二、解决方案1

2.1 Log4j + Commons-logging

2.1.1 导入依赖

项目中添加 Log4j 和 Commons-logging 的依赖

<!-- https://mvnrepository.com/artifact/log4j/log4j --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency><!-- https://mvnrepository.com/artifact/commons-logging/commons-logging --><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency>

2.1.2 基本使用

基本API

importorg.apache.commons.logging.Log;
importorg.apache.commons.logging.LogFactory;
importorg.junit.Test;
publicclassLogTest {
// 日志对象privateLoglog=LogFactory.getLog(LogTest.class);
@Testpublicvoidtest1(){
log.trace("hello trace~~");
log.debug("hello debug~~");
log.info("hello info~~");
log.warn("hello warn");
log.error("hello error");
log.fatal("hello fatal");
    }
}

2.1.3 配置信息

定义配置文件 log4j.xml

占位符 描述
%p 输出优先级,即DEBUG、INFO、WARN、ERROR、FATAL
%r 输出自应用启动到输出该log信息耗费的毫秒数
%c 输出所在类的全名
%t 输出产生该日志事件的线程名
%n 输出一个回车换行符
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在后面指定格式,比如:%d{yyyy-MM-dd HH:mm:ss,SSS},输出类似:2002-10-18 10:15:12,125
%l 输出日志事件的发生位置,包括类名、发生的线程,以及在代码中的行数。举例:TestLog.main(TestLog.java:12)
<?xmlversion="1.0"  encoding="UTF-8" ?><!DOCTYPE log4j:configuration PUBLIC "-//LOGGER""http://org/apache/log4j/xml/log4j.dtd"><log4j:configuration><!-- org.apache.log4j.ConsoleAppender 输出到控制台 --><appendername="myConsole"class="org.apache.log4j.ConsoleAppender"><!--输出格式--><layoutclass="org.apache.log4j.PatternLayout"><paramname="ConversionPattern"value="%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n"/></layout></appender><!-- 输出到文件 --><appendername="myFile1"class="org.apache.log4j.RollingFileAppender"><paramname="File"value="d:/log/hello.log"/><!--文件位置--><paramname="Append"value="true"/><!--是否选择追加--><paramname="MaxFileSize"value="1kb"/><!--文件最大字节数--><paramname="MaxBackupIndex"value="2"/><!--新文件数量--><layoutclass="org.apache.log4j.PatternLayout"><paramname="ConversionPattern"value="%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n"/></layout></appender><!-- 输出到文件 --><appendername="myFile2"class="org.apache.log4j.DailyRollingFileAppender"><paramname="File"value="d:/log/world.log"/><!--文件位置--><paramname="Append"value="true"/><!--是否选择追加--><layoutclass="org.apache.log4j.PatternLayout"><paramname="ConversionPattern"value="%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n"/></layout></appender><!-- 根logger的设置--><root><!--优先级设置,all < trace < debug < info < warn < error < fatal < off --><priorityvalue="all"/><appender-refref="myConsole"/><appender-refref="myFile1"/><appender-refref="myFile2"/></root></log4j:configuration>


三、解决方案2

3.1 Logback + SLF4j

3.1.1 导入依赖

项目中导入依赖

<!-- Logback依赖,还会传递 slf4j 和 logback-core --><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.3</version></dependency>

3.1.2 基本使用

Logback + SLF4J 基本API

publicclassLogTest {
privateLoggerlog=LoggerFactory.getLogger(LogTest.class);
@Testpublicvoidtest1() throwsInterruptedException {
while(true) {
log.trace("hello trace");
log.debug("hello debug");
log.info("hello info");
log.warn("hello warn");
log.error("hello error");
//注意,logback中没有fatal日志        }
    }

3.1.3 配置信息

定义 logback.xml

占位符 描述
%d{yyyy-MM-dd}HH:mm:ss,SSS} 日期
%5p 日志级别,5位字符串长度显示,如果内容占不满则内同右对齐并在左侧补空格
%-5p 5位字符串长度显示日志级别,如果内容占不满则内同左对齐并在右侧补空格 -代表左对齐
%logger 日志所在包和类
%M 日志所在方法名
%L 日志所在代码行
%m 日志正文
%n 换行
<?xmlversion="1.0" encoding="UTF-8"?><!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true --><!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 --><!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 --><configurationscan="true"scanPeriod="60 seconds"debug="true"><propertyname="CONSOLE_LOG_PATTERN"value="%d{yyyy-MM-dd HH:mm:ss.SSS} |-[%-5p] in %logger.%M[line-%L] -%m%n"/><propertyname="log.path"value="D:/log"/><!-- 输出到控制台 --><appendername="CONSOLE"class="ch.qos.logback.core.ConsoleAppender"><!-- Threshold=即最低日志级别,此appender输出大于等于对应级别的日志(当然还要满足root中定义的最低级别)--><filterclass="ch.qos.logback.classic.filter.ThresholdFilter"><level>trace</level></filter><encoder><!-- 日志格式(引用变量) --><Pattern>${CONSOLE_LOG_PATTERN}</Pattern><!-- 设置字符集 --><charset>UTF-8</charset></encoder></appender><!-- 追加到文件中 --><appendername="file"class="ch.qos.logback.core.FileAppender"><file>${log.path}/hello.log</file><encoder><pattern>${CONSOLE_LOG_PATTERN}</pattern></encoder></appender><!-- 滚动追加到文件中 --><appendername="file2"class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 正在记录的日志文件的路径及文件名 --><file>${log.path}/world.log</file><!--日志文件输出格式--><encoder><pattern>${CONSOLE_LOG_PATTERN}</pattern><charset>UTF-8</charset><!-- 设置字符集 --></encoder><!-- 日志记录器的滚动策略,按日期,按大小记录文件超过最大尺寸后,会新建文件,然后新的日志文件中继续写入如果日期变更,也会新建文件,然后在新的日志文件中写入当天日志--><rollingPolicyclass="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 新建文件后,原日志改名为如下  %i=文件序号,从0开始 --><fileNamePattern>${log.path}/world-%d{yyyy-MM-dd}.%i.log</fileNamePattern><!-- 每个日志文件的最大体量 --><timeBasedFileNamingAndTriggeringPolicyclass="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><maxFileSize>1kb</maxFileSize></timeBasedFileNamingAndTriggeringPolicy><!-- 日志文件保留天数,1=则只保留昨天的归档日志文件 ,不设置则保留所有日志--><maxHistory>1</maxHistory></rollingPolicy></appender><rootlevel="trace"><appender-refref="CONSOLE"/><appender-refref="file"/><appender-refref="file2"/></root></configuration>


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
2月前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
445 30
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
24天前
|
监控 安全 Apache
什么是Apache日志?为什么Apache日志分析很重要?
Apache是全球广泛使用的Web服务器软件,支持超过30%的活跃网站。它通过接收和处理HTTP请求,与后端服务器通信,返回响应并记录日志,确保网页请求的快速准确处理。Apache日志分为访问日志和错误日志,对提升用户体验、保障安全及优化性能至关重要。EventLog Analyzer等工具可有效管理和分析这些日志,增强Web服务的安全性和可靠性。
|
3月前
|
XML JSON Java
Logback 与 log4j2 性能对比:谁才是日志框架的性能王者?
【10月更文挑战第5天】在Java开发中,日志框架是不可或缺的工具,它们帮助我们记录系统运行时的信息、警告和错误,对于开发人员来说至关重要。在众多日志框架中,Logback和log4j2以其卓越的性能和丰富的功能脱颖而出,成为开发者们的首选。本文将深入探讨Logback与log4j2在性能方面的对比,通过详细的分析和实例,帮助大家理解两者之间的性能差异,以便在实际项目中做出更明智的选择。
360 3
|
2天前
|
SQL 关系型数据库 MySQL
MySQL事务日志-Undo Log工作原理分析
事务的持久性是交由Redo Log来保证,原子性则是交由Undo Log来保证。如果事务中的SQL执行到一半出现错误,需要把前面已经执行过的SQL撤销以达到原子性的目的,这个过程也叫做"回滚",所以Undo Log也叫回滚日志。
MySQL事务日志-Undo Log工作原理分析
|
1月前
|
存储 监控 安全
什么是事件日志管理系统?事件日志管理系统有哪些用处?
事件日志管理系统是IT安全的重要工具,用于集中收集、分析和解释来自组织IT基础设施各组件的事件日志,如防火墙、路由器、交换机等,帮助提升网络安全、实现主动威胁检测和促进合规性。系统支持多种日志类型,包括Windows事件日志、Syslog日志和应用程序日志,通过实时监测、告警及可视化分析,为企业提供强大的安全保障。然而,实施过程中也面临数据量大、日志管理和分析复杂等挑战。EventLog Analyzer作为一款高效工具,不仅提供实时监测与告警、可视化分析和报告功能,还支持多种合规性报告,帮助企业克服挑战,提升网络安全水平。
|
3月前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1745 14
MySQL事务日志-Redo Log工作原理分析
|
2月前
|
存储 Linux Docker
centos系统清理docker日志文件
通过以上方法,可以有效清理和管理CentOS系统中的Docker日志文件,防止日志文件占用过多磁盘空间。选择合适的方法取决于具体的应用场景和需求,可以结合手动清理、logrotate和调整日志驱动等多种方式,确保系统的高效运行。
179 2
|
3月前
|
XML JSON 监控
告别简陋:Java日志系统的最佳实践
【10月更文挑战第19天】 在Java开发中,`System.out.println()` 是最基本的输出方法,但它在实际项目中往往被认为是不专业和不足够的。本文将探讨为什么在现代Java应用中应该避免使用 `System.out.println()`,并介绍几种更先进的日志解决方案。
75 1
|
2月前
|
存储 监控 安全
什么是日志管理,如何进行日志管理?
日志管理是对IT系统生成的日志数据进行收集、存储、分析和处理的实践,对维护系统健康、确保安全及获取运营智能至关重要。本文介绍了日志管理的基本概念、常见挑战、工具的主要功能及选择解决方案的方法,强调了定义管理目标、日志收集与分析、警报和报告、持续改进等关键步骤,以及如何应对数据量大、安全问题、警报疲劳等挑战,最终实现日志数据的有效管理和利用。
148 0
|
3月前
|
监控 网络协议 安全
Linux系统日志管理
Linux系统日志管理
66 3