slf4j

JDK9的新特性:JVM的xlog

故事扮演 提交于 2020-08-09 12:25:38
简介 在java程序中,我们通过日志来定位和发现项目中可能出现的问题。在现代java项目中,我们使用log4j或者slf4j,Logback等日志记录框架来处理日志问题。 JVM是java程序运行的基础,JVM中各种事件比如:GC,class loading,JPMS,heap,thread等等其实都可以有日志来记录。通过这些日志,我们可以监控JVM中的事件,并可以依次来对java应用程序进行调优。 在JDK9中引入的Xlog日志服务就是为这个目的而创建的。 通过xlog,JDK将JVM中的各种事件统一起来,以统一的形式对外输出。通过tag参数来区分子系统,通过log level来区分事件的紧急性,通过logging output来配置输出的地址。 更多内容请访问 www.flydean.com xlog的使用 先看一个最简单的xlog的使用例子: java -Xlog -version 输出结果: [0.016s][info][os] Use of CLOCK_MONOTONIC is supported [0.016s][info][os] Use of pthread_condattr_setclock is not supported [0.016s][info][os] Relative timed-wait using pthread_cond_timedwait is

来看看阿里架构师Java 代码打日志姿势!你也是这样写的吗

孤者浪人 提交于 2020-08-09 11:13:45
使用slf4j 使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一。 实现方式统一使用: Logback框架 打日志的正确方式 什么时候应该打日志 当你遇到问题的时候,只能通过debug功能来确定问题,你应该考虑打日志,良好的系统,是可以通过日志进行问题定为的。 当你碰到if…else 或者 switch这样的分支时,要在分支的首行打印日志,用来确定进入了哪个分支 经常以功能为核心进行开发,你应该在提交代码前,可以确定通过日志可以看到整个流程 基本格式 必须使用参数化信息的方式: logger.debug("Processing trade with id:[{}] and symbol : [{}] ", id, symbol); 对于debug日志,必须判断是否为debug级别后,才进行使用: if (logger.isDebugEnabled()) { logger.debug("Processing trade with id: " +id + " symbol: " + symbol); } 不要进行字符串拼接,那样会产生很多String对象,占用空间,影响性能。 反例(不要这么做): logger.debug("Processing trade with id: " + id + " symbol: " + symbol); 使用[]进行参数变量隔离

Spring Boot 各种日志框架记录方式

假如想象 提交于 2020-08-08 14:31:04
1、常用日志框架比较 对于我们日常开发日志是经常使用的,Commons Logging是Spring Boot在所有内部日志中使用,但是默认配置也提供了对常用日志的支持,Log4J, Log4J2和Logback。 1.1 slf4j 门面模式,其核心为 外部与一个子系统的通信必须通过一个统一的外观对象进行,使得子系统更易于使用 。结构如图: 门面模式的核心为Facade即门面对象,门面对象核心为: 知道所有子角色的功能和责任 将客户端发来的请求委派到子系统中,没有实际业务逻辑 不参与子系统内业务逻辑的实现 slf4j是门面模式的典型应用, slf4j只是一个日志标准,并不是日志系统的具体实现, 需要和具体的日志框架实现配合使用(Log4J, Log4J2,Logback)。 slf4j只做两件事: 提供日志接口 提供获取具体日志对象的方法 我们为什么要使用slf4j,举个例子: 在开发中,我们经常会使用到之前的类库,或者别人写的类库,使用的日志记录框架和自己本身的不一致,如果我需要使用到,就得维护两套日志配置,维护成本上升,不划算。 使用日志接口便于更换为其他日志框架。 log4j、logback、log4j2都是一种日志具体实现框架,所以既可以单独使用也可以结合slf4j一起搭配使用 1.2 log4j Log4j有三个主要的组件:Loggers(记录器),Appenders

springboot基于spark-launcher构建rest api远程提交spark任务

ぐ巨炮叔叔 提交于 2020-08-08 13:10:57
参考文章: 使用springboot构建rest api远程提交spark任务 spark-submit动态提交的办法(SparkLauncher实战) 用java提交一个Spark应用程序 Spark-利用SparkLauncher 类以JAVA API 编程的方式提交spark job --impt 官网API参考: http://spark.apache.org/docs/latest/api/java/index.html?org/apache/spark/launcher/package-summary.html github代码链接:github地址 1. spark集群及版本信息 服务器版本:centos7 hadoop版本:2.8.3 spark版本:2.3.3 使用springboot构建rest api远程提交spark任务,将数据库中的表数据存储到hdfs上,任务单独起一个项目,解除与springboot项目的耦合 2. 构建springboot项目 1. pom配置 <properties> <java.version>1.8</java.version> <spark.version>2.3.3</spark.version> <scala.version>2.11</scala.version> </properties> <dependencies>

Spring Cloud 系列之 ZooKeeper 注册中心

本小妞迷上赌 提交于 2020-08-08 08:35:57
什么是注册中心      服务注册中心是服务实现服务化管理的核心组件,类似于目录服务的作用,主要用来存储服务信息,譬如提供者 url 串、路由信息等。服务注册中心是微服务架构中最基础的设施之一。   注册中心可以说是微服务架构中的“通讯录”,它记录了服务和服务地址的映射关系。在分布式架构中,服务会注册到这里,当服务需要调用其它服务时,就到这里找到服务的地址,进行调用。   简单理解就是:在没有注册中心时候,服务间调用需要知道被当服务调方的具体地址(写死的 ip:port)。更换部署地址,就不得不修改调用当中指定的地址。而有了注册中心之后,每个服务在调用别人的时候只需要知道服务名称(软编码)就好,地址都会通过注册中心根据服务名称获取到具体的服务地址进行调用。   举个现实生活中的例子,比如说,我们手机中的通讯录的两个使用场景: 当我想给张三打电话时,那我需要在通讯录中按照名字找到张三,然后就可以找到他的手机号拨打电话。—— 服务发现 李四办了手机号并把手机号告诉了我,我把李四的号码存进通讯录,后续,我就可以从通讯录找到他。—— 服务注册 通讯录 —— ?什么角色(服务注册中心)   总结:服务注册中心的作用就是 服务的注册 和 服务的发现 。    常见的注册中心    Netflix Eureka Alibaba Nacos HashiCorp Consul Apache

java.lang.NoClassDefFoundError: org/slf4j/Logger class not found with IntelliJ and SBT

这一生的挚爱 提交于 2020-08-08 05:15:34
问题 I am trying to run a spark scala program where in I have used "import org.apache.spark.internal.Logging" . Program was running fine in local until I try to build a fat jar and added assembly.sbt using build.sbt Here's my build.sbt lazy val root = (project in file(".")). settings( name := "TestingSparkApplicationProject", version := "0.0.1-SNAPSHOT", scalaVersion := "2.11.12", mainClass in Compile := Some("com.test.spark.job.TestSparkJob.scala") ) val sparkVersion = "2.4.3" libraryDependencies

Setting environment variables of Sentry dynamically for logback.xml Sentry appender

寵の児 提交于 2020-08-08 05:10:51
问题 My app is using slf4j and naturally, I have a logback.xml file. I try to add a Sentry appender to this file. This is my logback.xml file. <appender name="CONSOLE-INFO" class="ch.qos.logback.core.ConsoleAppender"> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <target>System.out</target> <encoder> <pattern>%d %p %c{1.} %m%n</pattern> </encoder> </appender> <appender name="CONSOLE-ERROR" class="ch

Setting environment variables of Sentry dynamically for logback.xml Sentry appender

给你一囗甜甜゛ 提交于 2020-08-08 05:09:32
问题 My app is using slf4j and naturally, I have a logback.xml file. I try to add a Sentry appender to this file. This is my logback.xml file. <appender name="CONSOLE-INFO" class="ch.qos.logback.core.ConsoleAppender"> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <target>System.out</target> <encoder> <pattern>%d %p %c{1.} %m%n</pattern> </encoder> </appender> <appender name="CONSOLE-ERROR" class="ch

Springboot快速上手- 第三篇 注解/流程/依赖

不问归期 提交于 2020-08-08 04:52:47
1:SpringBootApplication注解 简介 在启动类上有一个非常重要的注解,就是SpringBootApplication注解,理解它对于理解SpringBoot的启动过程很有帮助。 可以查看一下SpringBootApplication的源码,里面有很多注解,其中最重要的有: 1: @Configuration ,这个是在@SpringBootConfiguration里面用的 2:@EnableAutoConfiguration 3:@ComponentScan @EnableAutoConfiguration 2:SpringApplication执行流程 可以配着看源码 3:起步依赖 什么是起步依赖 Spring Boot通过提供众多起步依赖来降低项目依赖的复杂度。所谓起步依赖,就是一个Maven项目对象模型(Project Object Model,POM),定义了对其他库的传递依赖,这些东西加在一起即支持某项功能 好处 不用管究竟需要哪些依赖:添加相应的起步依赖,就相当于把一堆需要的依赖都加入了。 也不用管具体要依赖什么版本:起步依赖本身的版本是由正在使用的Spring Boot的版本来决定 的,而起步依赖则会决定它们引入的传递依赖的版本。 Springboot目前有哪些起步依赖 可以参看官方文档: https://docs.spring.io

别在 Java 代码里乱打日志了,这才是正确的打日志姿势!

那年仲夏 提交于 2020-08-07 21:16:06
使用slf4j 使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一。 实现方式统一使用: Logback框架 打日志的正确方式 什么时候应该打日志 当你遇到问题的时候,只能通过debug功能来确定问题,你应该考虑打日志,良好的系统,是可以通过日志进行问题定为的。 当你碰到if…else 或者 switch这样的分支时,要在分支的首行打印日志,用来确定进入了哪个分支 经常以功能为核心进行开发,你应该在提交代码前,可以确定通过日志可以看到整个流程 基本格式 必须使用参数化信息的方式: logger.debug("Processing trade with id:[{}] and symbol : [{}] ", id, symbol); 对于debug日志,必须判断是否为debug级别后,才进行使用: if (logger.isDebugEnabled()) { logger.debug("Processing trade with id: " +id + " symbol: " + symbol); } 不要进行字符串拼接,那样会产生很多String对象,占用空间,影响性能。 反例(不要这么做): logger.debug("Processing trade with id: " + id + " symbol: " + symbol); 使用[]进行参数变量隔离