From ecd54f5b8bb42299f310ecb560e5b7d1b4825fd3 Mon Sep 17 00:00:00 2001 From: Yegor Bugayenko Date: Sun, 20 Nov 2016 02:45:45 +0200 Subject: [PATCH] #22 metrics --- pom.xml | 11 +- src/main/java/io/jare/Entrance.java | 15 +- src/main/java/io/jare/Logs.java | 202 ++++++++++++++++++++++++ src/main/java/io/jare/fake/FkUsage.java | 3 +- src/test/java/io/jare/LogsTest.java | 70 ++++++++ src/test/java/io/jare/package-info.java | 31 ++++ src/test/resources/io/jare/test | 20 +++ web.iml | 5 +- 8 files changed, 349 insertions(+), 8 deletions(-) create mode 100644 src/main/java/io/jare/Logs.java create mode 100644 src/test/java/io/jare/LogsTest.java create mode 100644 src/test/java/io/jare/package-info.java create mode 100644 src/test/resources/io/jare/test diff --git a/pom.xml b/pom.xml index 803d1ca..ce2884e 100644 --- a/pom.xml +++ b/pom.xml @@ -141,10 +141,18 @@ org.apache.commons commons-lang3 + + commons-io + commons-io + com.jcabi jcabi-xml + + com.jcabi + jcabi-s3 + com.jcabi jcabi-aspects @@ -162,8 +170,7 @@ com.jcabi jcabi-dynamo - 1.0-SNAPSHOT - + 0.21.4 com.jcabi diff --git a/src/main/java/io/jare/Entrance.java b/src/main/java/io/jare/Entrance.java index 5cb91a2..8066969 100644 --- a/src/main/java/io/jare/Entrance.java +++ b/src/main/java/io/jare/Entrance.java @@ -22,8 +22,11 @@ */ package io.jare; +import com.jcabi.manifests.Manifests; +import com.jcabi.s3.Region; import io.jare.cached.CdBase; import io.jare.dynamo.DyBase; +import io.jare.model.Base; import io.jare.tk.TkApp; import java.io.IOException; import org.takes.http.Exit; @@ -51,9 +54,15 @@ private Entrance() { * @throws IOException If fails */ public static void main(final String... args) throws IOException { - new FtCli( - new TkApp(new CdBase(new DyBase())), args - ).start(Exit.NEVER); + final Base base = new CdBase(new DyBase()); + new Logs( + base, + new Region.Simple( + Manifests.read("Jare-S3Key"), + Manifests.read("Jare-S3Secret") + ).bucket("logs.jare.io") + ); + new FtCli(new TkApp(base), args).start(Exit.NEVER); } } diff --git a/src/main/java/io/jare/Logs.java b/src/main/java/io/jare/Logs.java new file mode 100644 index 0000000..326fd35 --- /dev/null +++ b/src/main/java/io/jare/Logs.java @@ -0,0 +1,202 @@ +/** + * The MIT License (MIT) + * + * Copyright (c) 2016 jare.io + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: the above copyright notice and this + * permission notice shall be included in all copies or substantial + * portions of the Software. The software is provided "as is", without + * warranty of any kind, express or implied, including but not limited to + * the warranties of merchantability, fitness for a particular purpose + * and non-infringement. In no event shall the authors or copyright + * holders be liable for any claim, damages or other liability, whether + * in an action of contract, tort or otherwise, arising from, out of or + * in connection with the software or the use or other dealings in the + * software. + */ +package io.jare; + +import com.jcabi.aspects.ScheduleWithFixedDelay; +import com.jcabi.aspects.Tv; +import com.jcabi.s3.Bucket; +import com.jcabi.s3.Ocket; +import io.jare.model.Base; +import io.jare.model.Domain; +import java.io.BufferedReader; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.URI; +import java.nio.file.Files; +import java.nio.file.Path; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Locale; +import java.util.Map; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.zip.GZIPInputStream; +import org.apache.commons.lang3.StringUtils; + +/** + * Logs in S3. + * + * @author Yegor Bugayenko (yegor@teamed.io) + * @version $Id$ + * @since 0.7 + */ +@ScheduleWithFixedDelay(delay = 1, unit = TimeUnit.HOURS) +final class Logs implements Runnable { + + /** + * Parser of one line. + */ + private static final Pattern PTN = Pattern.compile( + StringUtils.join( + "(\\d{4}-\\d{2}-\\d{2})\t", + "\\d{2}:\\d{2}:\\d{2}\t", + "[A-Z0-9]+\t", + "(\\d+)\t", + "\\d+\\.\\d+\\.\\d+\\.\\d+\t", + "GET\t", + "[a-z0-9]+.cloudfront.net\t", + "/\t", + "\\d{3}\t", + "(https?://[^\t]+)\t" + ) + ); + + /** + * Base. + */ + private final transient Base base; + + /** + * Bucket. + */ + private final transient Bucket bucket; + + /** + * Ctor. + * @param bse Base + * @param bkt Bucket + */ + Logs(final Base bse, final Bucket bkt) { + this.base = bse; + this.bucket = bkt; + } + + @Override + public void run() { + try { + final Iterator ockets = this.bucket.list("").iterator(); + if (ockets.hasNext()) { + final String name = ockets.next(); + this.process(name); + this.bucket.remove(name); + } + } catch (final IOException ex) { + throw new IllegalStateException(ex); + } + } + + /** + * Process one ocket. + * @param name The name of the ocket + * @throws IOException If fails + */ + private void process(final String name) throws IOException { + final Ocket ocket = this.bucket.ocket(name); + final Path path = Files.createTempFile("jare", ".gz"); + ocket.read(new FileOutputStream(path.toFile())); + final BufferedReader input = new BufferedReader( + new InputStreamReader( + new GZIPInputStream( + new FileInputStream(path.toFile()) + ) + ) + ); + final Map> map = new HashMap<>(0); + try { + while (true) { + final String line = input.readLine(); + if (line == null) { + break; + } + Logs.parse(map, line); + } + } finally { + input.close(); + } + for (final Map.Entry> entry : map.entrySet()) { + for (final Map.Entry usg + : entry.getValue().entrySet()) { + final Iterator domains = + this.base.domain(entry.getKey()); + if (domains.hasNext()) { + domains.next().usage().add( + usg.getKey(), + usg.getValue() + ); + } + } + } + } + + /** + * Parse one line. + * @param map Map to populate + * @param line The line + */ + private static void parse(final Map> map, + final CharSequence line) { + final Matcher matcher = Logs.PTN.matcher(line); + if (matcher.find()) { + final String domain = URI.create(matcher.group(Tv.THREE)).getHost(); + if (!map.containsKey(domain)) { + map.put(domain, new HashMap<>(0)); + } + final Map target = map.get(domain); + final Date date = Logs.asDate(matcher.group(1)); + if (!target.containsKey(date)) { + target.put(date, 0L); + } + target.put( + date, + target.get(date) + Long.parseLong(matcher.group(2)) + ); + } + } + + /** + * Convert text to date. + * @param txt Text + * @return A date + */ + private static Date asDate(final String txt) { + final TimeZone zone = TimeZone.getTimeZone("UTC"); + final DateFormat fmt = new SimpleDateFormat( + "yyyy-MM-dd", Locale.ENGLISH + ); + fmt.setTimeZone(zone); + try { + return fmt.parse(txt); + } catch (final ParseException ex) { + throw new IllegalStateException(ex); + } + } + +} diff --git a/src/main/java/io/jare/fake/FkUsage.java b/src/main/java/io/jare/fake/FkUsage.java index cb5d6dd..dde534d 100644 --- a/src/main/java/io/jare/fake/FkUsage.java +++ b/src/main/java/io/jare/fake/FkUsage.java @@ -22,6 +22,7 @@ */ package io.jare.fake; +import com.jcabi.log.Logger; import io.jare.model.Usage; import java.util.Date; import java.util.SortedMap; @@ -38,7 +39,7 @@ public final class FkUsage implements Usage { @Override public void add(final Date date, final long bytes) { - // nothing + Logger.info(this, "usage, date=%s, bytes=%d", date, bytes); } @Override diff --git a/src/test/java/io/jare/LogsTest.java b/src/test/java/io/jare/LogsTest.java new file mode 100644 index 0000000..98d9de4 --- /dev/null +++ b/src/test/java/io/jare/LogsTest.java @@ -0,0 +1,70 @@ +/** + * The MIT License (MIT) + * + * Copyright (c) 2016 jare.io + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: the above copyright notice and this + * permission notice shall be included in all copies or substantial + * portions of the Software. The software is provided "as is", without + * warranty of any kind, express or implied, including but not limited to + * the warranties of merchantability, fitness for a particular purpose + * and non-infringement. In no event shall the authors or copyright + * holders be liable for any claim, damages or other liability, whether + * in an action of contract, tort or otherwise, arising from, out of or + * in connection with the software or the use or other dealings in the + * software. + */ +package io.jare; + +import com.jcabi.s3.Bucket; +import com.jcabi.s3.Ocket; +import io.jare.fake.FkBase; +import java.io.OutputStream; +import java.util.Collections; +import java.util.zip.GZIPOutputStream; +import org.apache.commons.io.IOUtils; +import org.junit.Test; +import org.mockito.Mockito; + +/** + * Test case for {@link Logs}. + * @author Yegor Bugayenko (yegor@teamed.io) + * @version $Id$ + * @since 1.0 + * @checkstyle ClassDataAbstractionCouplingCheck (500 lines) + */ +public final class LogsTest { + + /** + * Logs can unzip and log. + * @throws Exception If some problem inside + */ + @Test + public void unzipsAndLogs() throws Exception { + final Ocket ocket = Mockito.mock(Ocket.class); + Mockito.doAnswer( + inv -> { + final GZIPOutputStream gzip = new GZIPOutputStream( + OutputStream.class.cast(inv.getArgument(0)) + ); + IOUtils.copyLarge( + Logs.class.getResourceAsStream("test"), + gzip + ); + gzip.close(); + return null; + } + ).when(ocket).read(Mockito.any(OutputStream.class)); + final Bucket bucket = Mockito.mock(Bucket.class); + Mockito.doReturn(ocket).when(bucket).ocket(Mockito.anyString()); + Mockito.doReturn(Collections.singleton("x")).when(bucket).list(""); + new Logs(new FkBase(), bucket).run(); + } + +} diff --git a/src/test/java/io/jare/package-info.java b/src/test/java/io/jare/package-info.java new file mode 100644 index 0000000..70a6ef1 --- /dev/null +++ b/src/test/java/io/jare/package-info.java @@ -0,0 +1,31 @@ +/** + * The MIT License (MIT) + * + * Copyright (c) 2016 jare.io + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: the above copyright notice and this + * permission notice shall be included in all copies or substantial + * portions of the Software. The software is provided "as is", without + * warranty of any kind, express or implied, including but not limited to + * the warranties of merchantability, fitness for a particular purpose + * and non-infringement. In no event shall the authors or copyright + * holders be liable for any claim, damages or other liability, whether + * in an action of contract, tort or otherwise, arising from, out of or + * in connection with the software or the use or other dealings in the + * software. + */ + +/** + * Jare, tests. + * + * @author Yegor Bugayenko (yegor@teamed.io) + * @version $Id$ + * @since 0.7 + */ +package io.jare; diff --git a/src/test/resources/io/jare/test b/src/test/resources/io/jare/test new file mode 100644 index 0000000..7a9ab0e --- /dev/null +++ b/src/test/resources/io/jare/test @@ -0,0 +1,20 @@ +#Version: 1.0 +#Fields: date time x-edge-location sc-bytes c-ip cs-method cs(Host) cs-uri-stem sc-status cs(Referer) cs(User-Agent) cs-uri-query cs(Cookie) x-edge-result-type x-edge-request-id x-host-header cs-protocol cs-bytes time-taken x-forwarded-for ssl-protocol ssl-cipher x-edge-response-result-type cs-protocol-version +2016-11-19 10:38:41 TPE50 282004 101.138.97.108 GET djk1be5eatcae.cloudfront.net / 200 http://fun01.cc/post/289419 Mozilla/5.0%2520(Linux;%2520Android%25206.0.1;%2520HTC_A9u%2520Build/MMB29M;%2520wv)%2520AppleWebKit/537.36%2520(KHTML,%2520like%2520Gecko)%2520Version/4.0%2520Chrome/49.0.2623.105%2520Mobile%2520Safari/537.36%2520%5BFB_IAB/FB4A;FBAV/103.0.0.20.72;%5D u=http://fun01.cc/ups/24212/post/600x314/580dba45d0528424.png - RefreshHit GaWfXCYbXPmOSeLrZUy1Cz0Ng_4JWQVoCGRbEakjDitnwEsYT6q8mw== cf.jare.io http 506 0.467 - - - RefreshHit HTTP/1.1 +2016-11-19 10:38:47 TPE50 23614 203.203.60.44 GET djk1be5eatcae.cloudfront.net / 200 http://fun01.cc/post/297026 Mozilla/5.0%2520(Linux;%2520U;%2520Android%25204.1.2;%2520zh-tw;%2520GT-I9300%2520Build/JZO54K)%2520AppleWebKit/534.30%2520(KHTML,%2520like%2520Gecko)%2520Version/4.0%2520Mobile%2520Safari/534.30%2520%5BFB_IAB/FB4A;FBAV/91.0.0.17.68;%5D u=http://fun01.cc/ups/27933/post/600x314/582c68f30b8e1594.jpg - Hit Iw8x859mSjICS3lp9a_y3h3C-u0oJHqCZn-NLIctha5Sxd3jf3DKfQ== cf.jare.io http 473 0.006 - - - Hit HTTP/1.1 +2016-11-19 10:38:51 TPE50 54463 101.138.119.202 GET djk1be5eatcae.cloudfront.net / 200 http://fun01.cc/post/297509 Mozilla/5.0%2520(Linux;%2520Android%25204.4.2;%2520ASUS_T00P%2520Build/KOT49H)%2520AppleWebKit/537.36%2520(KHTML,%2520like%2520Gecko)%2520Version/4.0%2520Chrome/30.0.0.0%2520Mobile%2520Safari/537.36%2520%5BFB_IAB/FB4A;FBAV/103.0.0.20.72;%5D u=http://fun01.cc/ups/29023/post/600x314/582eb63d02b95834.jpg - Hit Man-IEBIlSJe4hyE7OTmcK5Y_fDOQJp9jCDknPUEkhz8P3whgqbS8w== cf.jare.io http 555 0.004 - - - Hit HTTP/1.1 +2016-11-19 10:38:56 TPE50 831 101.138.97.108 GET djk1be5eatcae.cloudfront.net / 304 http://fun01.cc/post/289419?agree=1 Mozilla/5.0%2520(Linux;%2520Android%25206.0.1;%2520HTC_A9u%2520Build/MMB29M;%2520wv)%2520AppleWebKit/537.36%2520(KHTML,%2520like%2520Gecko)%2520Version/4.0%2520Chrome/49.0.2623.105%2520Mobile%2520Safari/537.36%2520%5BFB_IAB/FB4A;FBAV/103.0.0.20.72;%5D u=http://fun01.cc/ups/24212/post/600x314/580dba45d0528424.png - Hit 0BLwOCjzLUaGgcESDdCKLBhHFOq3XpnIwRw-pfjJHfGaEBlAZIPmuQ== cf.jare.io http 602 0.003 - - - Hit HTTP/1.1 +2016-11-19 10:38:49 SIN2 187981 101.127.227.192 GET djk1be5eatcae.cloudfront.net / 200 http://fun01.cc/post/297541 Mozilla/5.0%2520(Linux;%2520Android%25206.0.1;%2520SM-G930F%2520Build/MMB29K;%2520wv)%2520AppleWebKit/537.36%2520(KHTML,%2520like%2520Gecko)%2520Version/4.0%2520Chrome/54.0.2840.85%2520Mobile%2520Safari/537.36%2520%5BFB_IAB/FB4A;FBAV/103.0.0.20.72;%5D u=http://fun01.cc/ups/2131/post/600x314/582ee7d79bf6f247.jpg - Hit 5HaDB0isE9STYcDdcyhESlv5v-m-EAmVaP5a28qiTs57Gukg0hNs-A== cf.jare.io http 505 0.002 - - - Hit HTTP/1.1 +2016-11-19 10:38:30 SIN3 202919 14.100.136.4 GET djk1be5eatcae.cloudfront.net / 200 http://fun01.cc/post/297681?fb=471741276327026 Mozilla/5.0%2520(Linux;%2520Android%25206.0.1;%2520SM-G930F%2520Build/MMB29K;%2520wv)%2520AppleWebKit/537.36%2520(KHTML,%2520like%2520Gecko)%2520Version/4.0%2520Chrome/49.0.2623.105%2520Mobile%2520Safari/537.36%2520%5BFB_IAB/FB4A;FBAV/103.0.0.20.72;%5D u=http://fun01.cc/ups/2131/post/600x314/58300daef1b7c554.jpg - Hit 53L6fWZ9waAgXjdbUsGppYNk0Nkg4HgRB2aEeoAMw8Zbpw0nTRpKQA== cf.jare.io http 525 0.007 - - - Hit HTTP/1.1 +2016-11-19 10:38:49 SIN3 187981 219.92.206.238 GET djk1be5eatcae.cloudfront.net / 200 http://fun01.cc/post/297541?fb=471741276327026 Mozilla/5.0%2520(Linux;%2520Android%25205.0.2;%2520vivo%2520Y51%2520Build/LRX22G)%2520AppleWebKit/537.36%2520(KHTML,%2520like%2520Gecko)%2520Chrome/54.0.2840.85%2520Mobile%2520Safari/537.36 u=http://fun01.cc/ups/2131/post/600x314/582ee7d79bf6f247.jpg - Hit 3xk6LCigO_IFnidx_e6ufcMimyZ-NBLJRG29jwAp8GOVIwNrIxqh7w== cf.jare.io http 450 0.002 - - - Hit HTTP/1.1 +2016-11-19 10:38:41 SYD1 18809 49.197.205.235 GET djk1be5eatcae.cloudfront.net / 200 http://fun01.cc/post/243413?t=30569 Mozilla/5.0%2520(iPhone;%2520CPU%2520iPhone%2520OS%252010_1_1%2520like%2520Mac%2520OS%2520X)%2520AppleWebKit/602.2.14%2520(KHTML,%2520like%2520Gecko)%2520Mobile/14B100%2520%5BFBAN/FBIOS;FBAV/72.0.0.40.71;FBBV/43917395;FBRV/0;FBDV/iPhone8,2;FBMD/iPhone;FBSN/iOS;FBSV/10.1.1;FBSS/3;FBCR/OPTUS;FBID/phone;FBLC/zh_TW;FBOP/5%5D u=http://fun01.cc/ups/27795/post/600x314/290969926971729.jpg - Hit iNRA1cxVCSdsBSp3l7cltYbWZZQy66YbB0NHza24__M-6teCFN22WA== cf.jare.io http 508 0.002 - - - Hit HTTP/1.1 +2016-11-19 10:38:33 SIN2 53273 115.133.19.8 GET djk1be5eatcae.cloudfront.net / 200 http://fun01.cc/post/297392?ref=authormore Mozilla/5.0%2520(Linux;%2520Android%25205.0.2;%2520Mi%25204i%2520Build/LRX22G)%2520AppleWebKit/537.36%2520(KHTML,%2520like%2520Gecko)%2520Chrome/54.0.2840.85%2520Mobile%2520Safari/537.36 u=http://fun01.cc/ups/28068/post/600x314/582dbb689682b450.jpg - Hit 786cMISa0X6OJ-q9AMd8vygyOegYpOa_gxsn7oSGOJ5kySvB5_QU1A== cf.jare.io http 441 0.003 - - - Hit HTTP/1.1 +2016-11-19 10:38:43 TPE50 23614 1.174.121.63 GET djk1be5eatcae.cloudfront.net / 200 http://fun01.cc/post/297026 Mozilla/5.0%2520(Linux;%2520U;%2520Android%25204.3;%2520zh-tw;%2520GT-I9500%2520Build/JSS15J)%2520AppleWebKit/534.30%2520(KHTML,%2520like%2520Gecko)%2520Version/4.0%2520Mobile%2520Safari/534.30%2520%5BFB_IAB/FB4A;FBAV/103.0.0.20.72;%5D u=http://fun01.cc/ups/27933/post/600x314/582c68f30b8e1594.jpg - Hit VsFHc54MywUzx0H6tN-h2E2AeTmwLPbQjYgUHB8LmmmzO-c4pNwpDw== cf.jare.io http 472 0.006 - - - Hit HTTP/1.1 +2016-11-19 10:38:55 TPE50 913 124.9.192.74 GET djk1be5eatcae.cloudfront.net / 304 http://fun01.cc/post/292990 Mozilla/5.0%2520(Linux;%2520Android%25205.1.1;%2520SAMSUNG%2520SM-G531Y%2520Build/LMY48B)%2520AppleWebKit/537.36%2520(KHTML,%2520like%2520Gecko)%2520SamsungBrowser/3.3%2520Chrome/38.0.2125.102%2520Mobile%2520Safari/537.36 u=http://fun01.cc/ups/11413/post/600x314/581c153664281554.jpg - Miss b0D_JlqRUx6dxN-_7j3hlXDWLUIymMO1jaqG9OM-_xZKPB-xk2GKdg== cf.jare.io http 573 0.450 - - - Miss HTTP/1.1 +2016-11-19 10:39:00 TPE50 42244 118.170.224.188 GET djk1be5eatcae.cloudfront.net / 200 http://fun01.cc/post/297641 Mozilla/5.0%2520(Linux;%2520Android%25205.0.1;%2520SM-N910U%2520Build/LRX22C)%2520AppleWebKit/537.36%2520(KHTML,%2520like%2520Gecko)%2520Chrome/54.0.2840.85%2520Mobile%2520Safari/537.36 u=http://fun01.cc/ups/12262/post/600x314/1479524001747382.jpg - Hit rGyDhi2qZSNbwCGFOxNqK1Ge94_VAvdq1BxTEfek_xIf3hmjUFAMbQ== cf.jare.io http 441 0.002 - - - Hit HTTP/1.1 +2016-11-19 10:38:20 SFO9 41021 173.252.120.109 GET djk1be5eatcae.cloudfront.net / 200 - facebookexternalhit/1.1%2520(+http://www.facebook.com/externalhit_uatext.php) u=http%253A%252F%252Ffun01.cc%252Fups%252F12262%252Fpost%252F600x314%252F1479512362737265.jpg - Hit K0saJdeWl1yw7uxzx2iNKnx8aCMAwI8mQLuwycppOLCWjoUZiVw_ag== cf.jare.io http 270 0.001 - - - Hit HTTP/1.1 +2016-11-19 10:38:53 SFO9 97451 66.220.158.121 GET djk1be5eatcae.cloudfront.net / 200 - facebookexternalhit/1.1%2520(+http://www.facebook.com/externalhit_uatext.php) u=http%253A%252F%252Ffun01.cc%252Fups%252F12262%252Fpost%252F600x314%252F1479536064580949.jpg - Hit ChwdzwUCx5IkABHC4w1BETHfO4Gwg4eITdfQJuM30x6zPryOKHPUMA== cf.jare.io http 270 0.001 - - - Hit HTTP/1.1 +2016-11-19 10:38:47 TPE50 19742 122.254.24.216 GET djk1be5eatcae.cloudfront.net / 200 http://fun01.cc/post/297594 Mozilla/5.0%2520(Linux;%2520U;%2520Android%25205.0.2;%2520zh-tw;%2520Redmi%2520Note%25202%2520Build/LRX22G)%2520AppleWebKit/537.36%2520(KHTML,%2520like%2520Gecko)%2520Version/4.0%2520Chrome/42.0.0.0%2520Mobile%2520Safari/537.36%2520XiaoMi/MiuiBrowser/2.1.1 u=http://fun01.cc/ups/964/post/600x314/119681118282765.jpg - Hit 3HzcNxfDdAB3PtGqXr0TlcYK_n3XcUu-tMsYZCUqGT-ckelSeZJYZQ== cf.jare.io http 453 0.012 - - - Hit HTTP/1.1 +2016-11-19 10:38:48 TPE50 821 49.216.215.254 GET djk1be5eatcae.cloudfront.net / 304 http://fun01.cc/post/297534?agree=1 Mozilla/5.0%2520(Linux;%2520Android%25206.0;%2520HUAWEI%2520VNS-L22%2520Build/HUAWEIVNS-L22;%2520wv)%2520AppleWebKit/537.36%2520(KHTML,%2520like%2520Gecko)%2520Version/4.0%2520Chrome/51.0.2704.81%2520Mobile%2520Safari/537.36%2520%5BFB_IAB/FB4A;FBAV/103.0.0.20.72;%5D u=http://fun01.cc/ups/2108/post/600x314/582ee15820920239.jpg - Hit Dnm0xVKTfsgvPG-uemdHIQqWMD3eGrQFTuk8TC02Ahcz6dbhw_BCxg== cf.jare.io http 611 0.004 - - - Hit HTTP/1.1 +2016-11-19 10:38:51 TPE50 40043 111.249.222.218 GET djk1be5eatcae.cloudfront.net / 200 http://fun01.cc/post/297020 Mozilla/5.0%2520(Linux;%2520Android%25205.0.2;%2520ASUS_Z00LD%2520Build/LRX22G;%2520wv)%2520AppleWebKit/537.36%2520(KHTML,%2520like%2520Gecko)%2520Version/4.0%2520Chrome/54.0.2840.85%2520Mobile%2520Safari/537.36%2520%5BFB_IAB/FB4A;FBAV/103.0.0.20.72;%5D u=http://fun01.cc/ups/27933/post/600x314/582c678faa08a413.jpg - Hit mORkZcpG9WdnrQYuFcTsZFUiqOrRj2zXZhPg_-jSADbyn99yQtdTOw== cf.jare.io http 508 0.003 - - - Hit HTTP/1.1 +2016-11-19 10:38:57 TPE50 15288 49.219.104.239 GET djk1be5eatcae.cloudfront.net / 200 http://fun01.cc/post/297683?fb=Times168168&xsign=3b450509e450e5c799e1c0edc0d968d7&xkey=314795519292 Mozilla/5.0%2520(Linux;%2520Android%25206.0.1;%2520ASUS_Z00ED%2520Build/MMB29P;%2520wv)%2520AppleWebKit/537.36%2520(KHTML,%2520like%2520Gecko)%2520Version/4.0%2520Chrome/54.0.2840.85%2520Mobile%2520Safari/537.36 u=http://fun01.cc/ups/27552/post/600x314/583013b27b686665.jpg - Hit ArxNAEV7RDr_ZX6IDw5ZpkSoz1NslteFApYeAJjXD5zUktkcA5CkCw== cf.jare.io http 546 0.001 - - - Hit HTTP/1.1 diff --git a/web.iml b/web.iml index bb345de..4dd289d 100644 --- a/web.iml +++ b/web.iml @@ -44,13 +44,14 @@ - + + - +