1.场景描述
当我们在生产环境中出现了生产问题我们需要排查问题原因,这个时候我们就需要一些文字性的记录的文本来查看,比对,排查.如果没有文字性的记录那么我们在出现问题的时候无法对问题进行快速的定位和分析,会极大的影响我们系统的可用性。
又或者我们想对系统中用户的行为数据进行分析等场景
2.日志是什么
日志是应用程序或系统生成的记录,用于记录在运行过程中发生的事件、操作和状态。它通常以文本格式存在,包含时间戳、日志级别、消息内容和其他相关信息。
3.为什么要用日志
- 故障排查:使用日志记录应用程序中的错误、异常和警告信息,可以帮助开发人员追踪和定位问题,进行故障排查和修复。
- 监控和分析:通过记录应用程序的运行信息和行为,可以提供有关应用程序性能、用户行为、系统状况等方面的数据。这些日志数据可以用于监控应用程序的运行状况,进行性能分析和优化。
- 安全审计:日志可以用于跟踪和记录用户的操作行为,检测潜在的安全威胁。它可以提供关键的审计依据,帮助检测和应对安全事件。
- 可追溯性:日志记录了应用程序的关键操作和事件,可以用于追溯历史记录、重现问题场景,并进行故障分析和优化。它可以帮助更好地理解应用程序的执行流程和状态转换。
- 合规要求:某些行业或法规要求应用程序必须记录和保留特定类型的日志,以满足合规要求。例如,金融机构需要记录交易日志以符合合规性要求。
- 性能优化:通过分析日志,可以识别应用程序中的性能瓶颈、慢查询和资源消耗等问题。日志可以提供有关应用程序的实际使用情况,帮助进行性能优化和资源调整。
- 运营分析:日志记录了应用程序的运行状态和事件,可以用于运营分析、用户行为分析和业务决策。它可以提供有关用户活动、用户访问模式、业务流程等方面的数据。
- 历史记录:日志作为应用程序的历史记录,可以记录重要的操作、状态变化和关键事件。它可以提供应用程序的演变历程,方便以后查阅和审查。
- 调试和开发:开发人员可以使用日志来调试代码,记录调试信息,跟踪程序执行路径,并辅助开发和测试过程。
- 通信与协作:通过共享和查阅日志,不同的团队成员可以更好地了解应用程序的状态和行为,促进团队间的协作和沟通。
4.常见的日志框架
日志框架 | 描述 |
Logback | 功能丰富、高性能的日志框架,是 Log4j 的后继者 |
Log4j | 成熟且广泛使用的 Java 日志框架 |
SLF4J | 提供统一的接口,允许开发人员使用多个日志框架 |
java.util.logging | Java SE 自带的默认日志框架 |
Apache Commons Logging | 通用的日志框架抽象层,可与其他日志框架兼容 |
Log4j 2 | Log4j 的升级版,提供性能和功能改进 |
Log4j 2 SLF4J Binding | 将 Log4j 2 与 SLF4J 框架绑定,使其兼容 |
5.日志的级别(从低到高)
级别 | 描述 |
TRACE | 最详细的日志级别,通常用于记录非常详细的调试信息,例如方法调用和变量值 |
DEBUG | 用于开发和调试目的,提供详细的日志信息,用于跟踪代码路径和调试问题 |
INFO | 应用程序的一般运行信息,例如启动信息、关键操作的成功消息等 |
WARN | 记录非预期发生的场景 |
ERROR | 发生错误不影响程序整体运行,只影响部分功能的正常运行。 |
FATAL | 致命(在logback中映射到error中) 当发生严重错误,导致应用程序不能继续运行时记录的信息 |
6.springboot集成logback
6.1. logback-spring.xml配置(个人常用)
<?xml version="1.0" encoding="UTF-8"?>
<!--
scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true
scanPeriod: 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
-->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 配置日志的基础信息 -->
<!-- 环境名称/应用名称 -->
<springProperty name="APP_NAME" scope="context" source="spring.application.name"/>
<!-- 日志文件输出地址 -->
<springProperty name="LOG_FILE" scope="context" source="logging.file" defaultValue="./logs/app/${APP_NAME}"/>
<!-- 设置日志大小 -->
<springProperty name="LOG_MAXFILESIZE" scope="context" source="logback.filesize" defaultValue="50MB"/>
<!-- 设置日志保存时长 -->
<springProperty name="LOG_FILEMAXDAY" scope="context" source="logback.filemaxday" defaultValue="7"/>
<!-- 如果为分布式项目 还可以追加以下信息 -->
<!-- ip地址 -->
<springProperty name="ServerIP" scope="context" source="spring.cloud.client.ip-address" defaultValue="0.0.0.0"/>
<!-- 端口号 -->
<springProperty name="ServerPort" scope="context" source="server.port" defaultValue="0000"/>
<!-- 追踪日志 -->
<springProperty name="LOG_TRACK_FILE" scope="context" source="logging.file" defaultValue="./logs/track"/>
<!-- 审计日志 -->
<springProperty name="LOG_AUDIT_FILE" scope="context" source="logging.file" defaultValue="./logs/audit"/>
<!-- 配置日志的输出信息 -->
<!-- 配置控制台日志输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!-- -->
<!--格式化输出:[${APP_NAME}] 应用名称 %d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>[${APP_NAME}] %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!-- 配置文件日志输出 如果觉得日志输出的不够详细,可以针对日志级别分别生成对应的日志文件-->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/${APP_NAME}.log</file>
<!-- 设置滚动策略 -->
<!-- 按天来回滚,如果需要按小时来回滚,则设置为{yyyy-MM-dd_HH} -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--设置日志命名模式 -->
<fileNamePattern>${LOG_FILE}/${APP_NAME}.log.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 如果按天来回滚,则最大保存时间为60天,60天之前的都将被清理掉 这里的值与滚动策略模式有关 -->
<maxHistory>${LOG_FILEMAXDAY}</maxHistory>
<!-- 按照日期进行归档,并且对日志文件大小进行限制 -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- 设置文件大于1KB进行压缩归档 -->
<maxFileSize>${LOG_MAXFILESIZE}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>[${APP_NAME}] %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!--可以输出项目中的debug日志,包括mybatis的sql日志-->
<logger name="com.zhuhuo.modual.mapper" level="DEBUG" />
<logger name="java.sql.Connection" level="DEBUG"/>
<logger name="java.sql.Statement" level="DEBUG"/>
<logger name="java.sql.PreparedStatement" level="DEBUG"/>
<logger name="org.springframework" level="info"/>
<logger name="org.springframework.context" level="WARN"/>
<logger name="org.springframework.beans" level="WARN"/>
<logger name="org.springframework.web.servlet" level="info"/>
<logger name="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" level="warn"/>
<!-- 日志输出级别 -->
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
</configuration>
6.2. 修改配置文件
#设置日志级别
logging:
level:
com.zhuhuo: DEBUG
path: /Users/jiuling/Documents/chenyakj/zhuhuo/zhuhuo-blog/logs
logback:
filesize: 100MB
filemaxday: 30
6.3.日志输出测试
7.总结
- 选择合适的日志级别:根据需求和场景,选择适当的日志级别,避免过多或过少地记录日志。
- 使用有意义的日志消息:为每条日志消息提供明确的描述,包含必要的上下文信息,便于后续的日志分析和理解。
- 日志格式规范:统一约定日志的格式,让不同的日志消息具有一致的结构,方便日志的解析和分析。
- 设置适当的日志输出:确定日志输出的路径和格式,选择合适的存储方式,避免日志文件过大或过多,影响系统性能。
- 定期清理和归档:根据需求,定期清理不再需要的日志文件,并进行归档保存,以释放存储空间并备份重要的日志数据。
- 监控日志质量:关注日志输出的质量和完整性,确保日志记录的正确性和有效性。
- 日志权限管理:合理设置日志的访问权限,确保只有授权人员可以查看和处理日志。
通过合理地配置和管理日志,我们可以更好地监控和追踪应用程序的运行状况,及时发现和解决问题,优化性能,满足合规要求,并提供有价值的数据支持和决策参考。