作者平台:
| CSDN:blog.csdn.net/qq_44700578…
| 阿里云:developer.aliyun.com/my…
| 腾讯云:cloud.tencent.com/developer/user/1092…
| 51CTO:https://blog.51cto.com/u_14971476…
| 华为云:devpress.csdn.net/user/qq_44700578…
| 百度智能云:cloud.baidu.com/qianfandev…
| GitHub:github.com/ywj123456-sys…
| 微信公众号:寻求出路的程序媛
文章目录
一、日志定义与作用
二、使用步骤
三、日志级别
四、日志框架
五、配置文件
六、常见日志管理系统
七、日志收集分析
在软件开发与运维过程中,日志是至关重要的部分,它记录了系统运行时的各种状态信息,包括错误、警告、调试信息等。不同的日志级别用于区分不同重要程度的信息,便于开发者和运维人员快速定位问题,优化系统性能,以及更好地理解系统的运行状况。对于常见的几种日志级别及其具体作用,介绍如下。
定义:程序执行过程中,记录程序运行情况的信息
作用:
不是java的,也不是自己写的,是第三方提供的代码,所以我们要导入jar包。具体步骤要根据使用的框架来定,详情可查阅网上相关资料。
针对不同的场景,日志被分为五种不同的级别。
TRACE, DEBUG, INFO, WARN, ERROR
按照重要程度依次排序:
还有两个特殊的:
日志级别从小到大的关系(优先级从低到高):
ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
低级别的会输出高级别的信息,高级别的不会输出低级别的信息。譬如等级设为Error的话,warn、info、debug的信息不会输出。
logger.debug、logger.info、logger.warn、logger.error、logger.fatal的区别:其作用都是把错误信息写到文本日志里,但它们表示的日志级别不同。日志级别由高到底是——fatal,error,warn,info,debug。低级别的会输出高级别的信息,高级别的不会输出低级别的信息。修改日志输出的级别要在log4j文件中进行配置
log.error() 一般是需要if()的;log.info()一般是在try catch 里面;log.debug() 做记录一般标志着方法的开始和结束。
比如,你在开发的时候,要验证一个方法有没有被调用到,为了方便调试,通常会在这个方法开始的时候加一些system.out。但是项目真正发布的时候这些代码通常是要移除掉的,所以通常更建议用logger来记录。
所以你可能会加logger.debug。 为什么是debug而不是info、error或者其他呢?因为通常项目发布的时候都会把日志等级设置为error 或者info之类的等级,在这两个等级下debug的内容是输出不了的,所以就可以做到不需要修改代码就不会输出你只有在调试的时候才需要输出的内容
各个等级都是有它的含义的,虽然在写代码的时候你用debug info error都可以,但为了方便管理,在开发调试阶段需要查看特定数据 用debug,一些信息类的日志记录通常会用info(比如你想看一天有几个用户登录),一些错误的、或者异常信息会用error,比如某个时刻数据库连接出了问题,如果分析日志,直接搜索error开头的就能直接定位到了
修改日志输出的级别要在log4j文件中进行配置。项目正式发布后,一般会把日志级别设置为fatal或者error或者info。
if(log.isDebugEnabled()){
log.debug(“develop test!”);
}
总结来说,日志级别为开发者和运维人员提供了从细粒度到粗粒度的不同观察窗口,通过合理设置和查看日志级别,能有效提高问题定位和系统维护效率。
不同的Java日志框架对应的jar包会有所不同,下面是常用日志框架:
logback.xml示例
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- CONSOLE :表示当前的日志信息是可以输出到控制台的 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!--输出流对象 默认 System.out 改为 System.err-->
<target>System.out</target>
<encoder>
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度
%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %c [%thread] : %msg%n</pattern>
</encoder>
</appender>
<!-- File是输出的方向通向文件的 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<!--日志输出路径-->
<file>C:/code/wj-data.log</file>
<!--指定日志文件拆分和压缩规则-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--通过指定压缩文件名称,来确定分割文件方式-->
<fileNamePattern>C:/code/itheima-data2-%d{yyyy-MMdd}.log%i.gz</fileNamePattern>
<!--文件拆分大小-->
<maxFileSize>1MB</maxFileSize>
</rollingPolicy>
</appender>
<!-- level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF, 默认debug
<root>可以包含零个或多个<appender-ref>元素,标识这个输出位置将会被本日志级别控制。
-->
<root level="info">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE" />
</root>
</configuration>
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 日志存放路径 -->
<property name="log.path" value="logs"/>
<!-- 日志输出格式 -->
<property name="log.pattern" value="%d{HH:mm:ss.SSS} %-5level %logger{20}:%line | %msg%n"/>
<!-- 控制台输出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 系统日志输出 -->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-info.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>INFO</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-error.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>ERROR</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 用户访问日志输出 -->
<appender name="sys-user" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-user.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 按天回滚 daily -->
<fileNamePattern>${log.path}/sys-user.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!-- 系统模块日志级别控制 -->
<logger name="com.gk" level="info"/>
<!-- Spring日志级别控制 -->
<logger name="org.springframework" level="warn"/>
<!--Kafka日志级别控制-->
<logger name="org.apache.kafka" level="error"/>
<root level="info">
<appender-ref ref="console"/>
</root>
<!--系统操作日志-->
<root level="info">
<appender-ref ref="file_info"/>
<appender-ref ref="file_error"/>
</root>
<!--系统用户操作日志-->
<logger name="sys-user" level="info">
<appender-ref ref="sys-user"/>
</logger>
</configuration>
以上列举的是一些比较常见的日志管理系统,每个系统都有其特点和适用场景,选择合适的日志管理系统需要根据实际需求和情况进行评估和比较。
在记录日志或实现追踪功能时,开发人员可以采用多种不同的方式,每种方式都有其特点和适用场景:
日志采集是指从各种系统和应用程序中收集、汇总和存储日志信息的过程。以下是常见的日志采集方式:
以上是常见的日志采集方式,具体选择何种方式取决于系统架构、需求和预算等因素。有效的日志采集可以帮助监控系统运行状态、排查问题并进行分析,是系统运维和故障排除中的重要环节。
在Java中进行日志收集和分析有多种方式,下面是一些常用的方式:
综上所述,Java中进行日志收集和分析的方式丰富多样,开发人员可以根据具体需求选择合适的工具和技术来实现日志记录和分析功能。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。