项目构建之springboot集成lomback.xml,和log4j基于properties方式的日志配置记录
2023-09-14 09:14:53 时间
文章目录
springboot集成lomback.xml 描述
首先在resouces目录下创建一个logback-spring.xml文件,为什么叫这个名字呢?
是因为logback默认的会从资源目录读取这个文件
配置xml文件中需要用到两个标签。
springProperty和springProfile标签,都是用于读取yml(yaml)配置文件的。
在yml中定义的一些配置信息
server:
port: 9137
tomcat:
uri-encoding: UTF-8
max-threads: 100 #最大并发数
max-connections: 200 #最大连接数
accepCount: 50 #等待数
#自定义的日志配置参数
logging:
path: D:\xxx\ldmall-product-service\src\main\resources\logs #保存日志
lv: INFO # 控制台日志输出级别
dateSize: 1 # 日志保存天数
#邮箱配置参数
email:
#主机
smtpHost: smtp.qq.com
#端口(465或587)
smtpPort: 465
username: xxx@qq.com
password: xxxx
SSL: true
email_from: from@qq.com
email_to: to@qq.com
创建logback-spring.xml文件
同事记得在resources目录下创建一个logs文件夹,用于存储项目运行,生成的日志文件
logback-spring.xml配置如下:
我这里把发送邮箱注释掉了
提示:
- 由于logback-spring.xml先于application.yml被系统加载,所以想要引用application.yml文件中的数据,需要加入标签,引入后怎么获取到呢?比如想要获取日志保存天数,就需要引入后面的引用,就只需要${log.dateSize}就可以了,中括号里面的值是springProperty 的name值。
- springProfile对应的是application.yml文件中的spring.profiles.active的值。
- 配置文件中的邮件密码不是邮箱登录密码,而是客户端授权密码,如何获取查询QQ邮箱登陆第三方客户端获取授权码就可以了。
<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<contextName>logback</contextName>
<!--读取yml,获取配置的信息-->
<property resource="application.yml"/>
<springProperty scope="context" name="log.path" source="logging.path"/>
<springProperty scope="context" name="log.lv" source="logging.lv"/>
<springProperty scope="context" name="log.dateSize" source="logging.dateSize"/>
<!--输出到控制台-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>${log.lv}</level>
</filter>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
<!--编码-->
<charset>utf-8</charset>
</encoder>
</appender>
<!--输出到debug-->
<appender name="debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${log.path}/logback-debug.log</file>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/logback-debug-%d{yyyy-MM-dd}_%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
<maxHistory>15</maxHistory>
</rollingPolicy>
<append>true</append>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
<!--编码-->
<charset>utf-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印DEBUG日志 -->
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--输出到info-->
<appender name="info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${log.path}/logback-info.log</file>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/logback-info-%d{yyyy-MM-dd}_%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
<maxHistory>${log.dateSize}</maxHistory>
</rollingPolicy>
<append>true</append>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
<!--编码-->
<charset>utf-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印INFO日志 -->
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--输出到warn-->
<appender name="warn" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${log.path}/logback-warn.log</file>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/logback-warn-%d{yyyy-MM-dd}_%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
<maxHistory>${log.dateSize}</maxHistory>
</rollingPolicy>
<append>true</append>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印WARN日志 -->
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--输出到error-->
<appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${log.path}/logback-error.log</file>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/logback-error-%d{yyyy-MM-dd}_%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
<maxHistory>${log.dateSize}</maxHistory>
</rollingPolicy>
<append>true</append>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印ERROR日志 -->
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- <!–邮件配置–>
<springProperty scope="context" name="smtpHost" source="email.smtpHost"/>
<!– SMTP server的端口地址。 –>
<springProperty scope="context" name="smtpPort" source="email.smtpPort"/>
<!– 发送邮件账号 –>
<springProperty scope="context" name="username" source="email.username"/>
<!– 发送邮件密码(此密码客户端授权密码,不是邮箱登录密码) –>
<springProperty scope="context" name="password" source="email.password"/>
<!– 如果设置为true,appender将会使用SSL连接到日志服务器。默认值:false –>
<springProperty scope="context" name="SSL" source="email.SSL"/>
<!– 指定收件人邮箱,可设置多个邮箱,收件人账号需以逗号隔开 –>
<springProperty scope="context" name="email_to" source="email.email_to"/>
<!– 指定发件人名称。 –>
<springProperty scope="context" name="email_from" source="email.email_from"/>
<!– 标题 –>
<property name="email_subject" value="【System Error】: %msg" />
<!– 邮件发送的appender –>
<appender name="Email" class="ch.qos.logback.classic.net.SMTPAppender">
<smtpHost>${smtpHost}</smtpHost>
<smtpPort>${smtpPort}</smtpPort>
<username>${username}</username>
<password>${password}</password>
<asynchronousSending>false</asynchronousSending>
<SSL>${SSL}</SSL>
<to>${email_to}</to>
<from>${email_from}</from>
<subject>${email_subject}</subject>
<!– html格式 –>
<layout class="ch.qos.logback.classic.html.HTMLLayout">
<Pattern>%date - %level [%thread] %logger{50} %line %message</Pattern>
</layout>
<!– 等级过滤器,指定ERROR级别发送 –>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<!– 每个电子邮件只发送一个日志条目 –>
<cyclicBufferTracker class="ch.qos.logback.core.spi.CyclicBufferTracker">
<bufferSize>1</bufferSize>
</cyclicBufferTracker>
</appender>-->
<!--不同环境分别设置对应的日志输出节点 -->
<!--springProfile对应的是application.yml文件中的spring.profiles.active的值-->
<!--开发-->
<springProfile name="dev">
<root level="debug">
<appender-ref ref="console" />
<appender-ref ref="info" />
<appender-ref ref="warn" />
<appender-ref ref="error" />
</root>
</springProfile>
<!--测试-->
<springProfile name="test">
<root level="warn">
<appender-ref ref="console" />
<appender-ref ref="warn" />
<appender-ref ref="error" />
<!--<appender-ref ref="Email" />-->
</root>
</springProfile>
<!--生产环境-->
<springProfile name="prod">
<root level="info">
<appender-ref ref="console" />
<appender-ref ref="debug" />
<appender-ref ref="info" />
<appender-ref ref="warn" />
<appender-ref ref="error" />
<!-- <appender-ref ref="Email" />-->
</root>
</springProfile>
</configuration>
log4j入门配置
一般配置三种输出:
第一种是控制台输出,
第二种是将日志输出到一个文件,
第三种是将报错的信息单独输出到一个文件
依赖: spring-boot-start本身包含了log4j的包,可以不加。也可以自己指定版本。
<!--log4j日志 -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!--log4j-->
创建log4j.properties文件,配置如下
### set log levels ###
log4j.rootLogger = debug , stdout , D , E
### 输出到控制台 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.Threshold = INFO
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n
### 输出到日志文件 ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### 保存异常信息到单独文件 ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File = logs/error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
也可以用xml的方式配置。
最终输出
控制台: 设置成了INFO级别
日志输出: 设置成了INFO级别
错误日志输出: 设置成了ERROR级别
详细介绍配置信息的:
###配置日志根Logger
log4j.rootLogger=DEBUG,stdout,file
#ERROR 为严重错误 主要是程序的错误
#WARN 为一般警告,比如session丢失
#INFO 为一般要显示的信息,比如登录登出
#DEBUG 为程序的调试信息
log4j.additivity.org.apache=true
###配置日志信息输出目的地Appender
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#org.apache.log4j.ConsoleAppender(控制台)
#org.apache.log4j.FileAppender(文件)
#org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
#org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
#org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
#log4j.appender.error.Target=System.out
###输出ERROR级别以上的日志
log4j.appender.stdout.threshold=INFO
###配置日志信息的格式(布局)
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#org.apache.log4j.HTMLLayout(以HTML表格形式布局)
#org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
#org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
#org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
###配置日志打印的格式格式化日志信息
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
#%m 输出代码中指定的消息
#%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
#%r 输出自应用启动到输出该log信息耗费的毫秒数
#%c 输出所属的类目,通常就是所在类的全名
#%t 输出产生该日志事件的线程名
#%n 输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n”
#%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss , SSS}
#%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数
#log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.DatePattern='.'yyyy-MM-dd-HH-mm
# '.'yyyy-MM:每月
# '.'yyyy-ww:每周
# '.'yyyy-MM-dd:每天
# '.'yyyy-MM-dd-a:每天两次
# '.'yyyy-MM-dd-HH:每小时
# '.'yyyy-MM-dd-HH-mm:每分钟
#log4j.appender.file.MaxFileSize=1MB
###滚动文件的最大数
#log4j.appender.file.MaxBackupIndex=8
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p](%-30c{1}) [TxId : %X{PtxId} , SpanId : %X{PspanId}] [ET:%X{ENV_TYPE},AN:%X{APP_NAME},SN:%X{SERVICE_NAME},CN:%X{CONTAINER_NAME},CI:%X{CONTAINER_IP}] %m%n
log4j.appender.file.Threshold=DEBUG
###将消息增加到指定文件中,false指将消息覆盖指定的文件内容
log4j.appender.file.append=true
###日志的保存位置
#log4j.appender.file.File=E:/logs/file-debug-log.log
log4j.appender.file.File=logs/file-debug-log.log
###每天产生一个日志文件
#log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
#log4j.appender.file.layout=org.apache.log4j.PatternLayout
#log4j.appender.file.maxFileSize=100
#log4j.appender.file.maxBackupIndex=5
#log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p](%-30c{1}) [TxId : %X{PtxId} , SpanId : %X{PspanId}] [ET:%X{ENV_TYPE},AN:%X{APP_NAME},SN:%X{SERVICE_NAME},CN:%X{CONTAINER_NAME},CI:%X{CONTAINER_IP}] %m%n
#log4j.appender.file.Threshold=DEBUG
#log4j.appender.file.append=true
#log4j.appender.file.File=E:/logs/debug-log.log
自动清理导出的日志文件
log4j.rootLogger=INFO,stdout,debug,error
#输出到控制台
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %p [%t] %C.%M(%L) | %m%n
#输出DEBUG级别以上的日志到文件
log4j.appender.debug=org.apache.log4j.RollingFileAppender
log4j.appender.debug.Threshold=DEBUG
log4j.appender.debug.File=./logs/log.txt
log4j.appender.debug.layout=org.apache.log4j.PatternLayout
log4j.appender.debug.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%5p] - %c -%F(%L) -%m%n
#最大文件50MB
log4j.appender.debug.MaxFileSize=50MB
#备份15个文件
log4j.appender.debug.MaxBackupIndex=15
log4j.appender.debug.Encoding=UTF-8
#输出error级别以上的日志到文件
log4j.appender.error=org.apache.log4j.RollingFileAppender
log4j.appender.error.Threshold=ERROR
log4j.appender.error.File=./logs/error.txt
log4j.appender.error.layout=org.apache.log4j.PatternLayout
log4j.appender.error.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%5p] - %c -%F(%L) -%m%n
#最大文件50MB
log4j.appender.error.MaxFileSize=50MB
#备份15个文件
log4j.appender.error.MaxBackupIndex=15
log4j.appender.error.Encoding=UTF-8
将日志发送到邮件或者存储到数据库,可参考:
https://blog.csdn.net/zzq900503/article/details/31411403
https://blog.csdn.net/zzq900503/article/details/87629782
相关文章
- springboot的启动流程及原理_精馏的原理及流程
- SpringBoot定制化组件
- Spring学习笔记(三十三)——SpringBoot集成Swagger
- 消息通讯——springboot集成MQTT
- 04-SpringBoot集成Nebula Graph
- 解决springboot 2.0集成elasticsearch 7.6.2 查询总数为10000
- SpringBoot整合oceanbase,实现oracle无缝切换到oceanbase
- 分布式--RabbitMQ集成SpringBoot、消息可靠性、死信队列、延迟交换机、集群
- springboot启动监听线程_Springboot启动流程
- SpringBoot 设置动态定时任务,千万别再写死了~
- 我真不信,这年头还有人能懂SpringBoot的ClassLoader加载机制
- 10年开发大牛教你如何学习获取调试SpringBoot源代码
- 解决Idea乱码问题 SpringBoot-yaml配置文件乱码问题
- springboot多环境配置文件_Springboot教程
- 【SpringBoot】19、SpringBoot中实现启动任务
- SpringBoot集成thymeleaf
- SpringBoot 如何保证接口安全?老鸟们都是这么玩的!
- SpringBoot实现JSON数据重复读取
- 在Linux CentOS7.7中搭建FTP服务并在Springboot中集成
- 基于Springboot和Mybatis的外卖项目 瑞吉外卖Day6
- 编辑 SpringBoot | 第五章:多环境配置详解编程语言
- SpringBoot集成Thymeleaf模板引擎详解编程语言