阅读 581

springboot项目日志配置以及打包(springboot日志配置及输出)

前言

在我们写完一个springboot的项目之后,不能避免的会涉及到配置日志以及打包的问题,因为最终项目肯定要在linux上,x86或者arm系统上运行。部署项目以及查看日志都是非常重要的。本篇就这两件事情稍微说一下。

日志配置问题

一般的我自己写的项目做日志配置的时候,就默认使用lombok的slf4j了。使用的基本姿势如下:

引入lombok依赖:

image.png

需要使用的类标识相关注解

image.png

需要的地方直接打日志就可以了

image.png

为了在部署到linux之后能看到完整的log文件,方便定位问题、分析服务状况,需要对日志做一下配置,如下,你需要使用的话只需要修改标签即可,例如我这里定义的ff/vv就是将日志生成到ff文件夹下,名称为vv.%d{yyyy-MM-dd}.log。

<?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="60 seconds"    debug="false">    <contextName>paymentContext</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}/ff/vv.%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}/ff/vv.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}/ff/vv.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> 复制代码

项目打包问题

项目打包,如果单纯使用下面的spring-boot-maven-plugin,效果可能并不好。因为它会将配置文件、lib包全部打到最终的jar包里面,这显然不是想要的。原因在于,我并不打算将配置文件和lib包全部打到最终的jar包里面,因为例如想修改下配置文件,不可能全部重新打包再上传到要部署服务的系统,而是简单地修改下配置文件直接重启就可以了。又比如lib中的依赖没什么问题,仅仅是代码写的有问题,那么我只想修改下代码重新上传再重启就可以了。而不是顺带着传递庞大的lib包。

image.png

没对比或许没什么伤害,我们先看下上面的这个spring的maven打包插件打出的包的效果。

image.png

image.png

BOOT_INF下面直接携带了整个的lib。配置文件则是出现在classes下面.这不是我们想要的,这就意味着,每次我改一行代码,除了代码之外都还要重新上传整个的lib和配置文件,太糟糕了。

研究了很久,最终用apache的打包插件打出了自己想要的包,将需要的插件整个的粘贴给大家。

<build>     <plugins>         <plugin>             <!--打包时去除第三方依赖-->             <groupId>org.springframework.boot</groupId>             <artifactId>spring-boot-maven-plugin</artifactId>             <configuration>                 <layout>ZIP</layout>                 <includes>                     <include>                         <groupId>non-exists</groupId>                         <artifactId>non-exists</artifactId>                     </include>                 </includes>             </configuration>         </plugin>         <plugin>             <groupId>org.apache.maven.plugins</groupId>             <artifactId>maven-jar-plugin</artifactId>             <configuration>                 <!-- 指定打包的jar包输出路径 -->                 <outputDirectory>target/hhh</outputDirectory>                 <excludes>                     <exclude>**/static/**</exclude>                     <exclude>**/templates/**</exclude>                     <exclude>**/*.properties</exclude>                     <exclude>**/*.xml</exclude>                     <exclude>**/*.yml</exclude>                 </excludes>                 <forceCreation>true</forceCreation>             </configuration>         </plugin>         <!--拷贝第三方依赖文件到指定目录-->         <plugin>             <groupId>org.apache.maven.plugins</groupId>             <artifactId>maven-dependency-plugin</artifactId>             <executions>                 <execution>                     <id>copy-dependencies</id>                     <phase>package</phase>                     <goals>                         <goal>copy-dependencies</goal>                     </goals>                     <configuration>                         <!--target/lib是依赖jar包的输出目录,根据自己喜好配置-->                         <outputDirectory>target/hhh/lib</outputDirectory>                         <excludeTransitive>false</excludeTransitive>                         <stripVersion>false</stripVersion>                         <includeScope>runtime</includeScope>                     </configuration>                 </execution>             </executions>         </plugin>         <plugin>             <groupId>org.apache.maven.plugins</groupId>             <artifactId>maven-antrun-plugin</artifactId>             <executions>                 <execution>                     <phase>package</phase>                     <goals>                         <goal>run</goal>                     </goals>                     <configuration>                         <target>                             <copy todir="target/hhh/resources">                                 <fileset dir="target/classes">                                     <exclude name="com/**" />                                     <exclude name="org/**" />                                     <include name="**/static/**" />                                     <include name="**/templates/**" />                                     <include name="**/*.properties" />                                     <include name="**/*.xml" />                                     <include name="**/*.yml" />                                 </fileset>                             </copy>                         </target>                     </configuration>                 </execution>             </executions>         </plugin>     </plugins>     <resources>         <resource>             <directory>src/main/java</directory>             <includes>                 <include>**/*.xml</include>             </includes>         </resource>         <resource>             <directory>src/main/resources</directory>             <includes>                 <include>**/*.*</include>             </includes>         </resource>     </resources> </build> 复制代码

现在咱们再来看下整个的打包效果。

image.png

ok.是我们期待的结果了。经过验证,打出来的文件都是正常没有问题的。整个的jar包也非常的干净!

还有一个问题需要提及下,原本的结构中。直接使用java -jar就可以启动项目了,但是现在是不行的。你需要自己指定下依赖包和配置文件!

image.png

下面粘贴下整个的一个启动、停止、状态shell脚本。

#!/bin/bash #这里可替换为你自己的执行程序,BASE_PROJECT_NAME为部署时项目基础路径(bin盛放启动脚本,项目基础路径指的是bin的上层路径),其他代码无需更改 APP_NAME=common-project-1.0-SNAPSHOT.jar BASE_PROJECT_NAME="icp-service" JAVA_OPTS="-server -Xms10m -Xmx20m -XX:NewRatio=2 -XX:SurvivorRatio=8 -XX:+PrintGCDetails -XX:+UseSerialGC" #使用说明,用来提示输入参数 usage() { echo "Usage: sh 脚本名.sh [start|stop|restart|status]" exit 1 } #检查程序是否在运行 is_exist(){ pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}' ` #如果不存在返回1,存在返回0 if [ -z "${pid}" ]; then return 1 else return 0 fi } #启动方法 start(){ is_exist if [ $? -eq "0" ]; then echo "${APP_NAME} is already running. pid=${pid} ." else nohup java $JAVA_OPTS -cp lib/*:resources/:../$BASE_PROJECT_NAME/$APP_NAME com.xxx.CommonApplication  >/dev/null 2>&1 & echo "${APP_NAME} start success" fi } #停止方法 stop(){ is_exist if [ $? -eq "0" ]; then kill -9 $pid else echo "${APP_NAME} is not running" fi } #输出运行状态 status(){ is_exist if [ $? -eq "0" ]; then echo "${APP_NAME} is running. Pid is ${pid}" else echo "${APP_NAME} is NOT running." fi } #重启 restart(){ stop start } #根据输入参数,选择执行对应方法,不输入则执行使用说明 case "$1" in "start") start ;; "stop") stop ;; "status") status ;; "restart") restart ;; *) usage ;; esac 复制代码

启动命令最后这里的>/dev/null 2>&1 &,因为我在日志配置中已经指定日志的输出位置了,所以这边不再将其单独输出到某文件,有需要的话,可以自己指定文件!

本篇到此结束。


作者:119_115_104_104_201
链接:https://juejin.cn/post/7034320698101202951


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐