本篇内容介绍了“java日志打印怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、简介日志打印是java代码开发中不可缺少的重要一步
本篇内容介绍了“java日志打印怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
日志打印是java代码开发中不可缺少的重要一步。
日志可以排查问题,可以搜集数据
比较常用的日志框架就是logback, 一些老项目会使用log4j,他们用的都是slf4j-api统一接口。
(1) 使用log4j
log4j使用:1. slf4j-api-1.5.11.jar2. slf4j-log4j12-1.5.11.jar3. log4j-1.2.15.jar4. log4j.properties
代码中
import org.slf4j.Logger;import org.slf4j.LoggerFactory;Logger logger = LoggerFactory.getLogger(xx.class);
(2) 使用logback
logback使用:1. slf4j-api-1.5.11.jar2. logback-core.jar3. logback-classic.jar4. logback.xml
代码同log4j
import org.slf4j.Logger;import org.slf4j.LoggerFactory;Logger logger = LoggerFactory.getLogger(xx.class);
TRACE < DEBUG < INFO < WARN < ERROR
日常使用较多的是error, info , debug
简单介绍下常用的logback,logback优点:
比log4j更快
和log4j使用了同一个接口,slf4j-api,可以非常方便切换
定义了功能非常丰富的appender
支持日志压缩
logback要正确理解xml配置文件
configuration:总的父节点
property:自定义属性
appender:输出控制器,可以输出到控制台,自定义文件等
logger:日志级别
root:控制器级别
一个例子:
<?xml version="1.0" encoding="UTF-8"?><configuration scan="true" scanPeriod="60 seconds"> <contextName>XXXXXXXX</contextName> <property name="log.path" value="./log/"/> <!-- 日志最大的历史 30天 --> <property name="maxHistory" value="30"/> <property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId}] [%-5level] [%logger{30}:%line] %msg%n"/> <!--输出到控制台--> <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender"> <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息--> <!--LevelFilter: 级别过滤器,根据日志级别进行过滤。如果日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志。--> <!--例如:将过滤器的日志级别配置为INFO,所有INFO级别的日志交给appender处理,非INFO级别的日志,被过滤掉。--> <!--<filter class="ch.qos.logback.classic.filter.LevelFilter">--> <!--<level>INFO</level>--> <!--<onMatch>ACCEPT</onMatch>--> <!--<onMismatch>DENY</onMismatch>--> <!--</filter>--> <!--ThresholdFilter: 临界值过滤器,过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,过滤器返回NEUTRAL;当日志级别低于临界值时,日志会被拒绝。--> <!-- 过滤掉所有低于 DEBUG 级别的日志,留下DEBUG及以上级别的日志 --> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>DEBUG</level> </filter> <encoder> <pattern>${log.pattern}</pattern> </encoder> </appender> <!-- 时间滚动输出 level为 INFO 日志 --> <appender name="errorFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!--LevelFilter: 级别过滤器,根据日志级别进行过滤。如果日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志。--> <!--例如:将过滤器的日志级别配置为INFO,所有INFO级别的日志交给appender处理,非INFO级别的日志,被过滤掉。--> <!--<filter class="ch.qos.logback.classic.filter.LevelFilter">--> <!--<level>INFO</level>--> <!--<onMatch>ACCEPT</onMatch>--> <!--<onMismatch>DENY</onMismatch>--> <!--</filter>--> <!--ThresholdFilter: 临界值过滤器,过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,过滤器返回NEUTRAL;当日志级别低于临界值时,日志会被拒绝。--> <!-- 过滤掉所有低于 DEBUG 级别的日志,留下DEBUG及以上级别的日志 --> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>ERROR</level> </filter> <!-- 正在记录的日志文件的路径及文件名 --> <file>${log.path}/error.log</file> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 每天日志归档路径以及格式 --> <fileNamePattern>${log.path}/error-%d{yyyyMMdd}.%i.log.zip</fileNamePattern> <!--日志文件保留天数--> <maxHistory>${maxHistory}</maxHistory> <!-- 日志总保存量为2GB --> <totalSizeCap>2GB</totalSizeCap> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <!--文件达到 最大100MB时会被压缩和切割 --> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <encoder> <pattern>${log.pattern}</pattern> </encoder> </appender> <!-- 时间滚动输出 level为 INFO 日志 --> <appender name="infoFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!--LevelFilter: 级别过滤器,根据日志级别进行过滤。如果日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志。--> <!--例如:将过滤器的日志级别配置为INFO,所有INFO级别的日志交给appender处理,非INFO级别的日志,被过滤掉。--> <!--<filter class="ch.qos.logback.classic.filter.LevelFilter">--> <!--<level>INFO</level>--> <!--<onMatch>ACCEPT</onMatch>--> <!--<onMismatch>DENY</onMismatch>--> <!--</filter>--> <!--ThresholdFilter: 临界值过滤器,过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,过滤器返回NEUTRAL;当日志级别低于临界值时,日志会被拒绝。--> <!-- 过滤掉所有低于 DEBUG 级别的日志,留下DEBUG及以上级别的日志 --> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level> </filter> <!-- 正在记录的日志文件的路径及文件名 --> <file>${log.path}/info.log</file> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 每天日志归档路径以及格式 --> <fileNamePattern>${log.path}/info-%d{yyyyMMdd}.%i.log.zip</fileNamePattern> <!--日志文件保留天数--> <maxHistory>${maxHistory}</maxHistory> <!-- 日志总保存量为10GB --> <totalSizeCap>2GB</totalSizeCap> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <!--文件达到 最大100MB时会被压缩和切割 --> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <encoder> <pattern>${log.pattern}</pattern> </encoder> </appender> <!-- 时间滚动输出 level为 INFO 日志 --> <appender name="debugFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!--LevelFilter: 级别过滤器,根据日志级别进行过滤。如果日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志。--> <!--例如:将过滤器的日志级别配置为INFO,所有INFO级别的日志交给appender处理,非INFO级别的日志,被过滤掉。--> <!--<filter class="ch.qos.logback.classic.filter.LevelFilter">--> <!--<level>INFO</level>--> <!--<onMatch>ACCEPT</onMatch>--> <!--<onMismatch>DENY</onMismatch>--> <!--</filter>--> <!--ThresholdFilter: 临界值过滤器,过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,过滤器返回NEUTRAL;当日志级别低于临界值时,日志会被拒绝。--> <!-- 过滤掉所有低于 DEBUG 级别的日志,留下DEBUG及以上级别的日志 --> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>DEBUG</level> </filter> <!-- 正在记录的日志文件的路径及文件名 --> <file>${log.path}/debug.log</file> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 每天日志归档路径以及格式 --> <fileNamePattern>${log.path}/debug-%d{yyyyMMdd}.%i.log.zip</fileNamePattern> <!--日志文件保留天数--> <maxHistory>${maxHistory}</maxHistory> <!-- 日志总保存量为2GB --> <totalSizeCap>2GB</totalSizeCap> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <!--文件达到 最大100MB时会被压缩和切割 --> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <encoder> <pattern>${log.pattern}</pattern> </encoder> </appender> <logger name="com.baomidou" level="debug"/> <root level="info"> <appender-ref ref="consoleAppender"/> <appender-ref ref="errorFileAppender"/> <appender-ref ref="infoFileAppender"/> <appender-ref ref="debugFileAppender"/> </root></configuration>
日志打的少,不好排查问题?
我们经常会遇到一个生产问题,去看日志,啥都没有,只能重新加日志,发包,再排查问题;
所以我们要养成打日志的习惯,开发环境可以debug看,生产看不了,只能加日志,在开发的时候就把必要的日志加上;
比较重要的是接口的入参,返回,重要节点开始,结束,MQ发送接收等。
error, info , debug分别都什么时候使用?
error: 捕获异常的时候使用,这个没有异议
info: 比较重要的信息,使用频次不是非常高的场景,比如入参出参
debug: 一个是不是特别重要的信息,但是又不能少,还有数据量大的数据,比如大量mq信息,访问频繁的接口入参出参
开启debug好多无用的debug信息怎么办?
把项目的目录定为debug,其它定成info。这样只有本项目的debug日志会打印了
logging.level.root=info
logging.level.cn.mypackage=debug
需要自定义日志文件吗?
logback可以把日志写进自定义文件,debug,info,error分开存储,历史数据还能压缩;
按自己项目的需求来,大型项目建议分开存储。
SpringBoot启动命令自带的日志和自定义日志文件的日志重复怎么办?
我们一般启动springboot项目命令为:nohup java -jar XXXXXXXX.jar >> XXXXXXX.log 2>&1 &
这个会生成一个日志文件,logback配置也会生成自己的日志文件,就会重复,造成空间浪费,如何取舍?如果你们公司统一打包脚本的话,就用命令生成的日志文件吧,把logback配置去掉;
如果你们公司自由度比较高,就用logback生成的日志,把命令改成 >/dev/null 就可以了
debug日志正确写法?
有些人可能打debug日志直接logger.debug("****");如果项目的日志级别比较高,就比较浪费性能,可以加一个if (log.isDebugEnabled()) { log.debug("XXXXXXXXXXXXX");}
动态日志级别?
有些公司支持动态配置文件,比如diamond,Nacos等,可以修改配置文件的级别,动态生效logging.level.root=info#logging.level.root=debug日常开在info,出了问题开debug找,资源有限可以这样做,不推荐生产使用
“java日志打印怎么使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!
--结束END--
本文标题: java日志打印怎么使用
本文链接: https://lsjlt.com/news/307390.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0