Jelajahi Sumber

update:日志更改v1

tujidelv 3 tahun lalu
induk
melakukan
5db38f200b

+ 48 - 0
src/main/resources/application-dev.yml

@@ -0,0 +1,48 @@
+# Web容器配置
+server:
+  tomcat:
+    accept-count: 1000
+    max-connections: 10000
+    max-threads: 1000
+    min-spare-threads: 50
+    uri-encoding: UTF-8
+    max-http-post-size: 100MB
+    accesslog:
+      enabled: true
+  port: 8024
+  connection-timeout: 60000
+  servlet:
+    context-path: /jav
+  compression:
+    enabled: true
+  http2:
+    enabled: true
+spring:
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    url: jdbc:mysql://144.34.207.84:3306/jav?useUnicode=true&allowMultiQueries=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false&useSSL=false
+    username: root
+    password: fa7777a9337be09f
+    type: com.zaxxer.hikari.HikariDataSource
+    # Hikari 连接池配置
+    hikari:
+      # 最小空闲连接数量
+      minimum-idle: 10
+      # 空闲连接存活最大时间,默认600000(10分钟)
+      idle-timeout: 60000
+      # 连接池最大连接数,默认是10
+      maximum-pool-size: 100
+      # 此属性控制从池返回的连接的默认自动提交行为,默认值:true
+      auto-commit: true
+      # 连接池名称
+      pool-name: HikariCP
+      # 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟
+      max-lifetime: 60000
+      # 数据库连接超时时间,默认30秒,即30000
+      connection-timeout: 60000
+      # 生效超时
+      validation-timeout: 3000
+      connection-test-query: SELECT 1
+# 日志配置
+logging:
+  config: classpath:env/dev/log4j2-spring.xml

+ 48 - 0
src/main/resources/application-test.yml

@@ -0,0 +1,48 @@
+# Web容器配置
+server:
+  tomcat:
+    accept-count: 1000
+    max-connections: 10000
+    max-threads: 1000
+    min-spare-threads: 50
+    uri-encoding: UTF-8
+    max-http-post-size: 100MB
+    accesslog:
+      enabled: true
+  port: 8024
+  connection-timeout: 60000
+  servlet:
+    context-path: /jav
+  compression:
+    enabled: true
+  http2:
+    enabled: true
+spring:
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    url: jdbc:mysql://144.34.207.84:3306/jav?useUnicode=true&allowMultiQueries=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false&useSSL=false
+    username: root
+    password: fa7777a9337be09f
+    type: com.zaxxer.hikari.HikariDataSource
+    # Hikari 连接池配置
+    hikari:
+      # 最小空闲连接数量
+      minimum-idle: 10
+      # 空闲连接存活最大时间,默认600000(10分钟)
+      idle-timeout: 60000
+      # 连接池最大连接数,默认是10
+      maximum-pool-size: 100
+      # 此属性控制从池返回的连接的默认自动提交行为,默认值:true
+      auto-commit: true
+      # 连接池名称
+      pool-name: HikariCP
+      # 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟
+      max-lifetime: 60000
+      # 数据库连接超时时间,默认30秒,即30000
+      connection-timeout: 60000
+      # 生效超时
+      validation-timeout: 3000
+      connection-test-query: SELECT 1
+# 日志配置
+logging:
+  config: classpath:env/test/log4j2-spring.xml

+ 4 - 45
src/main/resources/application.yml

@@ -1,51 +1,10 @@
-# Web容器配置
-server:
-  tomcat:
-    accept-count: 1000
-    max-connections: 10000
-    max-threads: 1000
-    min-spare-threads: 50
-    uri-encoding: UTF-8
-    max-http-post-size: 100MB
-    accesslog:
-      enabled: true
-  port: 8024
-  connection-timeout: 60000
-  servlet:
-    context-path: /jav
-  compression:
-    enabled: true
-  http2:
-    enabled: true
 spring:
   application:
     name: jav
-  datasource:
-    driver-class-name: com.mysql.cj.jdbc.Driver
-    url: jdbc:mysql://144.34.207.84:3306/jav?useUnicode=true&allowMultiQueries=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false&useSSL=false
-    username: root
-    password: fa7777a9337be09f
-    type: com.zaxxer.hikari.HikariDataSource
-    # Hikari 连接池配置
-    hikari:
-      # 最小空闲连接数量
-      minimum-idle: 10
-      # 空闲连接存活最大时间,默认600000(10分钟)
-      idle-timeout: 60000
-      # 连接池最大连接数,默认是10
-      maximum-pool-size: 100
-      # 此属性控制从池返回的连接的默认自动提交行为,默认值:true
-      auto-commit: true
-      # 连接池名称
-      pool-name: HikariCP
-      # 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟
-      max-lifetime: 60000
-      # 数据库连接超时时间,默认30秒,即30000
-      connection-timeout: 60000
-      # 生效超时
-      validation-timeout: 3000
-      connection-test-query: SELECT 1
-
+  # 指定运行环境
+  profiles:
+    active: @activatedProperties@
+  # freemarker
   freemarker:
     allow-request-override: false
     cache: true

+ 0 - 0
src/main/resources/log4j2-spring.xml → src/main/resources/env/dev/log4j2-spring.xml


+ 104 - 0
src/main/resources/env/test/log4j2-spring.xml

@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
+<!--monitorInterval:Log4j能够自动检测修改配置文件和重新配置本身,设置间隔秒数-->
+<configuration monitorInterval="5" status="WARN">
+    <!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
+
+    <!--变量配置-->
+    <Properties>
+        <Property name="PID">????</Property>
+        <Property name="LOG_EXCEPTION_CONVERSION_WORD">%xwEx</Property>
+        <Property name="LOG_LEVEL_PATTERN">%5p</Property>
+        <Property name="LOG_DATEFORMAT_PATTERN">yyyy-MM-dd HH:mm:ss.SSS</Property>
+
+        <!--定义日志文件存储的基础路径和文件名。因为 Spring Boot 并未提供 Log4j2 拓展,无法直接读取 Spring Boot 配置文件,所以这里我们只能直接定义-->
+        <Property name="FILE_PATH" value="/usr/program/jav/logs"/>
+        <property name="FILE_NAME" value="jav"/>
+
+        <!-- 格式化输出:%date表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符,%logger{36} 表示 Logger 名字最长36个字符 -->
+        <property name="LOG_PATTERN" value="%date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/>
+        <!-- 控制台的日志格式:日期和时间(毫秒精度),日志级别,进程 ID,分隔符(用于区分实际日志内容的开始),线程名称(在方括号中),日志记录器名称(这通常是源类名称),日志内容 -->
+        <Property name="CONSOLE_LOG_PATTERN"
+                  value="%clr{%d{${LOG_DATEFORMAT_PATTERN}}}{faint} %clr{${LOG_LEVEL_PATTERN}} %clr{${sys:PID}}{magenta} %clr{---}{faint} %clr{[%t]}{faint} %clr{%-40.40c{1.}}{cyan} %clr{:}{faint} %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD}"/>
+        <!-- 日志文件的日志格式:同上-->
+        <property name="FILE_LOG_PATTERN"
+                  value="%d{${LOG_DATEFORMAT_PATTERN}} ${LOG_LEVEL_PATTERN} ${sys:PID} --- [%t] %-40.40c{1.} : %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD}"/>
+    </Properties>
+
+    <appenders>
+        <!-- 控制台的 Appender -->
+        <console name="Console" target="SYSTEM_OUT">
+            <!-- 输出日志的格式 -->
+            <PatternLayout pattern="${CONSOLE_LOG_PATTERN}"/>
+            <!-- 控制台只输出level及其以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
+            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
+        </console>
+
+        <!-- 日志文件的 Appender -->
+        <!-- 文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,适合临时测试用 -->
+        <File name="Filelog" fileName="${FILE_PATH}/test.log" append="false">
+            <PatternLayout pattern="${LOG_PATTERN}"/>
+        </File>
+
+        <!-- 日志文件的 Appender -->
+        <!-- 这个会打印出所有的info及以上级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档 -->
+        <RollingFile name="RollingFileDebug" fileName="${FILE_PATH}/debug.log"
+                     filePattern="${FILE_PATH}/DEBUG/${FILE_NAME}-DEBUG-%d{yyyy-MM-dd}_%i.log.gz">
+            <!-- onMatch="ACCEPT"匹配level级别及以上级别;onMatch="DENY"不匹配level级别及以上级别; -->
+            <!-- onMismatch="ACCEPT" 表示匹配level级别以下的级别;onMismatch="DENY" 表示不匹配level级别以下的级别; -->
+            <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
+            <PatternLayout pattern="${FILE_LOG_PATTERN}"/>
+            <!-- 滚动策略,基于时间 + 大小的分包策略 -->
+            <Policies>
+                <!--interval属性用来指定多久滚动一次,默认是1 hour-->
+                <TimeBasedTriggeringPolicy interval="1"/>
+                <SizeBasedTriggeringPolicy size="10MB"/>
+            </Policies>
+            <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
+            <DefaultRolloverStrategy max="15"/>
+        </RollingFile>
+        <!-- 这个会打印出所有的warn及以上级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
+        <RollingFile name="RollingFileWarn" fileName="${FILE_PATH}/warn.log"
+                     filePattern="${FILE_PATH}/WARN/${FILE_NAME}-WARN-%d{yyyy-MM-dd}_%i.log.gz">
+            <Filters>
+                <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
+                <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
+            </Filters>
+            <PatternLayout pattern="${FILE_LOG_PATTERN}"/>
+            <Policies>
+                <TimeBasedTriggeringPolicy interval="1"/>
+                <SizeBasedTriggeringPolicy size="10MB"/>
+            </Policies>
+            <DefaultRolloverStrategy max="15"/>
+        </RollingFile>
+        <!-- 这个会打印出所有的error及以上级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
+        <RollingFile name="RollingFileError" fileName="${FILE_PATH}/error.log"
+                     filePattern="${FILE_PATH}/ERROR/${FILE_NAME}-ERROR-%d{yyyy-MM-dd}_%i.log.gz">
+            <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
+            <PatternLayout pattern="${FILE_LOG_PATTERN}"/>
+            <Policies>
+                <TimeBasedTriggeringPolicy interval="1"/>
+                <SizeBasedTriggeringPolicy size="10MB"/>
+            </Policies>
+            <DefaultRolloverStrategy max="15"/>
+        </RollingFile>
+    </appenders>
+
+    <!--Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。-->
+    <!--只有定义了logger并引入的appender,appender才会生效-->
+    <loggers>
+        <!--若是additivity设为false,则子Logger只会在自己的appender里输出,而不会在父Logger的appender里输出。-->
+        <!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
+        <logger name="org.mybatis" level="debug" additivity="true"/>
+        <Logger name="top.lvzhiqiang" level="debug" additivity="true"/>
+
+        <!-- 设置 Appender ,同时 ROOT 的日志级别为INFO -->
+        <root level="info">
+            <appender-ref ref="Console"/>
+            <appender-ref ref="RollingFileDebug"/>
+            <appender-ref ref="RollingFileWarn"/>
+            <appender-ref ref="RollingFileError"/>
+        </root>
+    </loggers>
+
+</configuration>

+ 31 - 1
src/test/java/Test2.java

@@ -11,6 +11,7 @@ import java.net.InetSocketAddress;
 import java.net.Proxy;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.util.Random;
 
 public class Test2 {
     public static void main(String[] args) {
@@ -19,7 +20,14 @@ public class Test2 {
         Document document;
         VideoInfoPool videoInfoPool;
         try {
-            document = Jsoup.connect(javbusUrl.concat(identificationCode)).timeout(50000).get();
+            document = Jsoup.connect(javbusUrl.concat(identificationCode))
+                    .timeout(50000)
+                    //.proxy()
+                    //.data()
+                    .ignoreContentType(true)
+                    .userAgent(getUserAgent())
+                    .header("referer", "https://www.javbus.com/".concat(identificationCode))
+                    .get();
 
             videoInfoPool = new VideoInfoPool();
             parseDocument(document, identificationCode, videoInfoPool);
@@ -141,4 +149,26 @@ public class Test2 {
         bufferedOutputStream.close();
         bufferedInputStream.close();
     }
+
+    private static String getUserAgent() {
+        Random r = new Random();
+        String[] ua = {"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0",
+                "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.87 Safari/537.36 OPR/37.0.2178.32",
+                "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2",
+                "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36",
+                "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586",
+                "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko",
+                "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)",
+                "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)",
+                "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0)",
+                "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 BIDUBrowser/8.3 Safari/537.36",
+                "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36 Core/1.47.277.400 QQBrowser/9.4.7658.400",
+                "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 UBrowser/5.6.12150.8 Safari/537.36",
+                "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0",
+                "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36 TheWorld 7",
+                "Mozilla/5.0 (Windows NT 6.1; W…) Gecko/20100101 Firefox/60.0",
+                "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36"};
+        int i = r.nextInt(15);
+        return ua[i];
+    }
 }

+ 28 - 0
src/test/java/Test4.java

@@ -0,0 +1,28 @@
+/**
+ * https://proxy.seofangfa.com/
+ * 【亲测好用!】2022-04-18 21:13:41最新免费代理IP 1395个
+ * 免费代理IP项目初衷
+ * 做SEO项目的时候需要定时给客户网站批量查收录、排名等数据,如果是少量还没问题,大量的话,很容易被百度封IP、出验证码,造成程序效率低下,于是走上了寻找代理IP这条路。 一开始也用过市面上的付费代理IP,名字就不提了,百度能搜索到的基本上都用过,但是他们IP要么存活率低,要么价格不便宜,于是萌生了自己寻找代理IP的念头。
+ * <p>
+ * 项目简介
+ * 2022年最新可用的免费代理IP,每5分钟重新验证一次,包括HTTP代理IP,HTTPS代理IP,SOCKS理IP,QQ代理IP等,本网站所提供的代理IP,均经过了程序严格的两步验证,保证了连接速度和存活率,可用度比较高,目前在实际项目中,轮循处理500万条URL的百度收录查询毫无压力。
+ * <p>
+ * 验证方法
+ * 第一步,先经过代理IP访问http://www.baidu.com,如果连接时间在3秒以内,并且获取百度源代码正常,则认为这是一个有效的代理IP;
+ * 第二步,再用第一步验证有效的IP去访问淘宝IP位置的API接口,获取该IP的地理位置,如果连接时间在3秒以内,且能正常获取到该IP的地理位置,则认为该代理IP是有效的,最终入库。
+ * <p>
+ * 代理IP有什么用
+ * 简单举几个例子
+ * 1、隐私保护。使用代理IP就是让你上QQ和网页浏览时不用当心自己的真实IP会被别人知道或被黑客攻击;
+ * 2、反防采集。比如我们做SEO顾问服务时经常需要给客户批量查关键词排名、文章收录情况等,如果不通过代理IP,搜索引擎很容易屏蔽我们的爬虫程序;
+ * 3、刷票。很多投票的网页一个IP只允许投票一次,如果我们借助大量代理IP去投票,结果可想而知....
+ */
+
+/**
+ * 爬取网上免费代理IP,搭建自己的Ip池
+ */
+public class Test4 {
+    public static void main(String[] args) {
+
+    }
+}