原先的日志配置方案在使用jar包运行时会导致所有服务的日志指向一个文件,这里我添加了工程个性化配置
修改公共日志配置
logback和logback-spring.xml都可以用于配置logback,但是2者的加载顺序是不同的:
logback.xml>application.properties>logback-spring.xml.
删除cloud1.0-common工程内的logback.xml
添加logback-spring.xml
logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- https://logback.qos.ch/manual/appenders.html 官网 -->
<!-- 这个是根配置文件,一定要有的
scan:是当配置文件被修改后会被重新加载
scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
-->
<configuration scan="true">
<contextName>cloud1.0</contextName>
<!--application.properities中配置的变量-->
<springProperty scope="context" name="logLevel" source="log.level"/>
<springProperty scope="context" name="logPath" source="log.path"/>
<springProperty scope="context" name="logName" source="log.name"/>
<springProperty scope="context" name="logDays" source="log.days"/>
<!-- 输出到控制台 -->
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<!-- 默认情况下,每个日志事件都会立即刷新到基础输出流。 这种默认方法更安全,因为如果应用程序在没有正确关闭appender的情况下退出,则日志事件不会丢失。
但是,为了显着增加日志记录吞吐量,您可能希望将immediateFlush属性设置为false -->
<encoder>
<!-- %-5level:级别从左显示5个字符宽度 -->
<!-- %msg:日志打印详情 -->
<!-- %n:换行符 -->
<pattern>[%date{yyyy-MM-dd HH:mm:ss.SSS}] %X{logthreadId} %-5level %logger{80} %method %line - %msg%n</pattern>
<!-- 控制台也要使用UTF-8,不要使用GBK,否则会中文乱码 -->
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 输出到文件
encoding:日志的编码
file:指定当前生成的日志文件名称
rollingPolicy:滚动策略
FileNamePattern:移动文件最后的名称,跟file标签结合使用,ps:file里面的内容是 1.txt,那么,FileNamePattern里面写的是2.txt,那么最后文件名就为2.txt,如果最后结尾是gz或者zip,那么,就会自动打成压缩包-->
<appender name="fileLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${logPath}${file.separator}${logName}.log</file>
<append>true</append>
<encoder>
<pattern>
[%date{yyyy-MM-dd HH:mm:ss.SSS}] %X{logthreadId} %-5level %logger{80} %method %line - %msg%n
</pattern>
<!-- 记录日志的编码:此处设置字符集 - -->
<charset>UTF-8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${logPath}${file.separator}%d{yyyy-MM-dd}${file.separator}%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
<!-- 每产生一个日志文件,该日志文件的保存期限为30天, ps:maxHistory的单位是根据fileNamePattern中的翻转策略自动推算出来的,例如上面选用了yyyy-MM-dd,则单位为天
如果上面选用了yyyy-MM,则单位为月,fileNamePattern单位默认为yyyy-MM-dd-->
<maxHistory>${logDays}</maxHistory>
<!-- maxFileSize:这是活动文件的大小,默认值是10MB,测试时可改成5KB看效果 -->
<maxFileSize>10MB</maxFileSize>
<!-- 每个日志文件到10mb的时候开始切分,最多保留30天,但最大到20GB,哪怕没到30天也要删除多余的日志 -->
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
</appender>
<!-- logger:日志单位
name:是你当前扫描的哪个包
level:日志的级别
additivity:默认为true,标识向上级传递日志(这里即向root传递日志)。
appender-ref:appender的引用
-->
<logger name="com.apexsoft.timer" level="${logLevel}">
<appender-ref ref="fileLog" />
<appender-ref ref="stdout" />
</logger>
<!--
默认根节点是INFO级别的日志 (如果直接使用root不使用logger,在输出debug级别时会输出大量与业务无关日志)
root:logger的根节点,就这一个,默认名称就是root
level:日志级别
appender-ref:确定使用哪个appender
-->
<root level="INFO">
<appender-ref ref="fileLog" />
<appender-ref ref="stdout" />
</root>
</configuration>
在依赖cloud1.0-common工程的服务的bootstrap.yml文件添加日志配置
这里以cloud1.0-zuul-server
工程为例
log:
#日志保存路径
path: /root/2019dev/cloud1.0/logs
#日志输出级别
level: debug
#日志名称
name: sc-zuul-server
#日志保存天数
days: 30
这里我选择将服务打成jar包部署到CentOS服务器
排除测试代码
由于
cloud1.0-user-server
、cloud1.0-data-service
工程依赖外部服务,如果不排除测试代码将提示[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.21.0异常
父工程pom.xml添加配置
<!-- 跳过单元测试,但是会继续编译 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
移除公共工程的maven插件
公共工程中除了必要的依赖包以外,maven打包的插件不要再添加一遍了,因为这个SpringBoot插件会在Maven的package后进行二次打包,目的为了生成可执行jar包,如果定义了这个插件,会报错提示没有找到main函数
[ERROR] Failed to execute goal
org.springframework.boot:spring-boot-maven-plugin:2.0.3.RELEASE:repackage
(default) on project cloud1.0-common: Execution default of goal
org.springframework.boot:spring-boot-maven-plugin:2.0.3.RELEASE:repackage
failed: Unable to find main class -> [Help 1]
注释掉cloud1.0-common工程和父工程pom.xml内的maven插件
<!-- <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> -->
打包
cd 父工程根目录(和pom.xml同级)
## 排除测试代码后进行打包
mvn clean package -Dmaven.test.skip=true
由于我环境变量配置的setting与ide内配置的setting不同,我在这里直接使用eclipse内置指令进行打包
右击父工程,选择Run As - Maven clean
右击父工程,选择Run As - Maven install
打包完成后 jar 包会生成到 target 目录下,命名一般是 项目名+版本号.jar
这里举个例子,当cloud1.0-config-server与cloud1.0-eureka-server部署于同一个服务器时eureka默认将会把config-server注册为内网IP,此时在外网中通过eureka的默认路由将无法获取到cloud1.0-config-server服务的相关数据
解决方案如下
cloud1.0-config-server
application.yml配置公网
eureka:
instance:
prefer-ip-address: true
ip-address: xxx.xxx.xxx.xxx
non-secure-port: xxxx
上传jar包再创建好各个服务的默认输入日志文件,最后执行如下执行(目录与日志文件需根据个人定制,由于服务众多使用Docker能减少很多重复操作,后续跟进)
nohup java -jar /root/2019dev/cloud1.0/cloud1.0-eureka-server-0.0.1-SNAPSHOT.jar > /root/2019dev/cloud1.0/logs/cloud1.0-eureka-server.log 2>&1 &
nohup java -jar /root/2019dev/cloud1.0/cloud1.0-auth-server-0.0.1-SNAPSHOT.jar > /root/2019dev/cloud1.0/logs/cloud1.0-auth-server.log 2>&1 &
nohup java -jar /root/2019dev/cloud1.0/cloud1.0-zuul-server-0.0.1-SNAPSHOT.jar > /root/2019dev/cloud1.0/logs/cloud1.0-zuul-server.log 2>&1 &
nohup java -jar /root/2019dev/cloud1.0/cloud1.0-config-server-0.0.1-SNAPSHOT.jar > /root/2019dev/cloud1.0/logs/cloud1.0-config-server.log 2>&1 &
nohup java -jar /root/2019dev/cloud1.0/cloud1.0-user-server-0.0.1-SNAPSHOT.jar > /root/2019dev/cloud1.0/logs/cloud1.0-user-server.log 2>&1 &
nohup java -jar /root/2019dev/cloud1.0/cloud1.0-data-service-0.0.1-SNAPSHOT.jar > /root/2019dev/cloud1.0/logs/cloud1.0-data-service.log 2>&1 &
nohup java -jar /root/2019dev/cloud1.0/cloud1.0-hystrix-dashboard-0.0.1-SNAPSHOT.jar > /root/2019dev/cloud1.0/logs/cloud1.0-hystrix-dashboard.log 2>&1 &