#log4j.rootLogger=CONSOLE,info,error,DEBUG
log4j.rootLogger=info,error,CONSOLE,DEBUG
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n
log4j.logger.info=info
log4j.appender.info=org.apache.log4j.DailyRollingFileAppender
log4j.appender.info.layout=org.apache.log4j.PatternLayout
log4j.appender.info.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n
log4j.appender.info.datePattern='.'yyyy-MM-dd
log4j.appender.info.Threshold = info
log4j.appender.info.append=true
#log4j.appender.info.File=/home/admin/pms-api-services/logs/info/api_services_info
log4j.appender.info.File=/Users/dddd/Documents/testspace/pms-api-services/logs/info/api_services_info
log4j.logger.error=error
log4j.appender.error=org.apache.log4j.DailyRollingFileAppender
log4j.appender.error.layout=org.apache.log4j.PatternLayout
log4j.appender.error.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n
log4j.appender.error.datePattern='.'yyyy-MM-dd
log4j.appender.error.Threshold = error
log4j.appender.error.append=true
#log4j.appender.error.File=/home/admin/pms-api-services/logs/error/api_services_error
log4j.appender.error.File=/Users/dddd/Documents/testspace/pms-api-services/logs/error/api_services_error
log4j.logger.DEBUG=DEBUG
log4j.appender.DEBUG=org.apache.log4j.DailyRollingFileAppender
log4j.appender.DEBUG.layout=org.apache.log4j.PatternLayout
log4j.appender.DEBUG.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n
log4j.appender.DEBUG.datePattern='.'yyyy-MM-dd
log4j.appender.DEBUG.Threshold = DEBUG
log4j.appender.DEBUG.append=true
#log4j.appender.DEBUG.File=/home/admin/pms-api-services/logs/debug/api_services_debug
log4j.appender.DEBUG.File=/Users/dddd/Documents/testspace/pms-api-services/logs/debug/api_services_debug
### Debug
log4j.logger.com.ibatis=DEBUG
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
上述log4j.properties文件中,當前配置爲線下開發模式,若部署線上環境,需要釋放掉註釋語句,並註釋線下配置語句。
#log4j.appender.info.File=/home/admin/pms-api-services/logs/info/api_services_info
log4j.appender.info.File=/Users/dddd/Documents/testspace/pms-api-services/logs/info/api_services_info
pom.xml添加
<!--log4j--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
用AOP管理所有的日誌
package com.tzy.aop; import org.apache.log4j.Logger; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import java.util.Arrays; import java.util.Enumeration; @Component @Aspect /* * 定義切面執行的優先級,數字越低,優先級越高 * 在切入點之前執行:按order值有小到大的順序執行 * 在切入點之後執行:按order值由大到小的順序執行 */ @Order(-5) public class AppLogAspect { private static Logger logger = Logger.getLogger(AppLogAspect.class); // 保證每個線程都有一個單獨的實例 private ThreadLocal<Long> time = new ThreadLocal<Long>(); @Pointcut("execution(* com.tzy.controller..*.*(..))") public void pointcut() { } @Before("pointcut()") public void doBefore(JoinPoint joinPoint) { time.set(System.currentTimeMillis()); ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); //記錄請求的內容 logger.info("Request URL: " + request.getRequestURL().toString()); logger.info("Request Method: " + request.getMethod()); logger.info("User-Agent: " + request.getHeader("User-Agent")); logger.info("Class Method: " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName()); logger.info("Cookies: " + request.getCookies()); logger.info("Params: " + Arrays.toString(joinPoint.getArgs())); Enumeration<String> enums = request.getParameterNames(); while (enums.hasMoreElements()) { String paraName = enums.nextElement(); logger.info(paraName + ":" + request.getParameter(paraName)); } } @AfterReturning("pointcut()") public void doAfterReturning(JoinPoint joinPoint) { logger.info("耗時 : " + ((System.currentTimeMillis() - time.get())) + "ms"); logger.info("AppLogAspect.doAfterReturning()"); } }
**定時任務調度
定時任務一般會存在中大型企業級項目中,爲了減少服務器、數據庫的壓力往往會採用時間段性的去完成某些業務邏輯。比較常見的就是金融服務系統推送回調,一般支付系統訂單在沒有收到成功的回調返回內容時會持續性的回調,這種回調一般都是定時任務來完成的。還有就是報表的生成,我們一般會在客戶訪問量過小的時候來完成這個操作,那往往都是在凌晨。這時我們也可以採用定時任務來完成邏輯。SpringBoot爲我們內置了定時任務,我們只需要一個註解就可以開啓定時爲我們所用了。
https://www.jianshu.com/p/c7492aeb35a1異步任務
讀取配置文件
在application.properties 中添加鍵值對
這裏測試用控制層
***springBoot區分不同環境
這樣你上什麼環境,修改配置文件,讀出來的東西就是什麼環境的
主文件里加一個這樣的寫法切面
**修改端口號
application.properties添加如下
server.port=80 server.context-path=/tzy
***springBoot的YAML配置
可以減少配置寫法,列出了結構
替換properties文件
# mysql 的數據庫配置 spring: datasource: url: jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8 username: root password: root driver-class-name: com.mysql.jdbc.Driver server: port: 8081 context-path: /ttzzyy # 訪問地址:http://localhost:8081/ttzzyy # tomcat: # uri-encoding: UTF-8 # session: # timeout:
package com.tzy.ymlcontroller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* Created by 70416 on 2018/4/11.
*/
@RestController
public class Yml {
@RequestMapping("/yml")
public String yml(){
return "success";
}
}
package com.tzy;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
/**
* Created by 70416 on 2018/4/10.
*/
@ComponentScan(basePackages = {"com.tzy.ymlcontroller"})
@EnableAutoConfiguration
public class APP {
public static void main(String[] args) {
//主函數的啓動入口,springboot是通過應用程序運行的
SpringApplication.run(APP.class, args);
}
}
**redis
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
parent是1.5.3
來個工具包
<dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency>
簡單封裝了Redis
package com.tzy.service;
import freemarker.template.utility.StringUtil;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
* Created by 70416 on 2018/4/11.
*/
@Service
public class RedisService {
@Autowired
private StringRedisTemplate stringRedisTemplate;
//這樣API用起來更舒服
public void setString(String key, Object value) {
this.setObject(key,value,null);
}
public void setString(String key, Object value,Long time) {
this.setObject(key,value,time);
}
public void setList(String key, List value) {
this.setObject(key,value,null);
}
public void setObject(String key, Object value,Long time) {
//redis有幾種string list set zset hash 還缺有效期
if (StringUtils.isEmpty(key) || value == null) {
return;
}
//判斷存string
if (value instanceof String) {
String strValue = (String) value;
stringRedisTemplate.opsForValue().set(key, strValue);
if(time!=null){
stringRedisTemplate.opsForValue().set(key, strValue,time, TimeUnit.SECONDS);
}
return;
}
//判斷是list類型
if (value instanceof List) {
List<String> listValue = (List<String>) value;
for (String string : listValue) {
stringRedisTemplate.opsForList().leftPush(key, string);
}
return;
}
//省略剩下的
}
public Object getStringKey(String key){
return stringRedisTemplate.opsForValue().get(key);
}
}
package com.tzy; import com.tzy.service.RedisService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.ArrayList; import java.util.List; /** * Created by 70416 on 2018/4/11. */ @RestController public class IndexController { @Autowired private RedisService redisService; @RequestMapping("/setString") public String setString(String key,String value){ redisService.setString(key,value); return "success"; } @RequestMapping("/getKey") public String getKey(String key){ return (String)redisService.getStringKey(key); } @RequestMapping("/setList") public String setList(String key,List value){ List<String> listString = new ArrayList<String>(); listString.add("123"); listString.add("456"); redisService.setString(key,listString); return "success"; } }
package com.tzy; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ComponentScan; /** * Created by 70416 on 2018/4/10. */ @SpringBootApplication public class APP { public static void main(String[] args) { //主函數的啓動入口,springboot是通過應用程序運行的 SpringApplication.run(APP.class, args); } }
application.properties
# Redis數據庫索引(默認爲0) spring.redis.database=0 # Redis服務器地址 spring.redis.host=172.31.19.222 # Redis服務器連接端口 spring.redis.port=6379 # Redis服務器連接密碼(默認爲空) spring.redis.password= # 連接池最大連接數(使用負值表示沒有限制) spring.redis.pool.max-active=8 # 連接池最大阻塞等待時間(使用負值表示沒有限制) spring.redis.pool.max-wait=-1 # 連接池中的最大空閒連接 spring.redis.pool.max-idle=8 # 連接池中的最小空閒連接 spring.redis.pool.min-idle=0 # 連接超時時間(毫秒) spring.redis.timeout=0
鏈接上redis就可以了。
**項目打包發佈
控制檯 mvn package
然後java -jar 打包好的war包
需要運行入口指定