iptables删除规则

删除iptables的规则

第一种办法

  1. iptables -t nat -L -n –line-numbers (|grep [端口/ip]) 查看当前有几条规则
  2. iptables -t nat -D PREROUTING 1 删除序列号为1的规则

第二种办法(第一种我试过有时候没用)

  1. iptables-save >/tmp/somefile
  2. vim /tmp/somefile 找到对应的nat规则
  3. iptables-restore < /tmp/somefile

java中doc转html,poi openoffice libreoffice

doc转html

POI,Office,libreoffice,openoffice

  1. linux中无法调用windows的office组件来进行转换。微软office组件解析最佳
  2. linux下libreoffice解析最佳
  3. poi工具适用于简单转换。无法兼容doc下的数学公式。只对普通文本有效果
  4. openoffice存在同样与poi一样的问题。
    结论:windows下可以使用libreoffice 微软office。linux只有libreoffice

libreoffice在java中使用

  1. libreoffice链接
  2. 安装步骤。 大写的省略
  3. 安装完成后需要启动监听端口:

soffice -headless -accept=”socket,port=8100;urp;”

部分电脑可能需要输入:soffice -headless -accept=”socket,host=127.0.0.1,port=8100;urp;” -nofirststartwizard


java中使用

  1. 百度的结果

    1
    2
    3
    4
    5
    6
    7
    8
    1. 引入maven:--------------------- 
    <dependency>
    <groupId>com.artofsolving</groupId>
    <artifactId>jodconverter</artifactId>
    <version>2.2.2</version>
    </dependency>
    注: com.artofsolving 已经不维护。maven仓库版本最高只有2.2.1 。而且不支持docx的解析。2.2.2需要自己去其他地方下载
    ----------------------------
  2. artofsolving已经代码公开,目前已经由org.jodconverter 接手

1
2
3
4
5
6
maven引入:
<dependency>
<groupId>org.jodconverter</groupId>
<artifactId>jodconverter-local</artifactId>
<version>4.2.2</version>
</dependency>
  1. github连接地址:https://github.com/sbraconnier/jodconverter

java自定义calssloader

自定义classloder

自定义之前需要熟悉的双亲委派机制

  1. 双亲委派是为了保证jvm同时只存在一个Object对象。都由父类加载。父类无法找到才由子类进行查找
  2. 但在web容器中:如tomcat 不能使用这种。每个war包由自己的jar包。这时候就要进行容器隔离。
  3. 所有classloader都有父类加载器。但不是父类。由方法parent指定。
  4. 顶级的Boostrap ClassLoader:这个是由c++实现的,所以在方法区并没有Class对象的实例存在。用于加载JAVA_HOME/bin目录下的jar包
  5. 扩展类加载器(Extension ClassLoader):它负责用于加载JAVA_HOME/lib/ext目录中的,或者被java.ext.dirs系统变量指定所指定的路径中所有类库,开发者可以直接使用扩展类加载器。java.ext.dirs系统变量所指定的路径的可以通过程序来查看。System.getProperty(“java.ext.dirs”)
  6. 应用程序类加载器(Application ClassLoader):负责加载用户类路径上指定的类库。开发者可以直接使用这个类加载器。ps:在没有指定自定义类加载器的情况下,这就是程序的默认加载器。
  7. 自定义类加载器(User ClassLoader):
1
2
3
4
5
6
loadClass()和findClass()方法区别:
自定义时候覆盖loadClass()方法可以保证同一个类存在多份。自行实现类加载
findClass()方法还是先由先由父类进行加载,查看是否加载多。没有加载在交由子类。
场景一:tomcat容器隔离。这时候需要覆盖loadClass()。同一个war包会有同样一个jar包,可以版本不同,能够同时存在.findClass()则无法处理。再一次加载后查看缓存已经存在直接进行加载。
场景二:tomcat中servlet-api.jar以及公共jar包。这个需要在jvm中只有一份。就需要只覆盖findClass()。
tomcat有不同的clasloader加载不同的场景

自定义classloader

  1. 代码链接

java使用jni调用本地

Java调用JNI

调用过程

  1. 首先需要java的方法需要native 做修饰。
  2. 通过javac和javah生成.h文件。
  3. 通过c++编程生成dll文件
  4. 加载生成的DLL库文件.(后面代码详细讲解)

先看看java代码(分是否package)。这里是没有package的

1
2
3
4
5
6
7
8
9
10
11
12
import java.util.Map;
public class NativeOfficeConverter {
/**
* 将
* @param path 需要转换的文件路径
* @param outDir 输出的文件目录
* @return 转换后的文件目录
* key有3个: code path imgPath
* code不等于200 转换失败。等于200 path转换后的目录,等于传入的outDir。imgPath等同于path。可自定义
*/
public native Map<String,String> docToHtmlConvert(String path,String outDir);
}
  1. javac -encoding UTF-8 NativeOfficeConverter.java
  2. javah NativeOfficeConverter // 别加class后缀。 .h文件就生成了

有package的

  1. javah com.test.NativeOfficeConverter
    1
    这个命令需要在同com平级的目录上执行,同时.h文件会生成在当前目录。javah中有一个-d可以指定。看help

生成dll库

  1. 放入到java系统中
    1
    2
    3
    4
    5
    6
    // 加载生成的DLL库文件
    static {
    // 2选1 load加载的是全路径。loadLibrary需要dll文件放入到系统环境变量中。预先已经加载
    System.loadLibrary("LibJniTest");
    System.load("LibJniTest");
    }

jenkins安装和gitlib hooks配置

jenkins安装

  1. docker pull xxx

jenkins配置gitlibhooks

  1. Jenkins插件安装

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Jenkins其实没有什么需要特别配置的,由于这次任务中需要利用Jenkins与git,gitlab协作,所以需要安装一些插件。在主面板上点击Manage Jenkins -> Manage Plugins。

    由于公司使用代理连接外网,首先需要为Jenkins插件安装配置proxy。点击Advanced标签即进入proxy设置页面。

    Aailable标签下就是可以安装的插件。

    要让Jenkins可以自动build git repo中的代码,需要安装GIT Client Plugin和GIT Plugin。

    要想Jenkins可以收到Gitlab发来的hook从而自动build,需要安装 Gitlab Hook Plugin。

    要让Jenkins可以在build完成之后根据TAP(test anything protocol)文件生成graph,需要安装 TAP Plugin。
  2. 安装gitlib-hooks地址

  3. 安装gitlib-hooks报错

    jenkins在安装Git hook plugins提示失败:

    OS : CentOS 6.5 64位
    Jenkins : 1.638
    JDK : 1.8.0_66
    Ruby-runtime : 0.13
    问题 : gitlab hook plugin无法安装的原因是因为ruby-runtime无法安装.

    <!--hexoPostRenderEscape:<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">java.io.IOException: Failed to dynamically deploy this plugin</span><br><span class="line">at hudson.model.UpdateCenter$InstallationJob._run(UpdateCenter.java:1308)</span><br><span class="line">at hudson.model.UpdateCenter$DownloadJob.run(UpdateCenter.java:1107)</span><br><span class="line">at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)</span><br><span class="line">at java.util.concurrent.FutureTask.run(Unknown Source)</span><br><span class="line">at hudson.remoting.AtmostOneThreadExecutor$Worker.run(AtmostOneThreadExecutor.java:104)</span><br><span class="line">at java.lang.Thead.run(Unknown Source)</span><br></pre></td></tr></table></figure>:hexoPostRenderEscape-->
  4. 解决办法:

    看上去是在下载过程中文件出现了问题. 首先关闭Jenkins.找到jenkins主目录下面的插件目录,我的目录在/home/web/.jenkins/plugins, 删除相关文件gitlab-hook.jpi和ruby-runtime.jpi

    重启jenkins, 试着重新安装.还是无法安装成功,报错信息,应该是下载文件的网络问题:手动下载相关的文件,现在地址在这里, 找到相关的插件,然后选择版本.下载到本地

    进入jenkins的系统设置->插件管理->高级->上传插件,把下载到本地文件的插件上传到jenkins的服务器进行安装.

  5. ruby文件比较大,直接上传可能会抛错,可以直接下载,放到${host}/jenkins/plugins中,然后重启

  6. 还是报错:

    <!--hexoPostRenderEscape:<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br></pre></td><td class="code"><pre><span class="line">java.io.IOException: Failed to dynamically deploy this plugin</span><br><span class="line">at hudson.model.UpdateCenter$InstallationJob._run(UpdateCenter.java:1328)</span><br><span class="line">at hudson.model.UpdateCenter$DownloadJob.run(UpdateCenter.java:1126)</span><br><span class="line">at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)</span><br><span class="line">at java.util.concurrent.FutureTask.run(FutureTask.java:266)</span><br><span class="line">at hudson.remoting.AtmostOneThreadExecutor$Worker.run(AtmostOneThreadExecutor.java:110)</span><br><span class="line">at java.lang.Thread.run(Thread.java:745)</span><br><span class="line">Caused by: java.io.IOException: Failed to install ruby-runtime plugin</span><br><span class="line">at hudson.PluginManager.dynamicLoad(PluginManager.java:487)</span><br><span class="line">at hudson.model.UpdateCenter$InstallationJob._run(UpdateCenter.java:1324)</span><br><span class="line">... 5 more</span><br><span class="line">Caused by: java.io.IOException: Failed to initialize</span><br><span class="line">at hudson.ClassicPluginStrategy.load(ClassicPluginStrategy.java:441)</span><br><span class="line">at hudson.PluginManager.dynamicLoad(PluginManager.java:478)</span><br><span class="line">... 6 more</span><br><span class="line">Caused by: java.lang.ClassCircularityError: org/jruby/RubyClass</span><br><span class="line">at java.lang.Class.forName0(Native Method)</span><br><span class="line">at java.lang.Class.forName(Class.java:348)</span><br><span class="line">at org.jenkinsci.bytecode.ClassWriter.loadClass(ClassWriter.java:97)</span><br><span class="line">at org.jenkinsci.bytecode.ClassWriter.getCommonSuperClass(ClassWriter.java:64)</span><br><span class="line">at org.kohsuke.asm5.ClassWriter.getMergedType(ClassWriter.java:1654)</span><br><span class="line">at org.kohsuke.asm5.Frame.merge(Frame.java:1426)</span><br><span class="line">at org.kohsuke.asm5.Frame.merge(Frame.java:1374)</span><br><span class="line">at org.kohsuke.asm5.MethodWriter.visitMaxs(MethodWriter.java:1475)</span><br><span class="line">at org.kohsuke.asm5.tree.MethodNode.accept(MethodNode.java:833)</span><br><span class="line">at org.kohsuke.asm5.commons.JSRInlinerAdapter.visitEnd(JSRInlinerAdapter.java:187)</span><br><span class="line">at org.jenkinsci.bytecode.Transformer$1$1.visitEnd(Transformer.java:107)</span><br><span class="line">at org.kohsuke.asm5.MethodVisitor.visitEnd(MethodVisitor.java:877)</span><br><span class="line">at org.kohsuke.asm5.ClassReader.readMethod(ClassReader.java:1021)</span><br><span class="line">at org.kohsuke.asm5.ClassReader.accept(ClassReader.java:693)</span><br><span class="line">at org.kohsuke.asm5.ClassReader.accept(ClassReader.java:506)</span><br><span class="line">at org.jenkinsci.bytecode.Transformer.transform(Transformer.java:113)</span><br><span class="line">at hudson.ClassicPluginStrategy$AntClassLoader2.defineClassFromData(ClassicPluginStrategy.java:800)</span><br><span class="line">at jenkins.util.AntClassLoader.getClassFromStream(AntClassLoader.java:1310)</span><br><span class="line">at jenkins.util.AntClassLoader.findClassInComponents(AntClassLoader.java:1366)</span><br><span class="line">at jenkins.util.AntClassLoader.findClass(AntClassLoader.java:1326)</span><br><span class="line">at jenkins.util.AntClassLoader.loadClass(AntClassLoader.java:1079)</span><br><span class="line">at java.lang.ClassLoader.loadClass(ClassLoader.java:357)</span><br><span class="line">at org.jenkinsci.jruby.RubyClassConverter.&lt;init&gt;(RubyClassConverter.java:12)</span><br><span class="line">at org.jenkinsci.jruby.JRubyXStream.register(JRubyXStream.java:25)</span><br><span class="line">at ruby.RubyRuntimePlugin.initRubyXStreams(RubyRuntimePlugin.java:44)</span><br><span class="line">at ruby.RubyRuntimePlugin.start(RubyRuntimePlugin.java:28)</span><br><span class="line">at hudson.ClassicPluginStrategy.startPlugin(ClassicPluginStrategy.java:449)</span><br><span class="line">at hudson.ClassicPluginStrategy.load(ClassicPluginStrategy.java:438)</span><br><span class="line">... 7 more</span><br><span class="line"></span><br><span class="line">网上继续寻找问题,在Jenkins的官网找到一个issue, 描述的就是这个问题. Phellipe Ribeiro最后给出了一个在CentOS的临时解决方案:</span><br><span class="line"></span><br><span class="line">编辑Jenkins的配置文件 /etc/sysconfig/jenkins 的JENKINS_JAVA_OPTIONS</span><br><span class="line"></span><br><span class="line">修改后 : JENKINS_JAVA_OPTIONS=&quot;-Djava.awt.headless=true -Dhudson.ClassicPluginStrategy.noBytecodeTransformer=true&quot;</span><br><span class="line"></span><br></pre></td></tr></table></figure>:hexoPostRenderEscape-->
  7. 如果安装没有问题,或者已经修好了,可以重新gitlib-hooks插件

  8. 在gitLab项目中添加web hook(Project Settings –> WebHooks)

    原文参考地址

    <!--hexoPostRenderEscape:<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">gitlab的web hook有很多种,可以满足不同的需求,因为我们的需求是push代码的时候触发,所以选的是Push events.</span><br><span class="line"></span><br><span class="line">Url的作用:这个地方填的url是gitlab发请求用的。其实它的原理就是当开发人员在git上的操作触发这个hook时,gitlab就向这个url发一个post请求。请求中带着一堆参数比如提交者是谁,提交的分支是哪个,commit号是多少等等。接受这个请求的那端可以利用这些信息去处理后续的一些事情,比如部署测试通知等等。</span><br><span class="line"></span><br><span class="line">此处,由于我们在jenkins上安装了gitlab hook插件,所以我们只需要按照它的使用方法在url里填上以下链接即可:</span><br><span class="line"></span><br><span class="line">http://your-jenkins-server/gitlab/notify_commit</span><br></pre></td></tr></table></figure>:hexoPostRenderEscape-->
  9. 在jenkins里需要自动触发的job里的“源码管理”部分添加设置,如下图。填好git仓库url和需要检测的分支名称

jmeter测试工具

使用jmeter进行压力测试

使用jmeter

  1. 建立请求,这里就不写了。

压力测试

  1. 使用压力测试有一列(aggregate graph)
1
2
3
   聚合报告如下图所示,每一列的含义分别表示请求名称,请求总数,请求的平均响应时间(毫秒),50%的请求的响应时间,90%的请求的响应时
间,95%的请求的响应时间,99%的请求的响应时间,最小的响应时间,最大的响应时间,错误的请求率(错误请求数/总的请求数),吞吐量(每秒处理的
请求数),接收的字节速率,发送的字节速率

jstorm安装配置开发

jstorm记录

安装

简介

JStorm集群包含两类节点:主控节点(Nimbus)和工作节点(Supervisor)。其分别对应的角色如下:

  1. 主控节点(Nimbus)上运行Nimbus Daemon。Nimbus负责接收Client提交的Topology,分发代码,分配任务给工作节点,监控集群中运行任务的状态等工作。Nimbus作用类似于Hadoop中JobTracker。
  2. 工作节点(Supervisor)上运行Supervisor Daemon。Supervisor通过subscribe Zookeeper相关数据监听Nimbus分配过来任务,据此启动或停止Worker工作进程。每个Worker工作进程执行一个Topology任务的子集;单个Topology的任务由分布在多个工作节点上的Worker工作进程协同处理。
    1
    2
    3
    Nimbus和Supervisor节点之间的协调工作通过Zookeeper实现。此外,Nimbus和Supervisor本身均为无状态进程,支持Fail Fast;JStorm集群节点的
    状态信息或存储在Zookeeper,或持久化到本地,这意味着即使Nimbus/Supervisor宕机,重启后即可继续工作。这个设计使得JStorm集群具有非常好的
    稳定性。

概念

  • Storm组件和Hadoop组件对比
jstorm hadoop
角色 Nimbus JobTracker
Supervisor TaskTracker
Worker Child
应用名称 Topology Job
编程接口 Spout/Bolt Mapper/Reducer

接下来解释几个重要的概念:

  1. topology

    1
    jstorm所执行的任务,其实就是一个topology,一个topology可以包含多个spout,多个bolt,多级bolt
  2. spout

    1
    流的来源
  3. bolt

    1
    可以说是流的去处(这里可以进行业务处理)

jvm的常用运行参数以及内存分配和垃圾收集器的工作

jvm的运行参数

jvm的配置参数

  1. -Xms40m //初始内存

  2. -Xmx256m //最大内存

  3. -Xmn16m //最小内存

  4. -XX:PermSize=128M // 永久带的内存

  5. -XX:MaxPermSize=256M // 永久带的最大内存(一般默认64MB)

  6. -XX:SurvivorRatio=8 // 新生代中Eden区域与Survivor区域的容量比值
    jvm内存的分配图

  7. -XX:MaxTenuringThreshold=15 // 一般jvm默认值15 晋升到老年代的对象年龄,每个对象坚持一次MinorGC之后,年龄就增加1,当超过这个参数的值时就进入老年代

jvm常用一些配置参数

  1. GC参数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    -XX:+PrintGC    每次触发GC的时候打印相关日志

    -XX:+PrintGCDetails 更详细的GC日志

    -XX:+PrintHeapAtGC 每次GC时打印堆的详细详细信息

    -XX:+PrintGCApplicationConcurrentTime 打印应用程序执行时间

    -XX:+PrintGCApplicationAtoppedTime 打印应用程序由GC引起的停顿时间

    -XX:+PrintReferenceGC 跟踪系统内的软引用,弱引用,虚引用和finallize队列。
  2. 类跟踪

    1
    2
    3
    4
    5
    6
    7
    -verbose:class    跟踪类的加载和卸载

    -XX:+TraceClassLoading 单独跟踪类加载

    -XX:+TraceClassUnloading 单独跟踪类卸载

    -XX:+PrintClassHistogram 查看运行时类的分布情况,使用时在控制台按ctrl+break
  3. 系统参数查看

    1
    2
    3
    4
    5
    -XX:+PrintVMOptions       运行时,打印jvm接受的命令行显式参数

    -XX:+PrintCommandLineFlags 打印传递jvm的显式和隐式参数

    -XX:+PrintFlagsFinal 打印所有系统参数值
  4. 1
    2
    3
    4
    5
    6
    7
    8
    9
    -Xms    堆初始值

    -Xmx 堆最大可用值

    -Xmn 新生代大小,一般设为整个堆的1/3到1/4左右

    -XX:SurvivorRatio 设置新生代中eden区和from/to空间的比例关系n/1

    -XX:NewRatio 设置老年代与新生代的比
    1. 垃圾回收器
    1
    2
    3
    4
    5
       Concurrent Mark-Sweep GC :CMS回收器

    Mark Sweep Compact GC: 串行GC(Serial GC)

    Parallel GC with 2 thread(s): 并行GC(ParNew)

jre添加https证书

自己新建https证书,以及使用其他人的https

  1. 自己新建证书:输入如下命令:keytool -genkey -alias ssodemo -keyalg RSA -keysize 1024 -keypass zhoubang -validity 365 -keystore E:\zhoubang.keystore -storepass 123456中间的内容参数自己替换

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    各参数含义:
    -genkeypair 生成密钥
    -keyalg 指定密钥算法,这时指定RSA,
    -keysize 指定密钥长度,默认是1024位,这里指定2048,长一点,我让你破解不了(哈哈...),
    -siglag 指定数字签名算法,这里指定为SHA1withRSA算法
    -validity 指定证书有效期,这里指定36500天,也就是100年,我想我的应用用不到那么长时间
    -alias 指定别名,这里是ssodemo
    -keystore 指定密钥库存储位置,这里存在d盘
    -dname 指定用户信息,不用一个一个回答它的问题了;
    【注意】:第一个让你输入的“您的名字与姓氏是什么”,请必须输入在C:\Windows\System32\drivers\etc\hosts文件中加入的服务端的域名。
    我这里也就是server.zhoubang85.com,为何这么做?
    首先cas只能通过域名来访问,不能通过ip访问,同时上方是生成证书,所以要求比较严格,所以如果不这么做的话,及时最终按照教程配置完成,cas也可以正常访问,访问一个客户端应用虽然能进入cas验证首页,但是,当输入信息正确后,cas在回调转入你想访问的客户端应用的时候,会出现No subject alternative names present错误异常信息,这个错误也就是在上面输入的第一个问题答案不是域名导致、或者与hosts文件配置的不一致导致。
  2. 导出数字证书:在cmd下输入如下命令:keytool -exportcert -alias cas.server.com -keystore d:/tomcat.keystore -file d:/tomcat.cer -rfc

    1
    导出数字证书,即根据刚才生成的tomcat.keystore文件生成一个tomcat.cer文件,在生成的过程中输入的密码也是123456
  3. 配置tomcat的https证书

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    配置cas服务器tomcat
    将tomcat中server.xml中的连接器配置改为:
    <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
    maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
    clientAuth="false" sslProtocol="TLS" keystoreFile="tomcat.keystore"
    keystorePass="123456"/>
    同时将生成的tomcat.keystore复制到tomcat的主目录下,即与conf目录在同一个目录下;
    启动tomcat,然后访问https://cas.server.com:8443/cas 可以访问的只是有警告,因为浏览器没有进行证书认证。
    我们可以将生成的tomcat.cer导入到浏览器中,不导入也可以;如果要导入的,各个浏览器不导也步骤大体相似,以IE浏览器为例:
    点击 工具->Internet选项->内容->证书->受信任的根证书颁发机构->导入->下一步->浏览->选择d:/tomcat.cer->下一步,一路确认下去,直到证书导入成功。
    如果导入在受信任的根证书颁发机构 中可以找到名字为cas.server.com的证书.
    至此cas服务器商配置完毕.
  4. 证书导入java中的cacerts证书库:keytool -import -alias cacerts -keystore {java路径\jre\lib\security\cacerts} -file {证书路径.cer} -trustcacerts

    1
    2
    3
    此时命令行会提示你输入cacerts证书库的密码,
        你敲入changeit就行了,这是java中cacerts证书库的默认密码,
        你自已也可以修改的。
  5. 以后更新时,先删除原来的证书,然后导入新的证书

    keytool -list -keystore cacerts
    keytool -delete -alias akazam_email -keystore cacerts
    keytool -import -alias akazam_email -file akazam_email.cer -keystore cacerts -trustcacerts
  6. 使用网站上的证书时候

    1
    2
    3
    4
    5
    6
    进入某个https://www.xxx.com开头的网站,把要导入的证书下载过来,
        在该网页上右键 >> 属性 >> 点击"证书" >>
        再点击上面的"详细信息"切换栏 >>
        再点击右下角那个"复制到文件"的按钮
        就会弹出一个证书导出的向导对话框,按提示一步一步完成就行了。
        例如:保存为abc.cer,放在C盘下

log4j2的使用和配置项说明

log4j2结合springboot

初始化项目

  1. pom文件引入
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
          <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
    </dependency>
    -- 一下distuptor需要根据log4j2的配置。是否需要异步输入日志来判断
    <dependency>
    <groupId>com.lmax</groupId>
    <artifactId>disruptor</artifactId>
    <version>3.4.2</version>
    </dependency>
  2. 文档地址springboot logger 4.4.6章节

demo文件

  1. 文件默认加载:log4j2-spring.xml or log4j2.xml 。这里推荐使用前者
  2. 配置演示文件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    <?xml version="1.0" encoding="UTF-8"?>
    <!--设置log4j2的自身log级别为ERROR-->
    <!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
    <!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
    <!--monitorInterval:监控间隔,例如:monitorInterval=”600” 指log4j2每隔600秒(10分钟),自动监控该配置文件是否有变化,如果变化,则自动根据文件内容重新配置-->
    <configuration status="INFO" monitorInterval="30">
    <Properties>
    <!-- 配置日志文件输出目录 -->
    <Property name="LOG_HOME">E:\\work\\logs</Property>
    <Property name="LOG_BUSINESS_LEVEL">INFO</Property>
    <Property name="LOG_LEVEL">INFO</Property>
    <Property name="LOG_SQL_LEVEL">TRACE</Property>
    </Properties>

    <!--先定义所有的appender-->
    <appenders>

    <!--这个输出控制台的配置-->
    <Console name="Console" target="SYSTEM_OUT">
    <!--输出日志的格式-->
    <PatternLayout pattern="%d [%t] %-5p [%c] - %m%n"/>
    </Console>

    <!--business的日志记录追加器-->
    <RollingRandomAccessFile name="businessFile" fileName="${LOG_HOME}/leke-business.log" immediateFlush="false" append="true"
    filePattern="${LOG_HOME}/business-%d{yyyy-MM-dd}-%i.log.gz">
    <PatternLayout pattern="%d [%t] %-5p [%c] - %m%n"/>
    <!-- 该日志文件只会打印INFO等级的日志 -->
    <Filters>
    <!--WARN(含WARN)以上的级别信息直接拒绝,WARN以下交由下一个过滤器-->
    <ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
    <!--接收上一个过滤器来的内容:大于DEBUG信息通过,低于INFO信息的拒绝-->
    <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY" />
    </Filters>
    <Policies>
    <SizeBasedTriggeringPolicy size="1000 MB"/>
    <TimeBasedTriggeringPolicy/>
    </Policies>
    </RollingRandomAccessFile >

    <!--exception的日志记录追加器-->
    <RollingRandomAccessFile name="exceptionFile" fileName="${LOG_HOME}/exception.log" immediateFlush="false" append="true"
    filePattern="${LOG_HOME}/exception-%d{yyyy-MM-dd}-%i.log.gz">
    <!--WARN(含WARN)以上的级别信息通过,低于WARN的拒绝执行-->
    <Filters>
    <ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
    </Filters>
    <PatternLayout pattern="%d [%t] %-5p [%c] - %m%n"/>
    <Policies>
    <SizeBasedTriggeringPolicy size="1000 MB"/>
    <TimeBasedTriggeringPolicy/>
    </Policies>
    </RollingRandomAccessFile >

    <Async name="Async">
    <appender-ref ref="Console"/>
    <appender-ref ref="businessFile"/>
    <appender-ref ref="exceptionFile"/>
    </Async>

    </appenders>

    <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
    <loggers>
    <root level="WARN">
    <appender-ref ref="Async"/>
    </root>
    <!--这个是异步输出日志文件。性能高,添加该项依赖要加入disruptor包-->
    <AsyncLogger name="com.alibaba.nacos.client.naming" level="info" additivity="false">
    <appender-ref ref="Console"/>
    </AsyncLogger>
    <!--同步输出日志文件。-->
    <Logger name="com.example.demo.controller" level="WARN" additivity="false">
    <appender-ref ref="Console"/>
    <appender-ref ref="businessFile"/>
    <appender-ref ref="exceptionFile"/>
    </Logger>
    </loggers>
    </configuration>

结合springboot的使用

  1. springboot中的YML文件配置优先级高于log4j2.xml 可以在YML配置多环境多配置
  2. YML有以下配置。那么整体的日志级别是INFO。非上面XML中配置的WARN。同时controller也一样是info级别的日志也会输出
    1
    2
    3
    4
    5
    6
    7
    logging:
    level:
    root: INFO
    com:
    example:
    demo:
    controller: INFO

配置项说明

  1. onMatch和onMismatch都有三个属性值,分别为Accept、DENY和NEUTRAL
  2. 分别介绍这两个配置项的三个属性值:
    1
    2
    3
    4
    5
    6
    onMatch="ACCEPT" 表示匹配该级别及以上
    onMatch="DENY" 表示不匹配该级别及以上
    onMatch="NEUTRAL" 表示该级别及以上的,由下一个filter处理,如果当前是最后一个,则表示匹配该级别及以上
    onMismatch="ACCEPT" 表示匹配该级别以下
    onMismatch="NEUTRAL" 表示该级别及以下的,由下一个filter处理,如果当前是最后一个,则不匹配该级别以下的
    onMismatch="DENY" 表示不匹配该级别以下的