springBoot日誌,配置,讀取資料,redis,打包等
#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包
需要執行入口指定
相關推薦
spark從mysql讀取資料(redis/mongdb/hbase等類似,換成各自RDD即可)
package com.ws.jdbc import java.sql.DriverManager import org.apache.spark.rdd.JdbcRDD import org.apache.spark.{SparkConf, SparkCont
Java呼叫R ,從資料庫讀取資料,用R根據讀取的資料生成圖片儲存
Java呼叫R 以及用R生成的圖片儲存 使用 png()可以保證圖片質量 有人說繪製的圖片上有中文會出現亂碼,其實設定下字型就好了 family=‘STXihei’ Java呼叫R 以及用R生成的圖片儲存 Rserve的配置和啟動: ①安裝Rserve包。
MapReduce中,從HDFS讀取資料計算後寫入HBase
基於上個例子。做一下簡單的改造。在原本的例子中,從HDFS中讀取資料計算之後再寫會HDFS裡,現在講Reducer類改造一下,把計算後的資料。寫入到HBase當中,寫完之後我們會使用HBase的命令查詢一下寫入資料。開啟原有的Reducer類,程式碼如下:import org
c語言實現系統(Linux)檔案許可權的修改,以及系統檔案的建立,寫入和讀取資料
我們都清楚,在Linux要想修改某個檔案的許可權,可以執行chmod命令,(4.為讀許可權,2.為寫許可權,1.為執行許可權)其實我們可以通過編寫C程式來實現這一命令,具體 chmod實現程式如下: #include<stdio.h> #in
HBase建表高階屬性,hbase應用案例看行鍵設計,HBase和mapreduce結合,從Hbase中讀取資料、分析,寫入hdfs,從hdfs中讀取資料寫入Hbase,協處理器和二級索引
1. Hbase高階應用 1.1建表高階屬性 下面幾個shell 命令在hbase操作中可以起到很到的作用,且主要體現在建表的過程中,看下面幾個create 屬性 1、 BLOOMFILTER 預設是NONE 是否使用布隆過慮及使用何種方式 布隆
Tensorflow中使用tfrecord,佇列方式讀取資料
標準TensorFlow格式 有一種儲存記錄的方法可以允許你講任意的資料轉換為TensorFlow所支援的格式, 這種方法可以使TensorFlow的資料集更容易與網路應用架構相匹配。這種建議的方法就是使用TFRecords檔案,TFRecords檔案包含了tf.
手擼了一個HTTP框架:支援Sprng MVC、IOC、AOP,攔截器,配置檔案讀取...
> [https://github.com/Snailclimb/jsoncat](https://github.com/Snailclimb/jsoncat) :仿 Spring Boot 但不同於 Spring Boot 的一個輕量級的 HTTP 框架 距離上一次給小夥伴們彙報簡易版的“Spr
QT初體驗1:如何學習QT之個人淺見,以及如何讀取文本文件,在調試信息中輸出。
沒有 c++教程 最簡 將不 ror 聽說 講解 知識點 括號 2017年11月初,隨著工作崗位的調動,我轉到了研發崗,開始了漫漫程序員的成長之路。首先介紹下個人知識儲備,大一學習過C語言,沒有工程經驗,所學是為了期末考試+2級考試,考完在大學+碩士期間沒有用到編程。 來到
大資料之Spark(二)--- RDD,RDD變換,RDD的Action,解決spark的資料傾斜問題,spark整合hadoop的HA
一、Spark叢集執行 ------------------------------------------------------- 1.local //本地模式 2.standalone //獨立模式 3.yarn //yarn模式
ECS通過iptables ,配置SNAT代理閘道器,實現區域網上網
場景說明: 本文將介紹如何通過為VPC中Linux系統的ECS例項配置SNAT,實現無公網ECS通過有EIP的伺服器代理訪問公網。 步驟: 1、使用SSH的方法登陸一個已經繫結EIP外網的ECS例項。 2、執行以下命令,開啟IP核心轉發功能。 sed -i 's/net.ipv4.ip_f
Excel2007設定過單元格格式後,並不能立即生效必須挨個雙擊單元格,才能生效。資料行很多,效率太低。
原因:Excel2007設定過單元格格式後,並不能立即生效必須挨個雙擊單元格,才能生效。資料行很多。效率太低。 原因:主要是一些從網上拷貝過來的日期或數字excel預設為文字格式或特殊-中文數字格式大小寫。 手動設定單元格,將格式改成日期格式,但仍不能參與計算。只有挨個單元格雙擊,才能生效;才可以計
第四章App4_3,懂得了丟擲異常 throws Exception,read為讀取鍵盤輸入數,學會了switch迴圈
package 第四章; import java.io.EOFException; //filename:App4_3.javapublic class App4_3 //定義一個公共類App4_3{ public static void main(String[] args) throws Except
vmware橋接模式下,配置centos的ip地址閘道器等,搭建區域網伺服器
1.安裝vmware軟體,以及centos 2.設定網路介面卡模式為:“橋接模式” 3.進入虛擬網路編輯器,配置橋接模式的相關配置, 、 4.進入虛擬機器所在的電腦主機的dos命令列頁面,輸入ipconfig/all命令 獲取主機的網路詳情資訊,虛擬機器配置需要依據主
【木木與呆呆的專欄】Java程式設計師,專注Java程式設計技術,開發以後臺為主前臺為輔,目前投身Hadoop大資料以及Ranger安全開發,活躍在大資料開源社群,同時推薦多種高效便捷的開發工具,分享自己的各種經驗技巧總結。
Java程式設計師,專注Java程式設計技術,開發以後臺為主前臺為輔,目前投身Hadoop大資料以及Ranger安全開發,活躍在大資料開源社群,同時推薦多種高效便捷的開發工具,分享自己的各種經驗技巧總結。...
問題:在程式中儲存資料到索引庫,發生異常jackson資料轉換異常,造成死迴圈棧溢位 解決@JsonIgnore註解
org.springframework.data.elasticsearch.ElasticsearchException: failed to index the document [id: 69] at org.springframework.data.elas
laravel傳輸資料介面時,好用的資料傳輸方法,收藏一波!
1.養成程式碼儲存到log檔案中的習慣,方便核實資料的正確性,使得使用更方便; public function saveLogToFile($d) { $data =
JAVA對資料庫進行操作,實現資料庫中資料的插入,查詢,更改,刪除操作
轉載自:http://www.cnblogs.com/sodawoods-blogs/p/4415858.html (—)通過mysql workbench 建立一個數據庫,在這裡命名為company,然後建一個tb_employee表 (二)以下是java程式碼對錶
C#,WPF中使用多文字顯示資料,並對其資料進行關鍵字高亮等操作
需求:針對多文字資訊顯示,我們需要對其內容中的某些關鍵字或者某行進行高亮顯示,並用不同顏色顯示。 分析:在C#中,首先要進行多文字資訊顯示,可以RichTextBox(不要使用TextBox)控制元件,該控制元件由自動換行等功能,具體程式碼如下: /// <summary> /// 向
[原]敏捷開發專案中升級mysql資料庫,談談結構、資料比對,navicat for mysql + dbForge Data Compare for MySQL 足矣!
在公司專案中,我有幸負責製作“升級指令碼”。升級指令碼,無疑兩步,先結構比對,再初始資料比對。 一、結構比對 結構比對比較簡單,使用navicat for mysql 工具,“工具”-“結構同步”,選擇好“源”、“目標
有10個學生,每個學生的資料包括學號,姓名,3門課的成績。對其進行處理
// 121213 第七章個習題5.cpp : 定義控制檯應用程式的入口點。 // /* * Copyright (c) 2012, 煙臺大學計算機學院 * All rights reserved. * 作 者: 劉