「Java例子」slf4j+logback实现不同环境日志配置和日志级别开关

createh53个月前 (01-20)技术教程36

介绍语

本号主要是Java常用关键技术点,通用工具类的分享;以及springboot+springcloud+Mybatisplus+druid+mysql+redis+swagger+maven+docker等集成框架的技术分享;datax、kafka、flink等大数据处理框架的技术分享。文章会不断更新,欢迎码友关注点赞收藏转发!

望各位码友点击关注,冲1000粉。后面会录制一些视频教程,图文和视频结合,比如:图书介绍网站系统、抢购系统、大数据中台系统等。技术才是程序猿的最爱,码友们冲啊

如果码友觉得代码太长,可以从头到尾快速扫射一遍,了解大概即可。觉得有用后再转发收藏,以备不时之需。

正文:

不管大公司还是小公司都会有日志混乱的问题,当生产报错时开发人员排查问题,打开日志文件实时查看日志输出,但是由于不规范日志打印的很快,很难发现错误的日志。所以本次分享日志配置知识,由于代码过多所以文末给出代码库地址,欢迎下载学习。

日志打印类

 import lombok.extern.slf4j.Slf4j;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 
 @SpringBootApplication
 @Slf4j
 public class DemoLogbackApplication {
 
     public static void main(String[] args) {
         SpringApplication.run(DemoLogbackApplication.class, args);
 
         log.debug("debug...");
         log.info("info...");
         log.warn("warn...");
         log.error("error...");
     }
 }

打印效果


不同环境日志

只要配置下面属性即可对应使用相应的日志配置
开发环境: spring.profiles.active=dev
测试环境: spring.profiles.active=test
生产环境: spring.profiles.active=prod

日志级别设置例子

关闭根日志
logging.level.root = off
打印某个包的日志,日志级别为debug
logging.level.javalaoniu.gitee.io.demo.logback = debug
关闭org.apache包的日志
logging.level.org.apache = off

动态设置日志环境

在项目启动时,传递环境参数,让日志自动使用相应的日志配置去打印日志(或记录到文件中) ,启动命令如下:
java -jar javalaoniu.gitee.io.demo.logback.DemoLogbackApplication --spring.profiles.active=dev

日志文件配置

logback-spring.xml

 <?xml version="1.0" encoding="UTF-8"?>  
 <configuration scan="true" scanPeriod="60 seconds" debug="false">  
     <contextName>dadi</contextName>  
     <springProperty scope="context" name="springAppName" source="spring.application.name"/>  
     <property name="log.path" value="logs/app-log"/>  
     <property name="log.maxHistory" value="15"/>  
     <property name="log.maxSize" value="10MB"/>  
     <!--配置输出,以不同颜色区分-->  
     <property name="log.colorPattern"  
               value="%magenta(%d{yyyy-MM-dd HH:mm:ss}) %highlight(%-5level) %boldCyan([${springAppName:-},%X{X-B3-TraceId:-},%X{X-B3-SpanId:-},%X{X-Span-Export:-}]) %yellow(%thread) %green(%logger) %L %msg%n"/>  
     <property name="log.pattern"  
               value="%d{yyyy-MM-dd HH:mm:ss} %-5level [${springAppName:-},%X{X-B3-TraceId:-},%X{X-B3-SpanId:-},%X{X-Span-Export:-}] %thread %logger %L %msg%n"/>  
   
     <!--输出到控制台-->  
     <appender name="console" class="ch.qos.logback.core.ConsoleAppender">  
         <encoder>  
             <pattern>${log.colorPattern}</pattern>  
         </encoder>  
     </appender>  
   
     <!--输出到文件-->  
     <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">  
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">  
             <fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern>  
             <MaxHistory>${log.maxHistory}</MaxHistory>  
         </rollingPolicy>  
         <encoder>  
             <pattern>${log.pattern}</pattern>  
         </encoder>  
         <filter class="ch.qos.logback.classic.filter.LevelFilter">  
             <level>INFO</level>  
             <onMatch>ACCEPT</onMatch>  
             <onMismatch>DENY</onMismatch>  
         </filter>  
   
         <!--日志文件最大的大小-->  
         <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">  
             <MaxFileSize>${log.maxSize}</MaxFileSize>  
         </triggeringPolicy>  
     </appender>  
   
     <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">  
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">  
             <fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern>  
         </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>  
   
         <!--日志文件最大的大小-->  
         <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">  
             <MaxFileSize>${log.maxSize}</MaxFileSize>  
         </triggeringPolicy>  
     </appender>  
   
     <springProfile name="dev">  
         <!-- 开发环境时激活 -->  
         <!-- 指定输出日志的类,该包下的打印级别是info,在控制台会打印这个包中的info级别以上的信息 -->  
         <logger name="javalaoniu.gitee.io.demo.logback" level="debug" additivity="false">  
             <appender-ref ref="console"/>  
         </logger>  
     </springProfile>  
     <springProfile name="test | default">  
         <!-- 测试环境时激活 -->  
         <!-- 当spring.profiles.active无设置时也用这个打印日志-->  
         <!-- 指定输出日志的类,该包下的打印级别是info,在控制台会打印这个包中的info级别以上的信息 -->  
         <logger name="javalaoniu.gitee.io.demo.logback" level="info" additivity="false">  
             <appender-ref ref="console"/>  
         </logger>  
     </springProfile>  
     <springProfile name="prod">  
         <!-- 生产环境时激活 -->  
         <!-- 指定输出日志的类,该包下的打印级别是info,在控制台会打印这个包中的info级别以上的信息 -->  
         <logger name="javalaoniu.gitee.io.demo.logback" level="error" additivity="false">  
             <appender-ref ref="console"/>  
             <appender-ref ref="file_error"/>  
         </logger>  
     </springProfile>  
   
   
     <!-- 跟打印配置,整个项目输出级别为error-->  
     <root level="error">  
         <appender-ref ref="console"/>  
     </root>  
   
 </configuration>

application.properties

 logging.level.root = off  
 logging.level.javalaoniu.gitee.io.demo.logback = debug

日志规则

  • 日志文件命名为logback-spring.xml,这样可以读取application.properties中的配置;
  • logback-spring.xml文件和application.properties中同时设置,则application.properties中的配置覆盖logback-spring.xml中的配置;
  • application.properties中logging.level.root的级别设置不影响其他包的设置,如logging.level.root=info,包设置logging.level.demo.log=warn,则demo.log包的日志级别为warn
  • 日志级别由低到高,ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF


gitee地址:https://gitee.com/javalaoniu/java-example/tree/master/demo-logback


鄙人编码十年多,在项目中也积累了一些工具类,很多工具类在每个项目都有在用,很实用。大部分是鄙人封装的,有些工具类是同事封装的,有些工具类已经不记得是ctrl+c的还是自己封装的了,现在有空就会总结项目中大部分的工具类,分享给各位码友。如果文章中涉及的代码有侵权行为请通知鄙人处理。

计划是先把工具类整理出来,正所谓工欲善其事,必先利其器。项目中不管是普通单体项目还是多模块maven项目或是分布式微服务,一部分功能模块都是可以重用的,工具类模块就是其中之一。

相关文章

5款热门Java集成开发环境,你用上了么?

工欲善其事必先利其器。学习一门语言,入门第一步就是先选择一款强大的集成开发环境(简称IDE)并安装它。Java作为当下最热门语言之一,今天我们就来介绍一下5款最热门的Java集成开发环境。入门新人们赶...

JAVA 01 jdk下载安装以及配置环境变量

1.搭建JAVA开发环境1.JDK的下载和安装从oracle官网下载即可。安装到E盘下双击安装,文件夹名字不可以有中文字符。安装路径为:E://java文件夹下。配置JDK环境变量找到path,进行新...

美畅物联丨Java 后端程序指定运行环境配置

畅联云平台 Java 后端环境配置技术文档一、概述在畅联云平台的部署中,Java 后端程序需要在不同的环境(如开发、生产)下运行,为了方便区分和管理环境,我们使用 Spring Profiles 的机...

JAVA JDK安装与环境变量配置

下载JDK到Oracle官网下载JDK如果不想去下载,关注我,私信回复“JDK”我发你安装JDK安装JDK时,除了修改安装目录,其他的一路【下一步】,傻瓜式安装。注:当提示安装JRE时,可以选择不要安...

从零开始搭建Java Web中间件环境

作为Java开发人员,我们经常需要在Linux服务器上搭建各种中间件环境来支撑我们的应用程序。这些中间件包括MySQL、Redis、JDK、Nacos、Jenkins和Nginx等。本文将介绍如何从零...

俄罗斯程序员创建了外国Java集成开发环境的国产替代品

据cnews网站 12月16日报道,在俄罗斯,国产的OpenIDE集成开发环境在未来有望取代IntelliJ IDEA——OpenIDE是Astra Group、Haulmont和Axiom JDK的...