java截取JSON报文的方法

来源:互联网 发布:17173剑三捏脸数据站 编辑:程序博客网 时间:2024/06/02 06:44

需求:由于操作日志当中error message里面的错误报文信息过多,存入数据库会占用较大的空间(通常有3-5KB),长此以往,不是办法。在暂时不考虑定时任务清理的情况下,errorMsg以外的信息又足够满足记录操作日志的目的,所以截取报文当中的trace字段刻不容缓

例如

{    "homepageUrl":"null",    "id":"null",    "retCode":"-9999",    "retMessage":"Data truncation: Data too long for column 'domain_name' at row 1",    "trace":"java.lang.Exception: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'domain_name' at row 1com.xxxxxx.pxgxfrxmx.srv.OSDIInvoker.invoke(OSDIInvoker.java:56)com.xxxxxx.tools.osdi.OSDI.invoke(OSDI.java:383)com.xxxxxx.pxgxfrxmx.srv.channel.InvokeService.doTask(InvokeService.java:62)sun.reflect.GeneratedMethodAccessor281.invoke(Unknown Source)sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)java.lang.reflect.Method.invoke(Method.java:498)com.xxxxxx.tools.sermgr.ServiceManager.doTask(ServiceManager.java:90)com.xxxxxx.pxgxfrxmx.srv.channel.RequestSubChannel.doTask(RequestSubChannel.java:45)sun.reflect.GeneratedMethodAccessor43.invoke(Unknown Source)sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)java.lang.reflect.Method.invoke(Method.java:498)com.xxxxxx.tools.sermgr.ServiceManager.doTask(ServiceManager.java:90)com.xxxxxx.pxgxfrxmx.ControlFilter.process(ControlFilter.java:152)com.xxxxxx.pxgxfrxmx.ControlFilter.doFilter(ControlFilter.java:106)org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956)org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:436)org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1078)org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625)org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318)java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)java.lang.Thread.run(Thread.java:745)com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3556)com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3490)com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1959)com.mysql.jdbc.ServerPreparedStatement.serverExecute(ServerPreparedStatement.java:1333)com.mysql.jdbc.ServerPreparedStatement.executeInternal(ServerPreparedStatement.java:843)com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1356)org.apache.commons.dbcp.DelegatingPreparedStatement.execute(DelegatingPreparedStatement.java:172)org.apache.commons.dbcp.DelegatingPreparedStatement.execute(DelegatingPreparedStatement.java:172)com.xx.xxxframe2.complex.datasource.LogicPreparedStatement.execute(LogicPreparedStatement.java:342)com.xx.xxxframe2.bo.DataStoreImpl.insert(DataStoreImpl.java:430)com.xx.xxxframe2.bo.DataStoreImpl.save(DataStoreImpl.java:723)com.xx.xxxframe2.complex.tab.store.AdvanceDataStoreImpl.save(AdvanceDataStoreImpl.java:42)com.xxxxxx.acp.kdomain.bo.BOAIAcpDomain4CDEngine.save(BOAIAcpDomain4CDEngine.java:136)com.xxxxxx.acp.kdomain.bo.BOAIAcpDomain4CDEngine.save(BOAIAcpDomain4CDEngine.java:279)com.xxxxxx.acp.kdomain.dao.impl.Domain4CDDAOImpl.saveDomain(Domain4CDDAOImpl.java:131)sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)java.lang.reflect.Method.invoke(Method.java:498)com.xx.xxxframe2.complex.service.proxy.ProxyInvocationHandler.invoke(ProxyInvocationHandler.java:129)com.sun.proxy.$Proxy77.saveDomain(Unknown Source)com.xxxxxx.acp.kdomain.service.impl.Domain4CDSVImpl.saveDomain(Domain4CDSVImpl.java:54)sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)java.lang.reflect.Method.invoke(Method.java:498)com.xx.xxxframe2.complex.service.proxy.ProxyInvocationHandler.invoke(ProxyInvocationHandler.java:129)com.sun.proxy.$Proxy78.saveDomain(Unknown Source)sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)java.lang.reflect.Method.invoke(Method.java:498)com.xxxxxx.pxgxfrxmx.srv.OSDIInvoker.invoke(OSDIInvoker.java:27)com.xxxxxx.tools.osdi.OSDI.invoke(OSDI.java:383)com.xxxxxx.pxgxfrxmx.srv.channel.InvokeService.doTask(InvokeService.java:62)sun.reflect.GeneratedMethodAccessor281.invoke(Unknown Source)sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)java.lang.reflect.Method.invoke(Method.java:498)com.xxxxxx.tools.sermgr.ServiceManager.doTask(ServiceManager.java:90)com.xxxxxx.pxgxfrxmx.srv.channel.RequestSubChannel.doTask(RequestSubChannel.java:45)sun.reflect.GeneratedMethodAccessor43.invoke(Unknown Source)sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)java.lang.reflect.Method.invoke(Method.java:498)com.xxxxxx.tools.sermgr.ServiceManager.doTask(ServiceManager.java:90)com.xxxxxx.pxgxfrxmx.ControlFilter.process(ControlFilter.java:152)com.xxxxxx.pxgxfrxmx.ControlFilter.doFilter(ControlFilter.java:106)org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956)org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:436)org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1078)org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625)org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318)java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)java.lang.Thread.run(Thread.java:745)",    "userMsg":"null"}

怎么样,很长吧。。。现在我们用如下代码,来处理一下

package regexExperiment;import java.util.StringTokenizer;import lazyJoe.JoePrint;import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONArray;import com.alibaba.fastjson.JSONObject;public class regexAttFive {    public static void main(String[] args) {        JSONObject jsonObject = JSON.parseObject(getErrorMsg());        String trace = jsonObject.getString("trace");        // split trace according to "\n" while splitter itself contained        StringTokenizer tokenizer = new StringTokenizer(trace, "\n", true);        int count = 0;        StringBuilder builder = new StringBuilder();        // first 3 lines of error message was required, while adding 3 splitters making count 6        while (tokenizer.hasMoreTokens() && count < 6) {            builder.append(tokenizer.nextToken());            count++;        }        jsonObject.put("trace", builder.toString());        JoePrint.print(JSON.toJSONString(jsonObject));    }}

得到如下报文

{    "homepageUrl":"null",    "id":"null",    "retCode":"-9999",    "retMessage":"Data truncation: Data too long for column 'domain_name' at row 1",    "trace":"java.lang.Exception: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'domain_name' at row 1com.xxxxxx.pxgxfrxmx.srv.OSDIInvoker.invoke(OSDIInvoker.java:56)com.xxxxxx.tools.osdi.OSDI.invoke(OSDI.java:383)",    "userMsg":"null"}

至于为何使用StringTokenizer,我是参考了文章java中subString、split、stringTokenizer三种截取字符串方法的性能比较,毕竟勿以善小而不为,性能至上,养成好习惯。。。但是话说回来,文章内容我也没有加以认证,权当尝试

阅读全文
0 0
原创粉丝点击