sylar高性能服务器
sylar高性能服务器
一、项目依赖
遇到的问题
环境搭建与网络配置
环境搭建:
vs远程连接linux服务器,之前在物理机上实现过,很多配置都还保留着,但相交之前云里雾里邯郸学步一步一步跟着点鼠标,先在多了几分自己的思考,为什么这一步要这么做。
gcc,gdb与vscode的联动作用与安装
网络配置:
虚拟机三种联网方式,桥接,nat原理
Linux系统更新迭代,发行版不同,版本变动不同 ubuntu,centos,redhat,kali 命令繁杂,不一而足,早先版本修改网络是修改ens33文件,将静态路由写进去重启网络即可,现今配置变的更加系统灵活,但也使得出现问题更难排错。
netplan
解决配网 ip 0~255=这种常识性问题,编译不过:严格缩进;编译过了但是ping不通,首先怀疑ip冲突,先改为dhcp自动分配然后根据给定的ip重新写进,依旧无法ping通外网但,主机能ping到,也能通过ssh登陆,怀疑是网关出了问题,于是再次改成dhcp连接,然后用route查看当前网关,将其记录并改正静态路由的配置,成功ping通。
二、日志模块
遇到问题
log4j日志系统的调试

解决:unubtu20.4安装log4j开源日志系统_apache-log4cxx-CSDN博客
安装apr与apr-utils ---> 安装log4j
APR(Apache portable Run-time libraries,Apache可移植运行库),主要为上层的应用程序提供一个可以跨越多操作系统平台使用的底层支持接口库。
安装apr
tar xzvf apr-1.6.3tar.gz
cd apr-1.6.3
./configure --prefix=/usr/local/apr-1.6.3
sudo make
sudo make install
安装apr-utils
tar xzvf apr-util-1.6.1.tar.gz
cd apr-util-1.6.1
./configure --prefix=/usr/local/lib/apr-util-1.6.1 --with-apr=/usr/local/lib/apr-1.6.3
sudo make
sudo make install
出现错误:

解决方案:
Ubuntu:apt-get install libexpat1-dev 安装完之后,编译即可通过
安装log4j
tar -xvf apache-log4cxx-0.11.0.tar.gz
cd apache-log4cxx-0.11.0
./configure --prefix=/usr/local/log4c-0.11.0 --with-apr=/usr/local/lib/apr-1.6.3 --with-apr-util=/usr/local/lib/apr-util-1.6.1 #分别为设置apr和apr-util的连接路径
sudo make
sudo make install
出现错误

排错:安装automake libtool
tar -xvf automake-1.16.tar.gz
cd automake-1.16
./configure
make
sudo make install
出现错误:

//./configure 后面似乎一定要带上一个地址,那么模仿之前的地址尝试以下
//不行,依旧报同样的错误,那么不是这个错误,仔细分析一下错误:
configure: error: Autoconf 2.65 or better is required.
Please make sure it is installed and in your PATH.
解决方案: 缺少环境
Ubuntu20.04安装autoconf-2.69版本 - 知乎 (zhihu.com)
Ubuntu20.04安装m4 - 知乎 (zhihu.com)
wget ftp://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz
wget https://ftp.gnu.org/gnu/m4/m4-1.4.6.tar.gz
检查autoconf版本

问题解决,继续安装automake和libtool
tar -xvf libtool-2.4.6.tar.gz
cd libtool-2.4.6
./configure
make
sudo make install
此时再conf与make都正常,问题解决
再安装log4j
但是出现错误:版本不匹配,因为官网只有libtool253版本,与lib246不一致
尝试修改url,用 wget https://ftpmirror.gnu.org/libtool/libtool-2.5.3.tar.gz 下载成功
//卸载原先的libtool253
//dpkg --get-selections | grep ‘软件相关名称’
//sudo apt-get purge 一个带core的package,如果没有带core的package,则是情况而定。
//清理残留数据
//dpkg --get-selections | grep ‘软件相关名称’
//dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P
//重新安装lib246之后,再尝试安装log4j,不行,没卸载干净,依旧识别为253
//Version mismatch error. This is libtool 2.4.6 Debian-2.4.6-9, but the
//libtool: definition of this LT_INIT comes from libtool 2.5.3.
百度后查到解决方案: autoreconf -fiv // -f, --force || -i, --install || -v, --verbose
autoconf是一个用于生成可以自动地配置软件源码包,用以适应多种UNIX类系统的shell脚本工具,其中autoconf需要用到 m4,便于生成脚本。automake是一个从Makefile.am文件自动生成Makefile.in的工具。
解剖automake和autoconf(autoreconf) - 简书 (jianshu.com)
历经千辛万苦,终于将log4j安装完成了
log4j
【【java】20分钟搞清log4j/logback/log4j2/slf4j || 如何统一日志标准】https://www.bilibili.com/video/BV11J411d7Gp?vd_source=487c7846405d2bc3e59527ec56ecc990

因为实现各自有各自的不同,如果一个框架引入很多依赖,每个依赖又用不同日志的具体实现,就会导致
框架在配置日志的时候非常麻烦与混乱,所以便引入了门面接口。
demo ---- log4j

demo --- logback

已知主流的logback的logger是slf4j里的logger,默认就已经实现slf4j标准,而log4j没有默认实现
问题:如何将基础库升级到slf4j标准 ---- 引入依赖

项目实例分析: 每一个都可以单独运行,且无需指定配置文件,指定依赖则就近原则

同时使用时,slf不知道究竟使用哪一个作为真正的日志打印实现类,于是给出警告

并且,在最后选择了 log4j,原因是根据类加载的先后顺序,因为log4j先加载,所以先绑定

那么,如何绑定指定类,比如就要logback,而且我们并不知道logback是否是第一个被加载的类

再则,如果log4j并没有实现slf标准,那么如何统一应用指定类,使得log4j强行使用slf标准呢?

剔除掉log4j依赖,补一个log4j-over-slf4j依赖
log4j高危漏洞分析
影响:世界规模最大采用java/log4j的游戏 MC服务器大面积崩盘
大概的执行逻辑:
黑客在自己的客户端启动一个带有恶意代码的rmi服务,通过服务端的log4j的漏洞,向服务端的jndi context lookup的时候连接自己的rmi服务器,服务端连接rmi服务器执行lookup的时候会通过rmi查询到该地址指向的引用并且本地实例化这个类,所以在类中的构造方法或者静态代码块中写入逻辑,就会在服务端(jndi rmi过程中的客户端)实例化的时候执行到这段逻辑,导致jndi注入。

看起来挺像sql注入的,jndi注入后,在对方服务器里执行,导致服务器宕机
log4j主要包括以下几个模块
1、Category对应日志类别
2、Category的setPriority()方法设置日志级别
3、Appender表示日志输出地,可以细分为OstreamAppender和FileAppender等不同类型
4、PatternLayout表示日志的格式
- PatternLayout和Appender绑定,Priority和Category绑定,一条日志经过Category判断级别通过后由Appender输出,Appender输出的格式由PatternLayout指定。
Sylar日志模块设计
日志级别,参考log4cpp
enum Level {
FATAL = 0, // 致命情况,系统不可用
ALERT = 100, // 高优先级情况,例如数据库系统崩溃
CRIT = 200, // 严重错误,例如硬盘错误
ERROR = 300, // 错误
WARN = 400, // 警告
NOTICE = 500, // 正常但值得注意
INFO = 600, // 一般信息
DEBUG = 700, // 调试信息
NOTSET = 800, // 未设置
};
几个关键的类:
class LogFormatter;
class LogAppender;
class Logger;
class LogEvent;
class LogEventWrap;
class LogManager;
关于这几个类的设计如下:
LogFormatter: 日志格式器,与log4cpp的PatternLayout对应,用于格式化一个日志事件。该类构建时可以指定pattern,表示如何进行格式化。提供format方法,用于将日志事件格式化成字符串。
LogAppender: 日志输出器,用于将一个日志事件输出到对应的输出地。该类内部包含一个LogFormatter成员和一个log方法,日志事件先经过LogFormatter格式化后再输出到对应的输出地。从这个类可以派生出不同的Appender类型,比如StdoutLogAppender和FileLogAppender,分别表示输出到终端和文件。
Logger: 日志器,负责进行日志输出。一个Logger包含多个LogAppender和一个日志级别,提供log方法,传入日志事件,判断该日志事件的级别高于日志器本身的级别之后调用LogAppender将日志进行输出,否则该日志被抛弃。
LogEvent: 日志事件,用于记录日志现场,比如该日志的级别,文件名/行号,日志消息,线程/协程号,所属日志器名称等。
LogEventWrap: 日志事件包装类,其实就是将日志事件和日志器包装到一起,因为一条日志只会在一个日志器上进行输出。将日志事件和日志器包装到一起后,方便通过宏定义来简化日志模块的使用。另外,LogEventWrap还负责在构建时指定日志事件和日志器,在析构时调用日志器的log方法将日志事件进行输出。
LogManager: 日志器管理类,单例模式,用于统一管理所有的日志器,提供日志器的创建与获取方法。LogManager自带一个root Logger,用于为日志模块提供一个初始可用的日志器。
日志模块的工作流程:
-
初始化LogFormatter,LogAppender, Logger。
-
通过宏定义提供流式风格和格式化风格的日志接口。每次写日志时,通过宏自动生成对应的日志事件LogEvent,并且将日志事件和日志器Logger包装到一起,生成一个LogEventWrap对象。
-
日志接口执行结束后,LogEventWrap对象析构,在析构函数里调用Logger的log方法将日志事件进行输出。

浙公网安备 33010602011771号