一

{"type":"编程笔记"}


  • Home

  • Archives
  • Search

java日志框架简介

Posted on 2016-09-18   |   In java

Java Log Frameworks

常见的java日志框架和实现主要有:

  1. slf4j
  2. log4j
  3. logback
  4. apache jakarta commons-logging
  5. java.util.logging
  6. log4j 2

上述几个日志工具的简单说明:

  1. 前面3个日志工具是同一个作者 Ceki Gülcü 开发的。
  2. slf4j是Simple Logging Facade for Java的缩写,主要是在slf4j-api中定义了日志接口和工厂方法,它并不具体实现日志操作,平时项目开发中引用的日志相关的代码都应该来自这个包。
  3. logback-classic是slf4j的完整实现,目前有取代log4j的趋势,spring-boot项目就在使用这个日志框架。
  4. slf4j-log4j12是连接slf4j-api和log4j的适配器,它实现了slf4j-api中StaticLoggerBinder接口,从而使得在编译时绑定的是slf4j-log4j12的getSingleton()方法。
  5. apache的JCL在较早的一些类库中用得较多,后来更多第三方类库采用log4j,比如struts、spring和hibernate。
  6. java.util.logging是JDK自带的,日志等级较多,较少使用。
  7. log4j 2在多线程模型中性能远高于其他日志框架。

Logger LEVEL

slf4j中定义的常用的日志级别:

  1. ERROR
  2. WARN
  3. INFO
  4. DEBUG

另外还有一个比DEBUG还详细的TRACE,主要是用来跟踪一些非常复杂的算法中,在每一步计算过程中输出详细的结果,用于跟踪分析,并且代码完成后应该将之移除,不要上传到代码库,因此下面就不做说明了。

日志级别使用场景

DEBUG

  • 开发调试使用
  • 信息面向开发工程师

INFO

  • 对象状态变化前后
  • API方法调用前显示传入的参数列表
  • API方法返回的关键信息
  • 定时任务的开始结束信息
  • 关键方法的进入退出点及相应参数
  • 代码块运行时间监控,性能分析
  • 信息面向开发工程师及运维人员

WARN

  • 不影响程序运行的配置问题
  • 可恢复的异常
  • 信息面向开发工程师及运维人员

ERROR

  • 运行时异常
  • 无法处理的异常
  • 记录异常信息和堆栈,不要吞没异常
  • Logger不是异常处理的工具
  • 信息面向开发工程师及运维人员

不同的运行环境使用不同的日志等级

  1. production - INFO
  2. development/stage - DEBUG
  3. test - DEBUG

Should logger object static or not

  1. 建议使用private static final形式,每个类所有对象共用一个日志对象即可,KISS。
  2. non-static被子类继承的优势,只要在父类里声明一个protected的日志对象,子类就可以直接使用,缺点是每个子类对象创建都会生成一个日志对象。
  3. non-static是IOC友好的,因为IOC中的BEAN一般都是单例的。

STATIC

Read more »

tcp nagle's algorithm and delayed ack

Posted on 2016-09-17   |   In linux

本文内容主要是为了帮助理解socket对象中的一个方法:socket.setTcpNoDelay(boolean)。

其中相关的主要内容如下:

  1. 糊涂窗口综合症- silly window syndrome。
  2. nagle 算法 - nagle's algorithm。
  3. 延迟 ACK - tcp delayed acknowledgment。

糊涂窗口综合症

当 TCP 连接建立之后,在一些情况下,网络传输的 TCP 报文段中数据长度只有 1 个字节,而传输开销有 40 字节(20 字节的 IP 头 + 20 字节的 TCP 头),结果有很多 41 字节的 IP 数据报就在互连网中传来传去,造成网络拥塞,这种现象就叫糊涂窗口综合症。

如果要避免糊涂窗口综合症,可以从发送端和接收端分别进行优化设置:

  1. 发送端使用Nagle 算法。
  2. 接收端设置延迟 ACK。

Nagle's algorithm

为了避免糊涂窗口综合症,纳格算法会尽可能发送大块数据,减少大量小数据包的发送,避免网络中充斥着许多小数据块,从而提高网络利用率。

纳格算法实现

参考 tcp_output.c 文件 1679 行tcp_nagle_check函数注释:

16791680168116821683168416851686168716881689169016911692
/* Return false, if packet can be sent now without violation Nagle's rules: * 1. It is full sized. (provided by caller in %partial bool) * 2. Or it contains FIN. (already checked by caller) * 3. Or TCP_CORK is not set, and TCP_NODELAY is set. * 4. Or TCP_CORK is not set, and all sent packets are ACKed. *    With Minshall's modification: all sent small packets are ACKed. */static bool tcp_nagle_check(bool partial, const struct tcp_sock *tp,                int nonagle){    return partial &&        ((nonagle & TCP_NAGLE_CORK) ||         (!nonagle && tp->packets_out && tcp_minshall_check(tp)));}
Read more »

java tool - jstack

Posted on 2016-08-20   |   In java

本文介绍一些java原生提供的工具,分析java线程的死锁情况,定位特别占用系统资源的java线程。

java thread dump

以tomcat进程为例,当tomcat运行出现一些异常情况,比如长时间高CPU消耗,此时可以使用java thread dump,分析java的各线程状态,进行问题定位。

step 1: find tomcat $pid

 ps -ef | grep tomcat# or jps -v

step 2: send quit signal to tomcat and tomcat will dump thread into catalina.out

 kill -3 $pid# or kill -QUIT $pid

step 3: analyse catalina.out

 tail -n 300 $CATALINA_HOME/logs/catalina.out

通过上述操作导出的线程栈信息,和java原生提供的工具jstack导出的线程栈基本上一样,接下来主要分析jstack这个工具。

Read more »

linux 命令之 iptables 篇

Posted on 2016-08-08   |   In linux

本文是关于iptables使用的一些简单说明以及例子,更详细的使用可参考鸟哥的私房菜和这篇iptables指南。

iptables数据包处理流程示意图

iptables的一些基本概念

  1. tables: raw/filter/nat/mangle/security,与本机最有关系的就是filter表,filter表是用于存放所有与防火墙相关操作的默认表。
  2. chains: 表由链组成,链是一些按顺序排列的规则的列表。默认的filter表包含INPUT,OUTPUT和FORWARD3条内建的链,这3条链作用于数据包过滤过程中的不同时间点,如上流程图所示。
  3. rules: 数据包的过滤基于rule。rule由一个target目标(数据包匹配所有条件后的动作)和很多匹配(导致该规则可以应用的数据包所需要满足的条件)指定。
  4. targe: 目标使用-j或者--jump选项指定,target常用的是ACCEPT,DROP,REJECT和LOG。

如果目标是REJECT,数据包的命运会被立刻决定,并且当前表的数据包的处理过程会停止,也就是说REJECT会拦阻该数据包,并返回数据包通知对方,可以返回的数据包有几个选择:ICMP port-unreachable、ICMP echo-reply或是tcp-reset(这个数据包会要求对方关闭连接),进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。

iptables常用参数说明

参数 说明
-P --policy 定义默认策略
-L --list 查看iptables规则列表
-A --append 在规则列表的最后增加1条规则
-I --insert 在指定的位置插入1条规则
-D --delete 从规则列表中删除1条规则
-R --replace 替换规则列表中的某条规则
-F --flush 删除表中所有规则
-Z --zero 将表中数据包计数器和流量计数器归零
-X --delete-chain 删除自定义链
-v --verbose 与-L他命令一起使用显示更多更详细的信息

rules匹配参数说明

匹配参数 说明
-i --in-interface 指定数据包从哪个网络接口进入
-o --out-interface 指定数据包从哪个网络接口输出
-p --proto 指定数据包匹配的协议,如TCP、UDP和ICMP等
-s --source 指定数据包匹配的源地址
--sport 指定数据包匹配的源端口号,结合参数-p使用
--dport 指定数据包匹配的目的端口号
-m --match 指定数据包规则所使用的过滤模块,如state
--state 数据包的状态,如ESTABLISHED
--icmp-type 后面必须要接ICMP的数据包类型,例如8

因为只有tcp和udp的数据包才有端口号,因此要使用--sport和--dport时,要加上-p tcp或-p udp参数才可执行。

过滤模块-m最常用的方式为:

Read more »

tcpdump and tshark simple tutorial

Posted on 2016-08-07   |   In linux

tcpdump和tshark是网络抓包的工具,解包可以使用wireshark来查看抓包结果,以下命令需要管理员权限。

tcpdump 命令使用举例

以下命令中部分参数说明:

  1. -D: 显示网络接口列表。
  2. -i: 设置抓包的网络接口,不设置则默认为第一个非自环接口。
  3. -w: 写入文件,再使用wireshark打开文件,进行解包分析。
  4. -r: 读取之前的使用-w写入的文件。
  5. -c: 抓取的 packet 数,在处理一定数量的 packet 后,停止抓取并退出程序。
  6. -n: 禁止所有地址名字解析。
  7. -s: 设置每个抓包的大小,默认为 65535,多于这个大小的数据将不会被程序记入内存、写入文件。
  8. -nn: 第 1 个n表示以 IP 地址的方式显示主机名,第 2 个n是以端口数字的形式代替服务名。
  9. -XX: 使用HEX和ASCII显示封包的内容。
  10. -vv: 比较详细的输出封包信息。
Read more »
1…171819…99
yuweijun

yuweijun

492 posts
12 categories
RSS
GitHub Twitter
© 2021 yuweijun
Powered by Hexo
Theme - NexT.Mist.KISS