SpringBoot初级开发--加入Log4j进行日志管理打印(6)


  日志记录在整个java工程开发中占着很重要的比重,因为很多问题的排查需要通过日志分析才能确认。在SpringBoot中我用得最多的就是log4j这个日志框架。接下来我们具体配置log4j.

  log4j定义了8个级别的log(除去OFF和ALL,可以说分为6个级别),优先级从高到低依次为:OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、 ALL

    logger.fatal("fatal"); // 严重错误,一般会造成系统崩溃和终止运行logger.error("error"); // 错误信息,但不会影响系统运行logger.warn("warn"); // 警告信息,可能会发生问题logger.info("info"); // 程序运行信息,数据库的连接、网络、IO操作等logger.debug("debug"); // 调试信息,一般在开发阶段使用,记录程序的变量、参数等logger.trace("trace"); // 追踪信息,记录程序的所有流程信息

1.添加POM依赖

     <!-- log4j的日志服务 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j</artifactId><version>1.3.8.RELEASE</version></dependency>

2.增加log4j.properties日志配置文件

在工程的resources文件夹,增加log4j.properties,具体配置文件如下:

### set log levels - for more verbose logging change 'info' to 'debug' ###
#展示log4j的各种配置
log4j.rootLogger=stdout,File
log4j.appender.logfile.encoding=UTF-8#打印到控制台的日志
### Console DEBUG
log4j.logger.stdout=DEBUG
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Append=true  
log4j.appender.stdout.MaxFileSize=20MB  
log4j.appender.stdout.MaxBackupIndex=10  
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  
log4j.appender.stdout.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss}-[ %p ] %c - %m%n#普通文件保存日志
### File
log4j.appender.File.Threshold = ERROR
log4j.appender.File = org.apache.log4j.DailyRollingFileAppender
log4j.appender.File.layout = org.apache.log4j.PatternLayout
log4j.appender.File.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss}:%p - %m%n
log4j.appender.File.File=E:/console.log
log4j.appender.File.DatePattern='.'yyyy-MM-dd#自己定义的日志,这里我们是用作记录用户访问的日志
#这里的日志是按天滚动,后缀名是年月日
###Access log
log4j.logger.accessInfo=INFO,R1
log4j.appender.R1 = org.apache.log4j.DailyRollingFileAppender
log4j.appender.R1.layout = org.apache.log4j.PatternLayout
log4j.appender.R1.Encoding=UTF-8
log4j.appender.R1.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss}:%p %t %c - %m%n
log4j.appender.R1.File=E:/access.log
log4j.appender.R1.DatePattern='.'yyyy-MM-dd#自己定义的日志,这里我们是用作记录用户阅读的日志
#这里的日志是按天滚动,后缀名是年月日
#user read record log
log4j.logger.userRead=INFO,R2
log4j.appender.R2 = org.apache.log4j.DailyRollingFileAppender
log4j.appender.R2.layout = org.apache.log4j.PatternLayout
log4j.appender.R2.Encoding=UTF-8
log4j.appender.R2.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss}:%p %t %c - %m%n
log4j.appender.R2.File=E:/user_read.log
log4j.appender.R2.DatePattern='.'yyyy-MM-dd#INFO
#关闭某些日志的输出
log4j.logger.com.zaxxer.hikari=OFF
log4j.logger.org.apache.http.impl.conn.PoolingHttpClientConnectionManager=OFF
log4j.logger.org.thymeleaf.TemplateEngine.CONFIG=OFF
log4j.logger.org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener=OFF
log4j.logger.io.lettuce=OFF

这里总共输出了4块日志:
一个是stdout的标准控制台输出。

一个是普通文件保存日志基本是所有的日志都会输出在这里,所以它的日志级别定义的非常高,定义成ERROR级别,这样普通的DEBUG,INFO这样的日志都不会输出到这里,只有ERROR级别的才会输出。

一个是accessInfo日志,这是用户自定义的一个日志,用于记录用户的访问日志

一个是userRead日志,这是用户自定义的一个日志,用于记录用户的阅读记录日志

接下里在代码里面,我们增加用户自定义日志的使用技巧,我们定义一个接口常量,这样用户在记录自己特有的日志信息时,就可以直接用常量接口来调用

package com.example.firstweb.util;import org.apache.log4j.Logger;public interface Constants {public static final Logger LOG_ACCESS_INFO = Logger.getLogger("accessInfo");public static final Logger LOG_USER_READ = Logger.getLogger("userRead");}

然后我们在Controller里面使用这些接口常量来记录日志

package com.example.firstweb.controller;import com.example.firstweb.model.po.WelcomePo;
import com.example.firstweb.model.vo.WelcomeVo;
import com.example.firstweb.service.WelcomeService;
import com.example.firstweb.util.Constants;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;import org.apache.log4j.Logger;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.servlet.ModelAndView;@Controller
@Api(value = "welcome controller", tags = "欢迎界面")
public class Welcome {@Autowiredprivate WelcomeService welcomeService;private static final Logger log = Logger.getLogger(Welcome.class);@GetMapping("/welcomeindex")@ApiOperation("欢迎首页的方法1")public ModelAndView welcomeIndex(){ModelAndView view = new ModelAndView("welcomeindex");WelcomePo wpo= welcomeService.getWelcomInfo();WelcomeVo wvo= new WelcomeVo();BeanUtils.copyProperties(wpo, wvo);view.addObject("welcomedata", wvo);//默认控制台输出日志log.info("default log info ");//输出访问日志Constants.LOG_ACCESS_INFO.info("welcome index accesss");//输出用户阅读日志Constants.LOG_USER_READ.info("first user access log ");return view;}@GetMapping("/welcomeindex2")@ApiOperation("欢迎首页的方法2")public void welcomeIndex2(@ApiParam("定制欢迎词") String test){}
}

然后启动程序,用浏览器访问http://localhost:8088/welcomeindex,然后我们在本地磁盘就可以看到三个日志文件,分别是access.log,console.log,user_read.log在这里插入图片描述
源代码可以在这里直接获得链接: https://pan.baidu.com/s/161WLSttV-nz5Fbmpf6_VVw 提取码: rgrf

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/110656.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python爬虫实战案例——第三例

文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff01;严禁将文中内容用于任何商业与非法用途&#xff0c;由此产生的一切后果与作者无关。若有侵权&#xff0c;请联系删除。 起点中文网月票榜加密字体处理 字体加密的原理&#xff1a;就是将一种特定的…

Python工具箱系列(四十一)

使用zip批量压缩文件 前文的代码示例了使用gzip对单个文件进行压缩。本文示例使用更通用的zipfile来批量压缩文件。zipfile也是python内置的库&#xff0c;使用起来非常方便。废话不说&#xff0c;直接上代码示例。 import dbm import glob import zipfile# 保存压缩计划的库名…

开发工具——IDE安装 / IDEA子module依赖导入失败编译提示xx找不到符号 / IDEA在Git提交时卡顿

近期换了工作电脑&#xff0c;公司的IT团队不够给力&#xff0c;不能复制电脑系统&#xff0c;所以又到了需要重装IDE配置开发环境的时候了&#xff1b;在安装和导入Java编译器IDEA的时候遇到一些"棘手"问题&#xff0c;这里整理下解决方法以备不时之需&#xff1b; …

Python爬虫框架之快速抓取互联网数据详解

概要 Python爬虫框架是一个能够帮助我们快速抓取互联网数据的工具。在互联网时代&#xff0c;信息爆炸式增长&#xff0c;人们越来越需要一种快速获取信息的方式。而Python爬虫框架就能够帮助我们完成这个任务&#xff0c;它可以帮助我们快速地从互联网上抓取各种数据&#xf…

Nginx-报错no live upstreams while connecting to upstream

1、问题描述 生产环境Nginx间歇性502的事故分析过程 客户端请求后端服务时一直报错 502 bad gateway&#xff0c;查看后端的服务是正常启动的。后来又查看Nginx的错误日志&#xff0c;发现请求后端接口时Nginx报错no live upstreams while connecting to upstream&#xff0c…

防御网络攻击风险的4个步骤

如今&#xff0c;人们正在做大量工作来保护 IT 系统免受网络犯罪的侵害。令人担忧的是&#xff0c;对于运营技术系统来说&#xff0c;情况却并非如此&#xff0c;运营技术系统用于运行从工厂到石油管道再到发电厂的所有业务。 组织应该强化其网络安全策略&#xff0c;因为针对…

Golang Gorm 一对多的添加

一对多的添加有两种情况&#xff1a; 一种是添加用户的时候同时创建文章其次是创建文章关联已经存在的用户。 package mainimport ("gorm.io/driver/mysql""gorm.io/gorm" )// User 用户表 一个用户拥有多篇文章 type User struct {ID int64Name …

华为数通方向HCIP-DataCom H12-821题库(单选题:101-120)

第101题 可用于多种路由协议,由 ​​if-match​​​和 ​​apply​​子句组成的路由选择工具是 A、​​route-policy​​ B、​​IP-Prefix​​ C、​​commnityfilter​​ D、​​as-path-filter​​ 答案&#xff1a;A 解析&#xff1a; Route-policy&#xff08;路由策…

Java代码通过经纬度计算省份。

直接上代码&#xff0c;需要市区县可自己解析 String areaName addressUtil.getPosition(longitude, latitude); package com.skyable.device.utils.velicle;import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import l…

LiveNVR监控流媒体Onvif/RTSP功能-支持语音对讲支持非国标摄像头SDK语音对讲GB28181级联国标平台非国标转国标语音对讲

LiveNVR支持语音对讲支持非国标摄像头SDK语音对讲GB28181级联国标平台非国标转国标语音对讲 1、确认摄像头是否支持对讲2、摄像头视频类型复合流3、通道配置SDK接入4、视频广场点击播放5、相关问题5.1、如何配置通道获取直播流&#xff1f;5.2、如何GB28181级联国标平台&#x…

C语言每日一练------(Day3)

本专栏为c语言练习专栏&#xff0c;适合刚刚学完c语言的初学者。本专栏每天会不定时更新&#xff0c;通过每天练习&#xff0c;进一步对c语言的重难点知识进行更深入的学习。 今天练习题的关键字&#xff1a; 尼科彻斯定理 等差数列 &#x1f493;博主csdn个人主页&#xff1a…

服务器数据恢复-reiserfs文件系统损坏如何恢复数据?

服务器数据恢复环境&#xff1a; 一台IBM X系列服务器&#xff0c;4块SAS硬盘组建一组RAID5阵列&#xff0c;采用的reiserfs文件系统。服务器操作系统分区结构&#xff1a;boot分区LVM卷swap分区&#xff08;按照前后顺序&#xff09;。LVM卷中直接划分了一个reiserfs文件系统&…

时序预测 | MATLAB实现DBN-SVM深度置信网络结合支持向量机时间序列预测(多指标评价)

时序预测 | MATLAB实现DBN-SVM深度置信网络结合支持向量机时间序列预测(多指标评价) 目录 时序预测 | MATLAB实现DBN-SVM深度置信网络结合支持向量机时间序列预测(多指标评价)效果一览基本描述程序设计参考资料 效果一览 基本描述 MATLAB实现DBN-SVM深度置信网络结合支持向量机…

Nuxt3打包部署到Linux(node+pm2安装和运行步骤+nginx代理)

最近&#xff0c;我们项目组的工作接近尾声&#xff0c;需要把项目部署上线。由于前端第一次使用Nuxt3框架&#xff0c;后端也是第一次部署Nuxt3项目&#xff0c;所以刚开始出现了很多问题。在我上网搜索很多教程后&#xff0c;得到了基本的流程。 1.服务器安装node.js环境 N…

jdk 03.stream

01.集合处理数据的弊端 当我们在需要对集合中的元素进行操作的时候&#xff0c;除了必需的添加&#xff0c;删除&#xff0c;获取外&#xff0c;最典型的操作就是集合遍历 package com.bobo.jdk.stream; import java.util.ArrayList; import java.util.Arrays; import java.ut…

乡村振兴战略下传统村落文化旅游设计书辉瑞

乡村振兴战略下传统村落文化旅游设计书辉瑞

新KG视点 | Jeff Pan、陈矫彦等——大语言模型与知识图谱的机遇与挑战

OpenKG 大模型专辑 导读 知识图谱和大型语言模型都是用来表示和处理知识的手段。大模型补足了理解语言的能力&#xff0c;知识图谱则丰富了表示知识的方式&#xff0c;两者的深度结合必将为人工智能提供更为全面、可靠、可控的知识处理方法。在这一背景下&#xff0c;OpenKG组织…

【VLDB 2023】基于预测的云资源弹性伸缩框架MagicScaler,实现“高QoS,低成本”双丰收

开篇 近日&#xff0c;由阿里云计算平台大数据基础工程技术团队主导&#xff0c;与计算平台MaxCompute团队、华东师范大学数据科学与工程学院、达摩院合作&#xff0c;基于预测的云计算平台资源弹性伸缩框架论文《MagicScaler: Uncertainty-aware, Predictive Autoscaling 》被…

深度学习之反卷积

具体推理可以参考https://blog.csdn.net/zhsmkxy/article/details/107073350

SpringBoot中间件ElasticSearch

Elasticsearch是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的 全文搜索引擎 &#xff0c;基于RESTful web 接口。 Elasticsearch 是用 Java 语言开发的&#xff0c;并作为 Apache 许可条款下的开放源码发布&#xff0c;是一种流行的企业级搜索引擎。Elastics…