首页 文章 精选 留言 我的

精选列表

搜索[匹配算法],共10005篇文章
优秀的个人博客,低调大师

在java Web项目中处理前后端日期字段自动匹配绑定

在java开发中,经常会遇到前后端交互日期格式,一般我们都会用日期格式化来处理,但时间久了,你是否感觉到繁琐而且冗余呢,本文给出一种全新的解决思路。通过正则提取出日期数字,自动将前端传的日期字符串绑定到对象的日期格式属性上去,省去一切繁琐步骤。闲话少说,文归正传。 定义BaseController public class BaseController implements ServletContextAware{ /** * 日志 **/ protected final Logger log = LoggerFactory.getLogger(BaseController.class); public HttpServletRequest request; public HttpServletResponse response; public HttpSession session; public ServletContext application; /** * 文件 **/ @Autowired(required = false) protected MultipartResolver multipartResolver; /** * @param code * @return */ public static String respJson(CodeEnum code) { return respJson(code, null); } /** * @param code * @param data * @return */ public static String respJson(CodeEnum code, Object data) { JSONObject jsono = new JSONObject(); jsono.put("code", code.getCode()); jsono.put("message", code.getMessage()); if (data != null) { jsono.put("data", data); } return jsono.toJSONString(); } /** * * @param code 错误码 * @param message 内容 * @return */ public static String respJson(String code , String message ) { return respJson(code,message,null); } /** * * @param code * @param message * @param data * @return */ public static String respJson(String code , String message , Object data){ JSONObject jsono = new JSONObject(); jsono.put("code",code); jsono.put("message",message); if (data != null) { jsono.put("data", data); } return JSON.toJSONString(jsono); } @ModelAttribute public void setReqAndRes(HttpServletRequest request, HttpServletResponse response) { this.request = request; this.response = response; this.session = request.getSession(); } public void setServletContext(ServletContext arg0) { this.application = arg0; } /** * 获取传递过来的参数 */ public String getParameter(String key) { return request.getParameter(key); } /** * 分页对象 */ public <T> Page<T> getPage(Class<T> clazz) { Page<T> page = new Page<T>(); String pageNo = getParameter("pageNo"); String pageSize = getParameter("pageSize"); pageNo = pageNo == null || "".equals(pageNo) ? "1" : pageNo; pageSize = pageSize == null || "".equals(pageSize) ? "10" : pageSize; page.setSearchCount(true); page.setSize(Integer.valueOf(pageSize)); page.setCurrent((Integer.valueOf(pageNo))); return page; } protected String redirectOuter(String url) { return "redirect:" + url; } /** * binder用于bean属性的设置 */ @InitBinder public void initBinder(WebDataBinder binder) { binder.registerCustomEditor(Date.class, new DateEditor()); binder.registerCustomEditor(String.class, new StringEscapeEditor()); } /** * 获取传递过来的str参数,并给默认值 */ public String getStrParameter(String key, String defaultValue) { String str = getParameter(key); if (org.apache.commons.lang3.StringUtils.isEmpty(str)) { return defaultValue; } return str.trim(); } } 上述代码中initBinder方法上添加了一个@InitBinder注解,该方法会在请求时被调用,改方法中有个DateEditor类,日期的处理就是在这个里处理完的。 DateEditor类 class DateEditor extends PropertyEditorSupport { @Override public void setAsText(String text) throws IllegalArgumentException { if (StringUtils.isEmpty(text)) { return; } text = text.trim(); Pattern pattern = Pattern.compile("[^0-9]"); Matcher matcher = pattern.matcher(text); text = matcher.replaceAll(""); int length = text.length(); Date date; switch(length){ case 14: date = DateTime.parse(text,DateTimeFormat.forPattern("yyyyMMddHHmmss")).toDate(); break; case 12: date = DateTime.parse(text,DateTimeFormat.forPattern("yyyyMMddHHmm")).toDate(); break; case 10: date = DateTime.parse(text,DateTimeFormat.forPattern("yyyyMMddHH")).toDate(); break; case 8: date = DateTime.parse(text,DateTimeFormat.forPattern("yyyyMMdd")).toDate(); break; case 6: date = DateTime.parse(text,DateTimeFormat.forPattern("yyyyMM")).toDate(); break; case 4: date = DateTime.parse(text,DateTimeFormat.forPattern("yyyy")).toDate(); break; default: return; } setValue(date); } } 如何使用 上面准备完成后,在需要用到的controller中继承BaseController即可! 一般网上的例子仅支持如下格式的日期: yyyyMMdd HH:mm:ss yyyyMMdd HH:mm yyyyMMdd HH yyyyMMdd yyyyMM yyyy 本文的方法,支持包含14、12、10、8、6、4个数字的所有字符串。

优秀的个人博客,低调大师

Filebeat 关键字多行匹配日志采集(multiline与include_lines)

很多同事认为filebeat采集日志不能做到多行处理,今天这里讨论下filebeat的multiline与include_lines。 先来个案例,以下日志,我们只要求采集error的字段, 1 2 3 2017 /06/22 11:26:30[error]26067 #0:*17918connect()failed(111:Connectionrefused)whileconnectingtoupstream,client:192.168.32.17,server:localhost,request:"GET/wss/HTTP/1.1",upstream:"http://192.168.12.106:8010/",host:"192.168.12.106" 2017 /06/22 11:26:30[info]26067 #0: 2017 /06/22 12:05:10[error]26067 #0:*17922open()"/data/programs/nginx/html/ws"failed(2:Nosuchfileordirectory),client:192.168.32.17,server:localhost,request:"GET/wsHTTP/1.1",host:"192.168.12.106" filebeat.yml文件配置如下: 1 2 3 4 5 6 7 8 9 filebeat.prospectors: -input_type:log paths: - /tmp/test .log include_lines:[ 'error' ] output.kafka: enabled: true hosts:[ "192.168.12.105:9092" ] topic:logstash-errors-log 查看下kafka队列 果然只有“error”关键字的日志被采集了 1 2 { "@timestamp" : "2017-06-23T08:57:25.227Z" , "beat" :{ "name" : "192.168.12.106" }, "input_type" : "log" , "message" : "2017/06/2212:05:10[error]26067#0:*17922open()/data/programs/nginx/html/wsfailed(2:Nosuchfileordirectory),client:192.168.32.17,server:localhost,request:GET/wsHTTP/1.1,host:192.168.12.106" , "offset" :30926, "source" : "/tmp/test.log" , "type" : "log" } { "@timestamp" : "2017-06-23T08:57:32.228Z" , "beat" :{ "name" : "192.168.12.106" }, "input_type" : "log" , "message" : "2017/06/2212:05:10[error]26067#0:*17922open()/data/programs/nginx/html/wsfailed(2:Nosuchfileordirectory),client:192.168.32.17,server:localhost,request:GET/wsHTTP/1.1,host:192.168.12.106" , "offset" :31342, "source" : "/tmp/test.log" , "type" : "log" } 再来多行案例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 [2016-05-2512:39:04,744][DEBUG][action.bulk][Set][***][3]failedtoexecutebulkitem(index)index{[***][***][***], source [{***}} MapperParsingException[Fieldname[events.created]cannotcontain '.' ] atorg.elasticsearch.index.mapper.object.ObjectMapper$TypeParser.parseProperties(ObjectMapper.java:273) atorg.elasticsearch.index.mapper.object.ObjectMapper$TypeParser.parseObjectOrDocumentTypeProperties(ObjectMapper.java:218) atorg.elasticsearch.index.mapper.object.ObjectMapper$TypeParser.parse(ObjectMapper.java:193) atorg.elasticsearch.index.mapper.object.ObjectMapper$TypeParser.parseProperties(ObjectMapper.java:305) atorg.elasticsearch.index.mapper.object.ObjectMapper$TypeParser.parseObjectOrDocumentTypeProperties(ObjectMapper.java:218) atorg.elasticsearch.index.mapper.object.RootObjectMapper$TypeParser.parse(RootObjectMapper.java:139) atorg.elasticsearch.index.mapper.DocumentMapperParser.parse(DocumentMapperParser.java:118) atorg.elasticsearch.index.mapper.DocumentMapperParser.parse(DocumentMapperParser.java:99) atorg.elasticsearch.index.mapper.MapperService.parse(MapperService.java:498) atorg.elasticsearch.cluster.metadata.MetaDataMappingService$PutMappingExecutor.applyRequest(MetaDataMappingService.java:257) atorg.elasticsearch.cluster.metadata.MetaDataMappingService$PutMappingExecutor.execute(MetaDataMappingService.java:230) atorg.elasticsearch.cluster.service.InternalClusterService.runTasksForExecutor(InternalClusterService.java:468) atorg.elasticsearch.cluster.service.InternalClusterService$UpdateTask.run(InternalClusterService.java:772) atorg.elasticsearch.common.util.concurrent.PrioritizedEsThreadPoolExecutor$TieBreakingPrioritizedRunnable.runAndClean(PrioritizedEsThreadPoolExecutor.java:231) atorg.elasticsearch.common.util.concurrent.PrioritizedEsThreadPoolExecutor$TieBreakingPrioritizedRunnable.run(PrioritizedEsThreadPoolExecutor.java:194) atjava.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) atjava.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) atjava.lang.Thread.run(Thread.java:745) filebeat.yml文件配置如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 filebeat.prospectors: -input_type:log paths: - /tmp/test .log multiline: pattern: '^\[' negate: true match:after fields: beat.name:192.168.12.106 fields_under_root: true output.kafka: enabled: true hosts:[ "192.168.12.105:9092" ] topic:logstash-errors-log 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 kafka队列如下: { "@timestamp" : "2017-06-23T09:09:02.887Z" , "beat" :{ "name" : "192.168.12.106" }, "input_type" : "log" , "message" :"[2016-05-2512:39:04,744][DEBUG][action.bulk][Set][***][3]failedtoexecutebulkitem(index)index{[***][***][***], source [{***}}\n MapperParsingException[Fieldname[events.created]cannotcontain '.' ]\natorg.elasticsearch.index.mapper.object.ObjectMapper$TypeParser.parseProperties(ObjectMapper.java:273)\n atorg.elasticsearch.index.mapper.object.ObjectMapper$TypeParser.parseObjectOrDocumentTypeProperties(ObjectMapper.java:218)\n atorg.elasticsearch.index.mapper.object.ObjectMapper$TypeParser.parse(ObjectMapper.java:193)\n atorg.elasticsearch.index.mapper.object.ObjectMapper$TypeParser.parseProperties(ObjectMapper.java:305)\n atorg.elasticsearch.index.mapper.object.ObjectMapper$TypeParser.parseObjectOrDocumentTypeProperties(ObjectMapper.java:218)\n atorg.elasticsearch.index.mapper.object.RootObjectMapper$TypeParser.parse(RootObjectMapper.java:139)\n atorg.elasticsearch.index.mapper.DocumentMapperParser.parse(DocumentMapperParser.java:118)\n atorg.elasticsearch.index.mapper.DocumentMapperParser.parse(DocumentMapperParser.java:99)\n atorg.elasticsearch.index.mapper.MapperService.parse(MapperService.java:498)\n atorg.elasticsearch.cluster.metadata.MetaDataMappingService$PutMappingExecutor.applyRequest(MetaDataMappingService.java:257)\n atorg.elasticsearch.cluster.metadata.MetaDataMappingService$PutMappingExecutor.execute(MetaDataMappingService.java:230)\n atorg.elasticsearch.cluster.service.InternalClusterService.runTasksForExecutor(InternalClusterService.java:468)\n atorg.elasticsearch.cluster.service.InternalClusterService$UpdateTask.run(InternalClusterService.java:772)\n atorg.elasticsearch.common.util.concurrent.PrioritizedEsThreadPoolExecutor$TieBreakingPrioritizedRunnable.runAndClean(PrioritizedEsThreadPoolExecutor.java:231)\n atorg.elasticsearch.common.util.concurrent.PrioritizedEsThreadPoolExecutor$TieBreakingPrioritizedRunnable.run(PrioritizedEsThreadPoolExecutor.java:194)\n atjava.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)\n atjava.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)\n atjava.lang.Thread.run(Thread.java:745)\n\n\n\n "," offset ":35737," source ":" /tmp/test .log "," type ":" log"} 可以看出multiline将多行日志汇总。 multiline与include_lines,结合使用。 filebeat.yml文件配置如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 filebeat.prospectors: -input_type:log paths: - /tmp/test .log include_lines:[ 'error' ] multiline: pattern: '^\[' negate: true match:after output.kafka: enabled: true hosts:[ "192.168.12.105:9092" ] topic:logstash-errors-log 即日志中如果有"error"关键字的日志,进行多行合并,发送至kafka. 经验证,在日志不断输入的情况,会把不含"error"的行也进行合并,日志有间隔的情况输入,过滤效果比较好,具体结合业务情况实用吧。 总之一句话,filebeat可以多行合并和进行关键字日志采集。 本文转自 jackjiaxiong 51CTO博客,原文链接:http://blog.51cto.com/xiangcun168/1941401

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册