2020-11-25 springboot和日志

**

一、常用日志框架

**
常用日志框架包括JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j等。其中JCL,SLF4J,Jboss-logging日志的抽象层,log4j、Log4j2、Logback、 JUL(java.util.logging)为日志实现框架。
spring框架默认使用commos-logging框架,springboot默认使用SLF4J+LogBack日志。

二、springboot+日志的使用

1、SLF4J+LogBack

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");
  }
}

1、虽然springboot默认使用SLF4J+LogBack,但是也可以使用其他的实现类框架进行日志操作。官方图示如下:
在这里插入图片描述
根据图示,SLF4J接口虽然不能直接通过log4j,jul等实现,但是可以添加一个中间适配器,使两者绑定。具体如图所示:
(1)、spring-boot-start-logging中,引入了jul和log4j 的适配器。
在这里插入图片描述

(2)、进入适配器,可以看到,转换适配器对上实现了SLF4J的接口,对下包含了调用的的是log4的方法,通过实现SLF4J和调用log4j,绕过了用log4j直接实现SLF4J的问题,从而实现了SLF4J和log4j的绑定。
在这里插入图片描述
在这里插入图片描述

3、但是各种框架默认的日志框架不同,例如Spring(commons-logging)、Hibernate(jboss-logging),此时springboot就需要对这些框架的日志进行统一整合。

在这里插入图片描述
在这里插入图片描述

如官方图所示,即在其他日志类接口中引入转换包,例如:log4j-over-slf4j。jar。框架将系统中其他日志框架先排除出去,同时引入的这些转换包包含了原日志接口的所需的所有类,代替了原有框架,并使用SLF4J替换了原有组件。最后都转换成l了SLF4J.Api,实现了多种不同日志框架的统一整合。
在这里插入图片描述

注意:

SpringBoot能自动适配所有的日志,而且底层使用slf4j+logback的方式记录日志,在引入其他框架时,必须将其默认的日志框架移除后,再导入中间转换包才可以生效。

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

参考文档:https://www.slf4j.org

三、日志使用

1、日志等级
日志等级包括五个等级,trace<debug<info<warn<error
trace:打印更多信息,最低的日志级别
debug:开发过程中打印一些运行信息
info:打印重要信息
warn:警告
error:错误
2、springboot修改日志默认配置
(1)设置日志默认级别
SpringBoot默认使用的是info级别的,没有指定级别的就用SpringBoot默认规定的级别,即root级别,但可以通过配置文件调整输出的日志级别,日志就只会在这个级别以以后的高级别生效。

logging.level.com.xx=trace//级别

(2)指定日志生成路径
如果不指定路径,就会在当前项目下生成springboot.log日志。如果什么都不配置则只会在控制台打印。

指定完整路径
logging.file.name=G:/springboot.log

在当前**磁盘**的根路径下创建spring文件夹和里面的log文件夹;使用 spring.log 作为默认文件
logging.file.path=/spring/log

(3)修改日志格式

#  在控制台输出的日志的格式
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

日志输出格式:
%d表示日期时间,
%thread表示线程名,
%-5level:级别从左显示5个字符宽度
%logger{50} 表示logger名字最长50个字符,否则按照句点分割。
%msg:日志消息,
%n是换行符

3、配置文件指定配置
(1)、给类路径下放上每个日志框架自己的配置文件即可;SpringBoot就不使用他默认配置的了,配置文件命名格式如下:
Logbacklogback-spring.xml, logback-spring.groovy, logback.xmllogback.groovy
Log4j2log4j2-spring.xmllog4j2.xml
JDKlogging.properties
(2)、logback.xml与logback-spring.xml的区别
logback.xml:直接就被日志框架识别,这种情况下使用logback.xml作为日志配置文件,还要使用profile功能,会有以下错误

 IllegalStateException: Logback configuration error detected:

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

   <layout class="ch.qos.logback.classic.PatternLayout">
   
 			  在dev环境下使用这种配置格式
            <springProfile name="dev">
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ----> [%thread] ---> %-5level %logger{50} - %msg%n</pattern>
            </springProfile>
             在非dev环境下使用这种配置格式
            <springProfile name="!dev">
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ==== [%thread] ==== %-5level %logger{50} - %msg%n</pattern>
            </springProfile>

四、日志框架切换
1、排除原框架的xxx-over-slf4j依赖和logback-classic依赖
2、加入需要框架的依赖。(建议使用默认配置)例: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>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然可以,以下是详细的步骤: 1. 安装docker和docker-compose 在CentOS上安装Docker和Docker Compose,可以使用以下命令: ``` sudo yum update -y sudo yum install -y docker sudo systemctl start docker sudo systemctl enable docker sudo systemctl status docker ``` Docker Compose是Docker的一个插件,需要单独安装: ``` sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose docker-compose --version ``` 2. 创建工作目录 在你选择的目录里创建一个名为`elk`的目录,并进入该目录。 ``` mkdir elk && cd elk ``` 在该目录中新建以下文件夹 ``` mkdir -p logs/elasticsearch config/elasticsearch logs/kibana logs/logstash plugin ``` 3. 创建elasticsearch docker compose 在`elk`目录下,创建一个名为`docker-compose.yml`的文件,并加入以下内容: ```yml version: '3' services: elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:7.14.0 container_name: elasticsearch environment: - discovery.type=single-node - xpack.security.enabled=false - "ES_JAVA_OPTS=-Xms512m -Xmx512m" volumes: - ./logs/elasticsearch:/usr/share/elasticsearch/logs - ./config/elasticsearch:/usr/share/elasticsearch/config ports: - 9200:9200 - 9300:9300 networks: - elk networks: elk: ``` 说明: - `elasticsearch`是容器名称,可以根据实际情况调整 - `discovery.type=single-node`表示只有一个节点 - `xpack.security.enabled=false`表示不启用安全模式 - `ES_JAVA_OPTS=-Xms512m -Xmx512m`表示分配512MB内存给Elasticsearch容器 - `./logs/elasticsearch:/usr/share/elasticsearch/logs`表示将本地的`logs/elasticsearch`目录映射到Elasticsearch容器内的`/usr/share/elasticsearch/logs`目录 - `./config/elasticsearch:/usr/share/elasticsearch/config`表示将本地的`config/elasticsearch`目录映射到Elasticsearch容器内的`/usr/share/elasticsearch/config`目录 - `9200:9200`和`9300:9300`表示将容器内的9200和9300端口映射到宿主机上,方便通过浏览器访问 4. 创建kibana docker compose 在`elk`目录下,继续编辑`docker-compose.yml`,添加以下内容: ```yml version: '3' services: elasticsearch: ... networks: - elk kibana: image: docker.elastic.co/kibana/kibana:7.14.0 container_name: kibana environment: - ELASTICSEARCH_HOSTS=http://elasticsearch:9200 volumes: - ./logs/kibana:/usr/share/kibana/logs ports: - 5601:5601 depends_on: - elasticsearch networks: - elk networks: elk: ``` 说明: - `kibana`服务依赖于`elasticsearch`服务,必须要先启动`elasticsearch` - `ELASTICSEARCH_HOSTS=http://elasticsearch:9200`表示连接到Elasticsearch容器的9200端口 - `5601:5601`表示将容器内的5601端口映射到宿主机上,方便通过浏览器访问 5. 创建logstash docker compose 在`elk`目录下,继续编辑`docker-compose.yml`,添加以下内容: ```yml version: '3' services: elasticsearch: ... networks: - elk kibana: ... networks: - elk logstash: image: docker.elastic.co/logstash/logstash:7.14.0 container_name: logstash volumes: - ./plugin:/usr/share/logstash/plugins command: logstash -f /usr/share/logstash/pipeline/logstash.conf ports: - 5044:5044 - 5000:5000 depends_on: - elasticsearch networks: - elk networks: elk: ``` 说明: - `logstash`服务依赖于`elasticsearch`服务,必须要先启动`elasticsearch` - `./plugin:/usr/share/logstash/plugins`表示将本地的`plugin`目录映射到Logstash容器内的`/usr/share/logstash/plugins`目录 - `command: logstash -f /usr/share/logstash/pipeline/logstash.conf`表示运行`/usr/share/logstash/pipeline/logstash.conf`文件中的配置 - `5044:5044`和`5000:5000`表示将容器内的5044和5000端口映射到宿主机上,方便和应用程序交互 6. 配置logstash 在`elk`目录下,创建`logstash/pipeline`目录,并在其中新建名为`logstash.conf`的文件,并加入以下内容: ```conf input { tcp{ port => 5000 type => "spring-boot" } udp { port => 5000 type => "spring-boot" } } filter { if [type] == "spring-boot" { grok { match => { "message" => "%{TIMESTAMP_ISO8601:logtime} %{LOGLEVEL:loglevel} --- \[%{DATA:thread}\] %{DATA:class}.%{DATA:method} : %{GREEDYDATA:message}" } } } } output { elasticsearch { hosts => ["elasticsearch:9200"] index => "spring-boot-%{+YYYY.MM.dd}" } } ``` 说明: - `input`表示输入流设置,这里使用了TCP或UDP协议,监听5000端口 - `filter`表示过滤流设置,grok插件用来解析正则表达式。这里用正则表达式解析Spring Boot应用程序产生的日志文件 - `output`表示输出流设置,将过滤后的日志数据输出到Elasticsearch中 7. 使用Docker Compose启动服务 在`elk`目录下,运行以下命令启动服务: ``` docker-compose up -d ``` 等待一些时间后,整个`ELK`服务就启动了。 8. 测试 启动所有容器后,让Spring Boot应用程序将日志发送到端口5000 打开浏览器,输入`http://你的ip:5601/app/discover`访问Kibana应用程序。在Kibana应用程序中,创建索引,并在Discover页面中查看项目的日志信息。 现在,您已经成功地使用Docker Compose在CentOS上搭建了一个Spring Boot整合的ELK。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值