SpringBoot项目中控制台日志的保存配置操作


Posted in Java/Android onJune 18, 2021

SpringBoot 控制台日志的保存配置

情景:SpringBoot项目中需要把控制台日志保存下来。

实现方法:

1.在配置文件application-prod.yml

配置如下:

logging:
  config: classpath:logback-spring-prod.xml

2.logback-spring-prod.xml

这个文件是记录控制台打印日志保存的路径配置如下:

<?xml version="1.0" encoding="UTF-8"?>
 
<!-- 分级别异步文件日志输出配置 -->
<configuration>
    <!-- 日志级别 -->
    <property name="logLevel" value="INFO"></property>
    <!-- 日志地址 -->
    <property name="logPath" value="/usr/server/shop/logs/"></property>
    <property name="logPathDebug" value="/usr/server/shop/logs/debug/"></property>
    <property name="logPathInfo" value="/usr/server/shop/logs/info/"></property>
    <property name="logPathWarn" value="/usr/server/shop/logs/warn/"></property>
    <property name="logPathError" value="/usr/server/shop/logs/error/"></property>
    <!-- 最大保存时间 -->
    <property name="maxHistory" value="30"/>
    <!-- 异步缓冲队列的深度,该值会影响性能.默认值为256 -->
    <property name="queueSize" value="512"></property>
    <!--日志文件名前缀-->
    <property name="name" value="shop_prod"></property>
 
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%black(%contextName -) %red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{60}) - %gray(%msg%n)</pattern>
        </encoder>
    </appender>
 
    <appender name="FILE_DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <file>${logPathDebug}/${name}_debug.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${logPathDebug}/${name}_debug.log.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxHistory>${maxHistory}</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>50MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [ %thread ] - [ %-5level ] [ %logger{50} : %line ] - %msg%n</pattern>
        </encoder>
    </appender>
 
    <appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <file>${logPathInfo}/${name}_info.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${logPathInfo}/${name}_info.log.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxHistory>${maxHistory}</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>50MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [ %thread ] - [ %-5level ] [ %logger{50} : %line ] - %msg%n</pattern>
        </encoder>
    </appender>
 
    <appender name="FILE_WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>WARN</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <file>${logPathWarn}/${name}_warn.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${logPathWarn}/${name}_warn.log.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxHistory>${maxHistory}</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>50MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [ %thread ] - [ %-5level ] [ %logger{50} : %line ] - %msg%n</pattern>
        </encoder>
    </appender>
 
    <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <file>${logPathError}/${name}_error.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${logPathError}/${name}_error.log.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxHistory>${maxHistory}</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>50MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [ %thread ] - [ %-5level ] [ %logger{50} : %line ] - %msg%n</pattern>
        </encoder>
    </appender>
 
    <appender name="ASYNC_LOG_DEBUG" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>${queueSize}</queueSize>
        <appender-ref ref="FILE_DEBUG"/>
    </appender>
 
    <appender name="ASYNC_LOG_INFO" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>${queueSize}</queueSize>
        <appender-ref ref="FILE_INFO"/>
    </appender>
 
    <appender name="ASYNC_LOG_WARN" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>${queueSize}</queueSize>
        <appender-ref ref="FILE_WARN"/>
    </appender>
 
    <appender name="ASYNC_LOG_ERROR" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>${queueSize}</queueSize>
        <appender-ref ref="FILE_ERROR"/>
    </appender>
 
    <root level="${logLevel}">
        <!-- appender referenced after it is defined -->
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="ASYNC_LOG_DEBUG"/>
        <appender-ref ref="ASYNC_LOG_INFO"/>
        <appender-ref ref="ASYNC_LOG_WARN"/>
        <appender-ref ref="ASYNC_LOG_ERROR"/>
    </root>
 
</configuration>

注意:

<property name="logPath" value="/usr/server/shop/logs/"></property>

中日志存放的路径在/usr/server/shop/logs/下存放。

SpringBoot项目怎么保存服务的运行时日志

这个问题相对很简单,只需要完成两个步骤

配置log4j输出日志的文件

在pom中需要引用lombok依赖,版本跟随你的springboot夫版本即可

<dependency>
 <groupId>org.projectlombok</groupId>
 <artifactId>lombok</artifactId>
 <optional>true</optional>
</dependency>
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds"
	debug="false">
	<contextName>StudentContext</contextName>
	<property name="log.path" value="./logs" />
	<!--输出到控制台 -->
	<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
		<encoder>
			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{76}.%M\(%line\) - %msg%n</pattern>
			<charset>UTF-8</charset>
		</encoder>
	</appender>
	<!-- 全部日志 -->
	<appender name="all" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<fileNamePattern>${log.path}/student/student.%d{yyyy-MM-dd}.log</fileNamePattern>
			<maxHistory>60</maxHistory>
		</rollingPolicy>
		<encoder>
			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{76}.%M\(%line\) - %msg%n</pattern>
			<charset>UTF-8</charset>
		</encoder>
	</appender>
	<!-- 输出到warn -->
	<appender name="warn" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<fileNamePattern>${log.path}/student/student.warn.%d{yyyy-MM-dd}.log</fileNamePattern>
			<maxHistory>60</maxHistory>
		</rollingPolicy>
		<encoder>
			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{76}.%M\(%line\) - %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">
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<fileNamePattern>${log.path}/student/student.error.%d{yyyy-MM-dd}.log</fileNamePattern>
			<maxHistory>60</maxHistory>
		</rollingPolicy>
		<encoder>
			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{76}.%M\(%line\) - %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>
	<root level="info">
		<appender-ref ref="console" />
		<appender-ref ref="all" />
		<appender-ref ref="warn" />
		<appender-ref ref="error" />
	</root>
</configuration>

log4j输出日志的文件,将其放在resources下即可,注意fileNamePattern这个标签中的东西换成标识你微服务作用的,比如我写的学生管理系统,所以用的是student

在application指定此配置文件的位置

logging:
  level:
    com.netflix.discovery.shared.resolver.aws.ConfigClusterResolver: WARN
  config: classpath:logback-common.xml

完毕,当你将项目部署到linux服务器。日志就会产生,每天的日志是一个文件,非常方便。以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Java/Android 相关文章推荐
springBoot基于webSocket实现扫码登录
Jun 22 Java/Android
Java Dubbo框架知识点梳理
Jun 26 Java/Android
Maven学习----Maven安装与环境变量配置教程
Jun 29 Java/Android
SpringBoot读取Resource下文件的4种方法
Jul 02 Java/Android
Java使用jmeter进行压力测试
Jul 09 Java/Android
Java使用JMeter进行高并发测试
Nov 23 Java/Android
Java 超详细讲解数据结构中的堆的应用
Apr 02 Java/Android
Elasticsearch Recovery 详细介绍
Apr 19 Java/Android
java版 联机五子棋游戏
May 04 Java/Android
springboot实现string转json json里面带数组
Jun 16 Java/Android
使用Postman测试需要授权的接口问题
Jun 21 Java/Android
详解Spring Security如何在权限中使用通配符
Jun 28 Java/Android
浅谈@Value和@Bean的执行顺序问题
Jun 16 #Java/Android
SpringBoot2 参数管理实践之入参出参与校验的方式
Jun 16 #Java/Android
SpringBoot生成License的实现示例
Springboot如何使用logback实现多环境配置?
解决tk mapper 通用mapper的bug问题
一篇带你入门Java垃圾回收器
Java实现简易的分词器功能
You might like
PHP的mysqli_query参数MYSQLI_STORE_RESULT和MYSQLI_USE_RESULT的区别
2014/09/29 PHP
PHP输出九九乘法表代码实例
2015/03/27 PHP
THINKPHP5分页数据对象处理过程解析
2020/10/28 PHP
jquery 表单进行客户端验证demo
2009/08/24 Javascript
jquery 事件执行检测代码
2009/12/09 Javascript
轻松学习jQuery插件EasyUI EasyUI实现拖动基本操作
2015/11/30 Javascript
IOS中safari下的select下拉菜单文字过长不换行的解决方法
2016/09/26 Javascript
JavaScript重定向URL参数的两种方法小结
2016/10/19 Javascript
jquery滚动条插件slimScroll使用方法
2017/02/09 Javascript
使用travis-ci如何持续部署node.js应用详解
2017/07/30 Javascript
node实现定时发送邮件的示例代码
2017/08/26 Javascript
详解node服务器中打开html文件的两种方法
2017/09/18 Javascript
微信小程序radio组件使用详解
2018/01/31 Javascript
Bootstrap-table自定义可编辑每页显示记录数
2018/09/07 Javascript
Vue核心概念Getter的使用方法
2019/01/18 Javascript
layui当点击文本框时弹出选择框,显示选择内容的例子
2019/09/02 Javascript
小程序跳转到的H5页面再跳转回跳小程序的方法
2020/03/06 Javascript
《javascript设计模式》学习笔记五:Javascript面向对象程序设计工厂模式实例分析
2020/04/08 Javascript
Vue+Element-U实现分页显示效果
2020/11/15 Javascript
[46:57]EG vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
零基础写python爬虫之抓取糗事百科代码分享
2014/11/06 Python
python cs架构实现简单文件传输
2020/03/20 Python
Python读取txt某几列绘图的方法
2018/10/14 Python
python2.7 安装pip的方法步骤(管用)
2019/05/05 Python
Pycharm简单使用教程(入门小结)
2019/07/04 Python
Python使用mongodb保存爬取豆瓣电影的数据过程解析
2019/08/14 Python
基于python实现上传文件到OSS代码实例
2020/05/09 Python
Python filter过滤器原理及实例应用
2020/08/18 Python
丝芙兰意大利官方网站:Sephora.it
2019/12/13 全球购物
PHP开发的一般流程
2013/08/13 面试题
预备党员承诺书
2014/03/25 职场文书
抽奖活动主持词
2014/03/31 职场文书
高考标语大全
2014/06/05 职场文书
高中校园广播稿
2014/10/21 职场文书
laravel添加角色和模糊搜索功能的实现代码
2021/06/22 PHP
Nginx 安装SSL证书完成HTTPS部署
2022/04/28 Servers