求求你,别再用 System.out.println("");了!

日志管理,避免程序中到处是System.out.println(); 统一管理日志打印与通过System.out.println();打印 立即下载

1、日志框架

小张;开发一个大型系统: 

1、System.out.println("");将关键数据打印在控制台;去掉?写在一个文件?

2、框架来记录系统的一些运行时信息;日志框架 ;zhanglogging.jar;

3、高大上的几个功能?异步模式?自动归档?xxxx?zhanglogging-good.jar?

4、将以前框架卸下来?换上新的框架,重新修改之前相关的API;

zhanglogging-prefect.jar;

5、JDBC---数据库驱动;写了一个统一的接口层;日志门面(日志的一个抽象层);logging-abstract.jar;给项目中导入具体的日志实现就行了;我们之前的日志框架都是实现的抽象层;

「市面上的日志框架:」

JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j....

日志门面 (日志的抽象层)日志实现
JCL(Jakarta Commons Logging) SLF4j(Simple Logging Facade for Java) 「jboss-logging」Log4j JUL(java.util.logging) Log4j2 「Logback」

左边选一个门面(抽象层)、右边来选一个实现;

日志门面:SLF4J;

日子实现:Logback;

Spring boot:底层是Spring框架,Spring框架默认是用JCL;

Spring boot选用SLF4J和logback;

2. SLF4J 使用

1、如何在系统中使用SLF4j  https://www.slf4j.org」

以后开发的时候,日志记录方法的调用,不应该来直接调用日志的实现类,而是调用日志抽象层里面的方法;给系统里面导入slf4j的jar和logback的实现jar。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HelloWorld {
  public static void main(String[] args) {
    Logger logger = LoggerFactory.getLogger(HelloWorld.class);
    logger.info("Hello World");
  }
}

「图示:」

每一个日志的实现框架都有自己的配置文件,使用slf4j以后,「配置文件还是做成日志实现框架自己本身的配置文件;」

2. 遗留问题

a(slf4j+logback): Spring(commons-logging)、Hibernate(jboss-logging)、MyBatis、xxxx

统一日志记录,即使是别的框架和我一起统一使用slf4j进行输出?

如何让系统中所有的日志都统一到slf4j:

1.将系统中其他日志框架先排除出去;」

2.用中间包来替换原有的日志框架;」

3.我们导入slf4j其他的实现;」


3. SpringBoot 日志关系

<dependency>        
  <groupId>org.springframework.boot</groupId>            
  <artifactId>spring‐boot‐starter</artifactId>            
</dependency>

SpringBoot使用它来做日志功能:

<dependency>    
  <groupId>org.springframework.boot</groupId>            
  <artifactId>spring‐boot‐starter‐logging</artifactId>            
</dependency>

底层依赖关系:

总结:

1,SpringBoot底层也是使用slf4j+logback的方式进行日志记录。

2,SpringBoot也把其他的日志都替换成了slf4j;

3,中间替换包?

@SuppressWarnings("rawtypes")
public abstract class LogFactory {
    static String UNSUPPORTED_OPERATION_IN_JCL_OVER_SLF4J =
"http://www.slf4j.org/codes.html#unsupported_operation_in_jcl_over_slf4j";
    static LogFactory logFactory = new SLF4JLogFactory();

4,如果我们要引用其他框架?一定要把这个框架的默认日志依赖移除掉?

Spring框架用的是commons-logging;

<dependency>        
<groupId>org.springframework</groupId>            
<artifactId>spring‐core</artifactId>            
<exclusions>            
<exclusion>                
<groupId>commons‐logging</groupId>                    
<artifactId>commons‐logging</artifactId>                    
</exclusion>                
</exclusions>            
</dependency>

「SpringBoot能自动适配所有的日志,而且底层使用slf4j+logback的方式记录日志,引入其他框架的时候,只需要把这个框架依赖的日志框架排除掉即可;」


4. 日志的使用

1.默认配置

「SpringBoot默认帮我们配置好了日志;」

//记录器    
Logger logger = LoggerFactory.getLogger(getClass());    
@Test    
public void contextLoads() {    
//System.out.println();        
//日志的级别;
//由低到高   trace<debug<info<warn<error        
//可以调整输出的日志级别;日志就只会在这个级别以以后的高级别生效        
logger.trace("这是trace日志...");        
logger.debug("这是debug日志...");        
//SpringBoot默认给我们使用的是info级别的,没有指定级别的就用SpringBoot默认规定的级别;root
级别


logger.info("这是info日志...");        
logger.warn("这是warn日志...");        
logger.error("这是error日志...");        
}

日志输出格式:%d表示日期时间


%thread表示线程名,


%‐5level:级别从左显示5个字符宽度


%logger{50} 表示logger名字最长50个字符,否则按照句点分割。

%msg:日志消息,


%n是换行符


‐‐> %d{yyyy‐MM‐dd HH:mm:ss.SSS} [%thread] %‐5level %logger{50} ‐ %msg%n

Spring Boot修改日志的默认配置

logging.level.com.atguigu=trace
#logging.path=
# 不指定路径在当前项目下生成springboot.log日志
# 可以指定完整的路径;
#logging.file=G:/springboot.log
# 在当前磁盘的根路径下创建spring文件夹和里面的log文件夹;使用 spring.log 作为默认文件
logging.path=/spring/log
#  在控制台输出的日志的格式
logging.pattern.console=%d{yyyy‐MM‐dd} [%thread] %‐5level %logger{50} ‐ %msg%n
# 指定文件中日志输出的格式
logging.pattern.file=%d{yyyy‐MM‐dd} === [%thread] === %‐5level === %logger{50} ==== %msg%n
logging.filelogging.pathExampleDescription
(none)(none)
只在控制台输出
指定文件名(none)my.log输出日志到my.log文件
(none)指定目录/var/log输出到指定目录的 spring.log 文件中

2. 指定配置

给类路径下放上每个日志框架自己的配置文件即可;SpringBoot就不使用他默认配置的了。

Logging SystemCustomization
Logbacklogback-spring.xml ,  logback-spring.groovy ,  logback.xml or logback.groovy
Log4j2log4j2-spring.xml or  log4j2.xml
JDK (Java Util Logging)logging.properties

logback.xml:直接就被日志框架识别了;

logback-spring.xml:日志框架就不直接加载日志的配置项,由SpringBoot解析日志配置,可以使用SpringBoot的高级Profile功能。

<springProfile name="staging">
    <!‐‐ configuration to be enabled when the "staging" profile is active ‐‐>
   可以指定某段配置只在某个环境下生效  
</springProfile>
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
        <!‐‐
        日志输出格式:
%d表示日期时间,            
%thread表示线程名,            
%‐5level:级别从左显示5个字符宽度            
%logger{50} 表示logger名字最长50个字符,否则按照句点分割。
%msg:日志消息,            
%n是换行符            
        ‐‐>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <springProfile name="dev">
                <pattern>%d{yyyy‐MM‐dd HH:mm:ss.SSS} ‐‐‐‐> [%thread] ‐‐‐> %‐5level
%logger{50} ‐ %msg%n</pattern>
            </springProfile>
            <springProfile name="!dev">
                <pattern>%d{yyyy‐MM‐dd HH:mm:ss.SSS} ==== [%thread] ==== %‐5level
%logger{50} ‐ %msg%n</pattern>
            </springProfile>
        </layout>
    </appender>

如果使用logback.xml作为日志配置文件,还要使用profile功能,会有以下错误

no applicable action for [springProfile]

5. 切换日志框架

可以按照slf4j的日志适配图,进行相关的切换;

slf4j+log4j的方式:

dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring‐boot‐starter‐web</artifactId>
  <exclusions>
    <exclusion>
      <artifactId>logback‐classic</artifactId>
      <groupId>ch.qos.logback</groupId>
    </exclusion>
    <exclusion>
      <artifactId>log4j‐over‐slf4j</artifactId>
      <groupId>org.slf4j</groupId>
    </exclusion>
  </exclusions>
</dependency>
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j‐log4j12</artifactId>
</dependency>

切换为log4j2

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring‐boot‐starter‐web</artifactId>
    <exclusions>
    <exclusion>
       <artifactId>spring‐boot‐starter‐logging</artifactId>
      <groupId>org.springframework.boot</groupId>
    </exclusion>
  </exclusions>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring‐boot‐starter‐log4j2</artifactId>
</dependency>
作者:雨尔辰辰来源:my.oschina.net/yuchener/blog/4658516
Unreal浅做一个MetaBall Raymaching其实就是实时场景的一种渲染方法。主要原理网上有很多详细介绍。简单来说就是,以摄像机为原点,发射很多条射线,而每一条射线以步长为单位向前采样,同时以采样点和最近的物体像素的距离为半径进行一个球形检测。检测到摄像机和场景像素在当前射线方向的距离差小于某个值,就表示射线到达物体表面,然后画这个像素。 阅读详情

相关推荐

单细胞 | pySCENIC·转录因子分析(二)

接上一篇,pySCENIC分析完之后就可以进行可视化了,个人认为最重要的有三个图:rss点图,rank图,转录因子表达水平热图,3个图结合着看。3.可视化rank图,可以自己改一下plotRSS_oneSet参数让图更好看一点。4. regulon表达水平热图,转录因子表达水平同理,得到的图类似只是输入不一样。2.可视化点图:寻找cluster特异性转录因子。1.loom文件读入R,提取数据。

生信练习生 4283

深入理解为什么不要使用System.out.println()

关于项目中为什么不要使用System.out.println()的解释,网上有很多资料却并不准确或者详细,今天就其原因以及可能对项目造成的影响做深入剖析。

专注Java实用技术分享 4945

飞控算法-姿态解算之互补滤波

飞控乱入之姿态解算 姿态解算是通过读取各个传感器的数据进行融合最终得到当前飞行器的姿态,姿态通常用Euler角(Roll-Pitch-Yaw)来表示 姿态解算框架 姿态解算的数据源可来自于陀螺仪或加速度计,他们分别都可以得到当前姿态,但实际上他们都有各自的传感器性能的优缺点,需要取长补短,进行数据融合才能得到真实的姿态,这种方法简称 互补滤波 算法 传感器特性 互补滤波 姿态解...

GoolyOh的专栏 1万+

把System.out.print的输出加到logback的日志文件中

经常会碰到一些旧系统,使用System.out直接在控制台输出日志,然后再用命令行重定向的方法把日志写到文件中,这个方法主要问题是日志会越来越大,要经常手动删除。今天我们就把System.out的输出加到logback的日志文件中,由logback来管理这些日志。直接上代码,一都在代码和注释中了。和控制台输出的一模一样。

dengxiaodai的专栏 3301

独立站SaaS平台源码搭建全流程指南:从零到部署

一、什么是独立站SaaS?二、搭建前的准备工作技术选型建议模块 推荐方案 备选方案前端框架 React/Vue3 + TypeScript Angular后端框架 Spring Boot (Java)/Django (Python) Node.js (NestJS)数据库 MySQL + Redis PostgreSQL/MongoDB云服务 阿里云/腾讯云/AWS 华为云容器化 Docker + Kubernetes Docker Compose环境要求。

Vx18664956126的博客 1891

特征模理论指导滤波天线设计的优势和方法

本文探讨了特征模理论在滤波天线设计中的应用优势和方法。特征模理论通过分析天线结构的本征模特性,突破了传统经验设计的局限,实现了辐射与滤波功能的一体化设计。文章重点阐述了如何利用模式显著性(MS)和模式加权系数(MWC)来指导辐射零点的产生,揭示了辐射零点形成的物理机制。通过特征模分析,设计师可以明确调控天线结构和馈电系统,优化滤波性能。这种方法为现代多频/宽带滤波天线设计提供了理论依据和实用工具,显著提升了设计效率和性能指标。

qq_64207806的博客 957

解决System.out.println不好使的替代方法

想写测试语句,发现System.out.println不好使,在eclipse中不能打印出来,不知道是怎么回事,不过在网上找到一个替代方法,共享一下。就是用android自带LogCat类。具体方法:1.在eclipse中点击菜单栏,window->Show View 把LogCat显示出来2.在程序中这样写:import android.util.Log;priv

a3015440的专栏 1561

峰值电流模式CCM BUCK的传递函数推导

电流内环闭环传递函数: Gci(s)=i^L(s)v^comp(s)=FmGid(s)1+KRiHe(s)FmGid(s)=1Ri11+s[mcL+(0.5VIN−Vo)RiVINRifSW]+s21(πfSW)2 G_{ci}(s)=\frac{\hat i_{L}(s)}{\hat v_{comp}(s)}=\frac {F_mG_{id}(s)}{1+KR_iH_e(s)F_mG_{id}(s)}=\frac{1}{R_i}\frac{1}{1+s[\frac{m_cL+(0.5V_{IN}-V_o)

c007106333的博客 2357

java中读取logback日志文件_java 控制台 System.out日志输出到logback文件里

使用spring boot2.0.7开发项目,由于调用了其他组c++的本地方法,他们的日志是直接在控制台打印日志的,而我们这边统一用logback记录日志,然后logback配置后控制台的日志没有记录到日志文件,不好排查问题,于是找到了一个插件,简单配置即可。http://projects.lidalia.org.uk/sysout-over-slf4j/quickstart.htmlQuick ...

weixin_31916125的博客 836

Zemax光学设计——单透镜设计

(1)在镜头数据编辑器中面2那一栏中的“曲率半径”栏右侧的方格中单击,弹出“在面2上的曲率解”对话框(2)将对话框中的求解类型设为“F数”(3)将“F/#”设置为10设置完成后,其中的一些数据会发生变化在初始结构中,透镜的曲率半径和厚度未知,,这些参数需要软件自动优化得到,但可以使用透镜后表面上边缘厚度解得到近轴焦平面的位置在透镜后表面的厚度上单击鼠标右键,选择边缘光线求解类型,它表示近轴边缘光线会自动在下一个表面上聚焦并确定距离值。

yangSHU21的博客 2万+

6.6kW的车载充电器(On-Board Charger, OBC)电路分析

图片展示了6.6kW的车载充电器(On-Board Charger, OBC)电路,其中包含双向和单向两种拓扑结构。接下来我们将深入分析每个模块的设计、原理及其优势,以帮助理解不同结构在实际应用中的选型和应用。

weixin_43199439的博客 5663

Java的System.out.println()深入解析理解

在Java程序(特别是控制台)中常用System.out.println()语句来输出信息,从开始学习Java就知道用它来输出Hello World,没有深究其实现原理,现在查阅文档、源代码后记录一下。 首先查阅文档和源码可知System是java.lang包里的一个final类,而每个Java程序是默认import java.lang.*的,因此即使程序中没有手动导入,也可访问到System类。 main()方法是static修饰的,根据Java语法,它只能调用static方法和变量,那么查看System

代码与诗 3万+

【GlobalMapper精品教程】084:tif(tfw)、jpg(jgw)、png(pgw)的区别与联系

摘要:本文介绍了TFW、JGW、PGW等地理参考文件的基本原理和应用。这些文件通过简单的文本格式存储栅格图像的地理坐标信息,适用于平面坐标系下的GIS数据处理。文章详细说明了文件各行的含义,并提供了在ArcGIS和Globalmapper中生成这些文件的具体操作步骤,包括导出TIFF、JPG、PNG格式时勾选生成对应坐标文件的选项。这些文件虽然简单易用,但仅适用于平面坐标系,且功能相对有限。配套视频教程提供了更详细的操作演示。

智慧空间实验室 2402

java system out_Java中System.out.println的含义是什么?

实际上, out是System类中的一个静态成员(不是.NET中的),是PrintStream一个实例。 println是PrintStream类的正常(重载)方法。实际上,如果out / err / in是类,由于命名约定 (忽略语法),它们将用大写字母( Out / Err / In ) 命名 。System是一个类,有一个公共静态字段。 所以更像class System { public ...

weixin_33799059的博客 4407

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【Java】System.out.println

System.out.println() System.out.println是一个Java语句,一般情况下是将传递的参数,打印到控制台 System是Java.lang包中的一个final类,该类提供的设施包括标准输入、标准输出和错误输出流、访问外部定义的属性和环境变量,一种加载文件和库的方法,以及用于加速复制数组等一部分的使用方法。 out是System类的静态成员字段,类型为PrintSt...

Ankie_的博客 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

java中system.out.println关于out的理解

在Java编程中,我们常常用System.out.println()方法来输出,在集合中我经常看到使用方法引用的方式来遍历集合元素:xxx.foreach(System.out::println);也许我们都已经猜到println()是方法名,System是类名,但out又是什么呢? 通过查阅api文档,我们可以发现,out是System类的一个field,我们经常翻译成“域”、”属性”、“字段”...

weiyi_fan的博客 4277

Java System.out.println()的简单理解

在Java中,是用于将输出打印到控制台的语句。在这个语句中,out是System类的一个静态成员变量,它是一个类型的对象。out对象是System类的标准输出流。它提供了一系列方法来打印各种数据类型的值,并将其显示在控制台上。常用的方法包括println(打印并换行)、print(打印但不换行)等。使用,您可以将消息、变量的值或任何其他需要在控制台上显示的内容输出到标准输出流。

qq_67986576的博客 6015

慎用System.out.println!!!

初学者一般在开发中或者调试bug的时候,都会习惯性的使用System.out.println语句,输出到控制台中,观察数据是否正常。开发或者调试完毕,很可能就忘记删除,直接就发布到生产中去了。 问题导入 有童鞋会说,那有啥关系的,不就是控制台多打印一些日志嘛。那今天老师就和童鞋们分析一下,System.out.println输出语句对服务性能的影响。 场景设置 假如你的服务对性能要求极高,...

林老师带你学编程 8958

求求你别再用System.out.println("");了

点击上方蓝色字体,选择“标星公众号”优质文章,第一时间送达 关注公众号后台回复pay或mall获取实战项目资料+视频 作者:雨尔辰辰来源:my.oschina.net/yuchener/...

公众号-老炮说Java 588

【JAVA】system.out.print、System.out.println和System.out.printf输出

一、 System.out.print() \\ 不换行输出 二、System.out.println() \\换行输出 还有一种方式:System.out.print("\n"); \\也可以换行。 三、System.out.printf package test; public class Main { public static void main(St...

【敦厚的曹操】的专栏 4932
上一篇: 牛逼!来了一个 Java 神器
下一篇: 快来看看这三道大厂面试题,你知道现在的面试有多难吗???
Java思维导图
博客等级 码龄10年 306粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值