XieJava's blog

记录最好的自己


  • 首页

  • 分类

  • 标签

  • 归档

  • 关于

Supervisor离线安装及使用

发表于 2020-05-18 | 更新于: 2025-04-08 | 分类于 技术 , 开发 | | 阅读次数:
字数统计: 2.2k | 阅读时长 ≈ 8

Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。它是通过fork/exec的方式把这些被管理的进程当作supervisor的子进程来启动,这样只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去即可。也实现当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息的,可以选择是否自己启动和报警

supervisor的安装有多种方式
配置好yum源后,可以直接安装

1
yum install supervisor

Debian/Ubuntu可通过apt安装

1
apt-get install supervisor

pip安装

1
pip install supervisor

easy_install安装

1
easy_install

这几种安装方式都需要在线联网。但大部分的生产环境都是离线环境,是封闭的网络没有办法在线安装。

这里整理了Supervisor的离线安装包和安装脚本,可以进行离线安装并能指定安装目录。

一、整理Supervisor安装需要的工具和依赖包

包括有:
setuptools
elementtree
meld3
supervisor

二、编写离线安装脚本

整体思路:依次解压并安装Supervisor所需要的工具和依赖包,将Supervisor的配置文件的默认安装目录路径替换成制定的目录路径

1
vi install_supervisor.sh
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
#!/usr/bin/env bash
function Install_Supervisor()
{
#Install supervisord
tar -zxvf setuptools-24.0.2.tar.gz 2>&1 >/dev/null
cd setuptools-24.0.2/
python setup.py install >/dev/null 2>&1
cd ..
easy_install elementtree-1.2.7-20070827-preview.zip >/dev/null 2>&1
easy_install meld3-0.6.5.tar.gz 2>/dev/null 2>&1
easy_install supervisor-3.3.0.tar.gz >/dev/null 2>&1
mkdir -p ${INSTALL_DIR}/etc/
mkdir -p ${INSTALL_DIR}/tmp/
mkdir -p ${INSTALL_DIR}/logs/
cp etc/supervisord.conf ${INSTALL_DIR}/etc/
sed -i "s#__install_dir__#${INSTALL_DIR}#g" ${INSTALL_DIR}/etc/supervisord.conf
sed -i "s#__user__#${USER}#g" ${INSTALL_DIR}/etc/supervisord.conf
ln -s /usr/bin/supervisorctl ${INSTALL_DIR}/commandctl
cp run_supervisor.sh ${INSTALL_DIR}/
sed -i "s#__install_dir__#${INSTALL_DIR}#g" ${INSTALL_DIR}/run_supervisor.sh
chmod +x ${INSTALL_DIR}/run_supervisor.sh
}

USER='root'
if [ ! -n "$1" ]; then
INSTALL_DIR='/app/supervisor'
else
INSTALL_DIR=$1
fi
Install_Supervisor

安装脚本中默认的安装路径是/app/supervisor,可以根据实际情况进行调整。

另外整理了一个run_supervisor.sh的脚本,在安装以后根据安装目录来生成这个启动脚本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/usr/bin/env bash
cd __install_dir__
if [ ! -d "tmp" ];then
mkdir tmp
else
echo "tmp文件夹已经存在"
fi
if [ ! -d "logs" ];then
mkdir logs
else
echo "logs文件夹已经存在"
fi
/usr/bin/supervisord -c __install_dir__/etc/supervisord.conf
echo "supervisord 已执行。"

三、将所有的安装包脚本等打成离线安装包

1
tar -czvf  supervisor_install_pack.tar.gz  supervisor

已打好的离线安装包下载 https://545c.com/file/21165215-443895501
城通网盘下载 https://545c.com/file/21165215-443895501
CSDN下载 https://download.csdn.net/download/fullbug/12434225

四、离线安装包使用

下载离线安包,解压

1
tar -zxvf supervisor_install_pack.tar.gz

解压后看到supervisor的目录,在supervisor的目录中找到install_supervisor.sh的脚本
supervisor离线包安装目录
执行install_supervisor.sh的脚本,默认安装/app/supervisor下,可以带参数指定安装目录。也可以修改install_supervisor.sh脚本自定义默认的安装路径。
执行完安装脚本,就可以在/app/supervisor目录下看到有相应的启动脚本、配置文件目录、日志目录及临时文件目录。
supervisor运行目录
执行run_supervisor.sh就可以启动supervisor

1
./run_supervisor.sh

五、验证和使用supervisor

ps -ef|grep supervisor 查看supervisor是否已经启动

查看supervisor是否已经启动

通过web界面的9001看web界面控制台http://127.0.0.1:9001

web界面控制台

  • supervisord
    运行 Supervisor 时会启动一个进程 supervisord,它负责启动所管理的进程,并将所管理的进程作为自己的子进程来启动,而且可以在所管理的进程出现崩溃时自动重启。
    supervisord -v 查看supervisor版本号

  • supervisorctl
    是命令行管理工具,可以用来执行 stop、start、restart 等命令,来对这些子进程进行管理。
    supervisor是所有进程的父进程,管理着启动的子进展,supervisor以子进程的PID来管理子进程,当子进程异常退出时supervisor可以收到相应的信号量。

supervisor常用管理命令
supervisorctl restart < application name> ;重启指定应用
supervisorctl stop < application name> ;停止指定应用
supervisorctl start < application name> ;启动指定应用
supervisorctl restart all ;重启所有应用
supervisorctl stop all ;停止所有应用
supervisorctl start all ;启动所有应用

六、配置文件说明

supervisor.conf配置文件

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
[unix_http_server]
file=/tmp/supervisor.sock ;UNIX socket 文件,supervisorctl 会使用
;chmod=0700 ;socket文件的mode,默认是0700
;chown=nobody:nogroup ;socket文件的owner,格式:uid:gid

;[inet_http_server] ;HTTP服务器,提供web管理界面
;port=127.0.0.1:9001 ;Web管理后台运行的IP和端口,如果开放到公网,需要注意安全性
;username=user ;登录管理后台的用户名
;password=123 ;登录管理后台的密码

[supervisord]
logfile=/tmp/supervisord.log ;日志文件,默认是 $CWD/supervisord.log
logfile_maxbytes=50MB ;日志文件大小,超出会rotate,默认 50MB,如果设成0,表示不限制大小
logfile_backups=10 ;日志文件保留备份数量默认10,设为0表示不备份
loglevel=info ;日志级别,默认info,其它: debug,warn,trace
pidfile=/tmp/supervisord.pid ;pid 文件
nodaemon=false ;是否在前台启动,默认是false,即以 daemon 的方式启动
minfds=1024 ;可以打开的文件描述符的最小值,默认 1024。注意托管ES进程,这里要进行调整至65535
minprocs=200 ;可以打开的进程数的最小值,默认 200。注意托管ES进程,这里要进行调整至4096

[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ;通过UNIX socket连接supervisord,路径与unix_http_server部分的file一致
;serverurl=http://127.0.0.1:9001 ; 通过HTTP的方式连接supervisord

; [program:xx]是被管理的进程配置参数,xx是进程的名称
[program:xx]
command=/opt/apache-tomcat-8.0.35/bin/catalina.sh run ; 程序启动命令
autostart=true ; 在supervisord启动的时候也自动启动
startsecs=10 ; 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
autorestart=true ; 程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启
startretries=3 ; 启动失败自动重试次数,默认是3
user=tomcat ; 用哪个用户启动进程,默认是root
priority=999 ; 进程启动优先级,默认999,值小的优先启动
redirect_stderr=true ; 把stderr重定向到stdout,默认false
stdout_logfile_maxbytes=20MB ; stdout 日志文件大小,默认50MB
stdout_logfile_backups = 20 ; stdout 日志文件备份数,默认是10
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile=/opt/apache-tomcat-8.0.35/logs/catalina.out
stopasgroup=false ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
killasgroup=false ;默认为false,向进程组发送kill信号,包括子进程

;包含其它配置文件
[include]
files = supervisord.d/*.ini ;默认放在安装目录的supervisord.d目录下,可以指定一个或多个以.ini结束的配置文件。

子进程配置文件

需要给托管的子进程配置相应的配置文件,每个进程的配置文件都可以单独分拆也可以把相关的脚本放一起。目录及文件后缀可以在
supervisor.conf配置文件中进行自定义。见supervisor.conf的

1
2
[include]
files = supervisord.d/*.ini #目录路径及文件后缀名都可以自定义。

logstash.ini 样例说明:

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
#项目名
[program:logstash-test]
#脚本目录
directory=/app/elk/logstash-7.6.0
#脚本执行命令
command=/app/elk/logstash-7.6.0/bin/logstash -f /app/elk/logstash-7.6.0/bin/test-pipeline.conf
#进程数
numprocs=1
#supervisor启动的时候是否随着同时启动,默认True
autostart=true
#当程序exit的时候,这个program不会自动重启,默认unexpected,设置子进程挂掉后自动重启的情况,有三个选项,false,unexpected和true。如果为false的时候,无论什么情况下,都不会被重新启动,如果为unexpected,只有当进程的退出码不在下面的exitcodes里面定义的
autorestart=false
#这个选项是子进程启动多少秒之后,此时状态如果是running,则我们认为启动成功了。默认值为1
startsecs=1
#脚本运行的用户身份
user = root
#把stderr重定向到stdout,默认 false
redirect_stderr = true
#stdout日志文件大小,默认 50MB
stdout_logfile_maxbytes = 10M
#stdout日志文件备份数
stdout_logfile_backups = 10
#日志输出
stderr_logfile=/app/elk/logstash-7.6.0/logs/logstash_test_error.log
stdout_logfile=/app/elk/logstash-7.6.0/logs/logstash_test_out.log

作者博客:http://xiejava.ishareread.com


“fullbug”微信公众号

关注:微信公众号,一起学习成长!

logstash简明实用教程

发表于 2020-04-14 | 更新于: 2025-04-08 | 分类于 技术 , 开发 | | 阅读次数:
字数统计: 3.3k | 阅读时长 ≈ 13

一、logstash是什么

Logstash 是开源的服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到您最喜欢的“存储库”中。
官方介绍:Logstash is an open source data collection engine with real-time pipelining capabilities。简单来说logstash就是一根具备实时数据传输能力的管道,负责将数据信息从管道的输入端传输到管道的输出端;与此同时这根管道还可以让你根据自己的需求在中间加上滤网,Logstash提供里很多功能强大的滤网以满足你的各种应用场景。
Logstash 能够动态地采集、转换和传输数据,不受格式或复杂度的影响。利用 Grok 从非结构化数据中派生出结构,从 IP 地址解码出地理坐标,匿名化或排除敏感字段,并简化整体处理过程。

Logstash常用于日志关系系统中做日志采集设备;
logstash
系统结构
logstash系统结构
Logstash的事件(logstash将数据流中等每一条数据称之为一个event)处理流水线有三个主要角色完成:inputs –> filters –> outputs:

输入(inpust):必须,负责产生事件(Inputs generate events),常用:File、syslog、redis、beats(如:Filebeats)
Logstash 支持 各种输入选择 ,可以在同一时间从众多常用来源捕捉事件。能够以连续的流式传输方式,轻松地从日志、指标、Web 应用、数据存储以及各种 AWS 服务采集数据。

过滤器(filters):可选,负责数据处理与转换(filters modify them),常用:grok、mutate、drop、clone、geoip
过滤器能实时解析和转换数据
数据从源传输到存储库的过程中,Logstash 过滤器能够解析各个事件,识别已命名的字段以构建结构,并将它们转换成通用格式,以便更轻松、更快速地分析和实现商业价值。

  • 利用 Grok 从非结构化数据中派生出结构
  • 从 IP 地址破译出地理坐标
  • 将 PII 数据匿名化,完全排除敏感字段
  • 简化整体处理,不受数据源、格式或架构的影响

输出(outpus):必须,负责数据输出(outputs ship them elsewhere),常用:elasticsearch、file、graphite、statsd
Logstash 提供众多输出选择,可以将数据发送到指定的地方,并且能够灵活地解锁众多下游用例

其中inputs和outputs支持codecs(coder&decoder)在1.3.0 版之前,logstash 只支持纯文本形式输入,然后以过滤器处理它。但现在,我们可以在输入 期处理不同类型的数据,所以完整的数据流程应该是:input | decode | filter | encode | output;codec 的引入,使得 logstash 可以更好更方便的与其他有自定义数据格式的运维产品共存,比如:graphite、fluent、netflow、collectd,以及使用 msgpack、

二、为什么是logstash

Logstash和Flume对比
1、Logstash比较偏重于字段的预处理,在异常情况下可能会出现数据丢失,只是在运维日志场景下,一般认为这个可能不重要;而Flume偏重数据的传输,几乎没有数据的预处理,仅仅是数据的产生,封装成event然后传输;传输的时候flume比logstash多考虑了一些可靠性。因为数据会持久化在channel中,数据只有存储在下一个存储位置(可能是最终的存储位置,如HDFS;也可能是下一个Flume节点的channel),数据才会从当前的channel中删除。这个过程是通过事务来控制的,这样就保证了数据的可靠性。
2、Logstash有几十个插件,配置比较灵活,flume强调用户自定义开发;
3、Logstash的input和filter还有output之间都存在buffer,进行缓冲;Flume直接使用channel做持久化
4、Logstash性能以及资源消耗比较严重,且不支持缓存;
Logstash和Flume对比
详见参考:https://blog.csdn.net/songfeihu0810232/article/details/94406608

三、logstash安装与配置

1、logstash安装

环境要求:jdk1.8或以上
下载logstash软件包 logstash官方下载地址https://www.elastic.co/cn/downloads/logstash
下载后直接解压就可以用
如:tar zxvf logstash-7.6.0.tar.gz
解压后目录如下:
logstash目录
目录结构说明见官方文档:https://www.elastic.co/guide/en/logstash/7.1/dir-layout.html
解压以后可以对logstash进行简单的测试。

1
bin/logstash -e 'input { stdin { } } output { stdout {} }'

这条命令表示通过命令的方式指定logstash的输入输出分别是标准的输入输出,什么是标准的输入输出呢?就是控制台的输入输出。
等待启动成功,直接输入“hello world”
将会在控制台会有相应的输出
出现这些信息就表示logstash安装成功并且可以使用了。
logstash测试

2、在线安装logstash插件

虽然logstash默认安装了大部分的插件,但是有些插件没有默认安装,如logstash-output-syslog、logstash-output-jdbc

2.1. 安装Gem并更新

1
2
3
4
5
6
# yum install -y gem
# gem -v
2.0.14.1
# gem update --system
# gem -v
3.1.2

2.2 检查并修改镜像源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# gem sources -l
*** CURRENT SOURCES ***

https://rubygems.org/

# gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/
https://gems.ruby-china.com/ added to sources
https://rubygems.org/ removed from sources

# cat ~/.gemrc
---
:backtrace: false
:bulk_threshold: 1000
:sources:
- https://gems.ruby-china.com/
:update_sources: true
:verbose: true
:concurrent_downloads: 8

请注意:国内的镜像站从https://gems.ruby-china.org 换成了 https://gems.ruby-china.com
!!!现在很多网上的资料就都是写的https://gems.ruby-china.org,导致很多人换了镜像源也装不上。

2.3. 修改 logstash的 gem 镜像源

cd到logstach的安装目录,可以看到Gemfile文件 vi Gemfile

1
2
3
4
5
6
# This is a Logstash generated Gemfile.
# If you modify this file manually all comments and formatting will be lost.

source "https://rubygems.org"
gem "logstash-core", :path => "./logstash-core"
......

更改默认的 https://rubygems.org 为https://gems.ruby-china.com

2.4、安装插件

安装插件

3、离线安装logstash插件

在实际应用过程中有些生产环境是封闭的网络环境,没法连接外网。这时候就需要离线安装插件。
说离线安装实际就是在一个有网络的环境下将插件装好,然后再装到离线环境中。
这里有两种方式,
一种就是在有网络的环境下将插件装好,将整个logsash包离线拷到生产环境。
另一种方式就是在有网络的环境下将插件装好后,将logstash的需要离线安装的插件打个离线包,然后再在生产环境进行离线安装。
离线插件包打包安装具体操作如下:

3.1 通过logstash-plugin prepare-offline-pack 命令将插件打成zip包

1
./logstash-plugin prepare-offline-pack --output logstash-output-syslog.zip logstash-output-syslog

打包
打包命令执行成功以后,可以看到在logstash的bin目录下有打成的离线插件zip包
打包后生成的离线包

3.2 通过logstash-plugin install 进行离线安装

1
bin/logstash-plugin install file:///home/logstash/logstash-7.6.2/tools/logstash-output-syslog.zip

安装后成功会有如下提示

1
2
Installing file: /home/logstash/logstash-7.6.2/tools/logstash-output-syslog.zip
Install successful

3.2 通过logstash-plugin list命令检查插件是否安装成功

logstash-plugin list

4、logstash简单配置说明

语法

Logstash 设计了自己的 DSL ——包括有区域,注释,数据类型(布尔值,字符串,数值,数组,哈希),条件判断,字段引用等。

区段(section)

Logstash 用 {} 来定义区域。区域内可以包括插件区域定义,你可以在一个区域内定义多个插件。插件区域内则可以定义键值对设置。示例如下:

1
2
3
4
input {
stdin {}
syslog {}
}

数据类型

Logstash 支持少量的数据值类型:

  • bool
    1
    debug => true
  • string
    1
    host => "hostname"
  • number
    1
    port => 514
  • array
    1
    match => ["datetime", "UNIX", "ISO8601"]
  • hash
    1
    2
    3
    4
    options => {
    key1 => "value1",
    key2 => "value2"
    }

    字段引用(field reference)

    如果想在 Logstash 配置中使用字段的值,只需要把字段的名字写在中括号 [] 里就行了,这就叫字段引用。
    对于 嵌套字段(也就是多维哈希表,或者叫哈希的哈希),每层的字段名都写在 [] 里就可以了。比如,你可以从 geoip 里这样获取 longitude 值:
    [geoip][location][0]
    logstash 的数组也支持倒序下标,即 [geoip][location][-1] 可以获取数组最后一个元素的值。
    Logstash 还支持变量内插,在字符串里使用字段引用的方法是这样:
    “the longitude is %{[geoip][location][0]}”

条件判断(condition)

表达式支持下面这些操作符:
equality, etc: ==, !=, <, >, <=, >=
regexp: =, !
inclusion: in, not in
boolean: and, or, nand, xor
unary: !()
通常来说,你都会在表达式里用到字段引用。比如:
if “_grokparsefailure” not in [tags] {
} else if [status] !~ /^2\d\d/ and [url] == “/noc.gif” {
} else {
}

命令行参数

Logstash 提供了一个 shell 脚本叫 logstash 方便快速运行。它支持一下参数:
-e
意即执行。我们在 “Hello World” 的时候已经用过这个参数了。事实上可以不写任何具体配置,直接运行 bin/logstash -e ‘’ 达到相同效果。这个参数的默认值是下面这样:
input {
stdin { }
}
output {
stdout { }
}
–config 或 -f
意即文件。真实运用中,我们会写很长的配置,甚至可能超过 shell 所能支持的 1024 个字符长度。所以我们必把配置固化到文件里,然后通过 bin/logstash -f agent.conf 这样的形式来运行。
此外,logstash 还提供一个方便我们规划和书写配置的小功能。你可以直接用 bin/logstash -f /etc/logstash.d/ 来运行。logstash 会自动读取 /etc/logstash.d/ 目录下所有的文本文件,然后在自己内存里拼接成一个完整的大配置文件,再去执行。
–configtest 或 -t
意即测试。用来测试 Logstash 读取到的配置文件语法是否能正常解析。Logstash 配置语法是用 grammar.treetop 定义的。尤其是使用了上一条提到的读取目录方式的读者,尤其要提前测试。
–log 或 -l
意即日志。Logstash 默认输出日志到标准错误。生产环境下你可以通过 bin/logstash -l logs/logstash.log 命令来统一存储日志。
–filterworkers 或 -w
意即工作线程。Logstash 会运行多个线程。你可以用 bin/logstash -w 5 这样的方式强制 Logstash 为过滤插件运行 5 个线程。

四、logstash使用的几种典型的应用场景

1、通过logstash将syslog日志原始日志转发

syslog日志原始日志转发
在logstash的bin目录下新建配置文件

1
vi test-pipeline.conf

编辑input和output

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
input {
stdin{
type => "test-log"
}
syslog{
type => "test-log"
port => 514
}
}
output
{
stdout {
codec => rubydebug
}
syslog{
host => "192.168.2.185"
port => 514
}
}

这样就相当于把日志转发到了192.168.2.185这台机器的514端口
编辑好配置文件以后执行
./logstash -f test-pipeline.conf --config.test_and_exit 对配置文件进行检查,如果配置文件写得有问题,将会有错误提示。
配置文件检查没有问题后就可以启动logstash执行了./logstash -f test-pipeline.conf --config.reload.automatic
用udpsender工具往这台机器上发送日志信息,可以看到日志转发到192.168.2.185这台机器上了。

updsend发送日志

在控制台可以看到192.168.2.185,接收到了192.168.2.173转发过来的日志
控制台日志

2、通过rsyslog、logstash采集nginx等中间件的日志送到ES

logstash可以与rsyslog、filebeat等无缝结合采集nginx等中间件日志,送给数据存储。
通过rsyslog、logstash采集nginx等中间件的日志送到ES

具体参见:https://xiejava.gitee.io/posts/f3e97829/

3、通过logstash将日志入kafka再入mysql或ES

数据先放到kafka队列里缓存削峰,然后从kafka队列里读取数据到mysql或其他存储系统中进行保存。logstash将日志入kafka再入mysql或ES
具体参见:https://xiejava.gitee.io/posts/54e4fd14/

4、通过logstash进行日志补全后再转发或入库

采集原始日志以后,需要对原始日志进行调整合补齐,比如最常见的是根据IP来补齐IP的经纬度等信息。

logstash进行日志补全

这里就可以用logstash的geotip,也可以用其他的外部API接口,为了更具代表性的说明,这里调用的是第三方的http接口(http://ip-api.com/json/),这个接口也是可以自己定义的。
参考配置文件如下:

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
input {
stdin { }
syslog {
port => "514"
}
}
filter {
grok{
#匹配获取IP
match => {"message" => "%{IPV4:ip}"}
}
http {
#调用外部接口获取IP的详细信息
url => "http://ip-api.com/json/%{ip}"
verb => "GET"
add_field => {
"new_field" => "new_static_value"
}
}
mutate {
replace => {
#这里对原始日志数据进行补全,如加了新的字段及从接口中获取的信息
"message" => "%{message}|%{ip}: My new message|%{new_field}|%{[body][as]}"
}
}
}
output {
stdout { }
syslog {
host => "192.168.2.173"
port => "7514"
}
}

通过http接口调用API取得数据,然后通过mutate重新组合补全信息,这里通过调用获取IP地址信息的API获取IP的信息,然后补全到原始日志中。
在这里插入图片描述

可以看出logstash是一个非常灵活好用的数据采集框架工具,可以通过简单的配置满足绝大多数数据采集场景的需求。


作者博客:http://xiejava.ishareread.com


“fullbug”微信公众号

关注:微信公众号,一起学习成长!

英语学渣的我是如何撸完一本英文原著的

发表于 2020-04-07 | 更新于: 2025-04-08 | 分类于 读书 | | 阅读次数:
字数统计: 2.2k | 阅读时长 ≈ 7

英语原著
2020年初立的flag就有要看完十本英文原著。看英文原著对于英语学渣的我来说几乎是很难想像的事情。说英语烂那只有自己知道,读书的时候从来就没有学好过,工作这么多年更是忘得一干二净了。与英语相爱相杀若干年,经历了无数次从开始到放弃……

非常羡慕别人能够很顺畅的看懂英文原著,能够丢开字幕看懂英语大片,能够飚一口的英文。有人说学好了英文就给自己多开了一扇了解世界的窗户,比别人多一半的人生经历。英语对于生活在全球化信息时代的我们来说有多么的重要,不用多说,道理啥的咱都知道,可是经历了这么多年还是学不会啊。买了N多的英语学习资料,下了N多的视频教程,查找了各种学习英语的方法。单词书永远都是翻了前面几页,英语学习资料屯了一堆从来没有开封过,市面上吹捧的各种英语学习方法感觉都很不错,尝试了很多种还是在尝试……

虽然有过无数次失败的经历,但也越来越认识到英语的重要性,也看到越来越多的人将英语学得很溜,让我清醒的认识到英语很重要,英语很难学,英语是一定是可以学好的,但是妄想速成是不可能的。如何才能最终习得英语的技能呢?

前新东方英语老师李笑来在他的《财富自由之路》中指出在智力上、知识上、经验上,复利效应对每个人来说都是存在的。知识和能力的习得与积累是有复利效应的。所以,大多数的人应该要相信自己能够通过知识和能力的积累和复利获得成功和成长。经过多年教训,所有什么打着21天搞定单词,一个月看懂原著啥的口号都是骗人的。在英语技能的习得上,我笃信只有坚持积累和复利才能最终成功。我坚信经过自己的努力和坚持,我在英语习得上投入的精力和时间超过成本线以后,我的英语水平将会有突破性的提高。

在英语学习的过程中有过《坚持了330天,我终于放弃了背单词》的经历,让我认识到只有“用”英语,才能够真正的掌握英语。目前我最朴素的需求就是想能够看懂英文文档,能够流畅的阅读英文书籍。而目前所处的语言环境”说”英语的需求不是很迫切。对于我来说能够流利阅读英语已经足够了。既然开始“用”英语,那就从大量开始阅读英语原版书开始吧!英语这么菜,我为什么敢挑战英文原版书呢?因为我看到了李笑来老师提到掌握一门外语的最少必要知识。
1、认识字母
2、认识音标
3、会查字典
4、懂点基本语法
5、会用百度或google等搜索引擎。
如果掌握了这些最小必要的知识,你就已经“入门”了,接下了就只剩下所谓“执行”了,也就是要用起来。
我想,这些最小必要的知识我基本都已经具备了。在正式准备看英语原著之前,我看完了全套149本《书虫》(见《看完全套149本《书虫》是种什么样的体验》)。对于英语的阅读相对来说没有那么怵了。
虽然我看完了全套149本《书虫》,但是《书虫》毕竟只是入门级的英语简写读物,与英语原版的原著还是有很大的距离的。

作为英语原著初读者来说,真正看完一本书,完成从0到1的过程,比深刻理解一本书更重要。而对于初读者来说如何撸完一本英文原著还是比较有挑战的。

首先要找到一本自己非常感兴趣并且适合自己难度的书籍。自己不感兴趣或者难度太难了,就会容易放弃。
对于挑选原版书的阅读材料来说,我也是花的一些功夫。网上有人建议刚开始接触英语原著建议是比较浅的原著如儿童读物《夏洛的网》、《格林童话》、《小王子》之类的。对于我这种成年人来说这类读物实在是提不起我的兴趣。还有人推荐《哈利波特》系列,我不是哈迷所以也没有选择《哈利波特》系列。我选择的是《奇迹男孩》。《奇迹男孩》的电影在2018年上映的时候我就想看,但是一直没有时间去看。正好买了这本英文原著来看看。《奇迹男孩》英文原著豆瓣评分9.1分,属于儿童成长类的书籍,老少皆宜,300来页长短适中不是那种大部头。因为是面向青少年的书籍所以单词不难,而且是近几年出的新书畅销书,比较口语化没有太多的长句子,非常通俗。事实证明《奇迹男孩》非常适合像我这样的英语原著初读者。
奇迹男孩

选择了阅读目标的原版书籍后,就要开始读并坚持下来
作为英语原著初读者,即使是最通俗的原版书,单词也会是一个拦路虎。单词没有办法,那就是勤查字典。《奇迹男孩》是面向青少年的书籍,单词不难,但对我来说也是充斥着各种生词。不过还好每页大概是在6、7个左右。如果按照伍君仪的《把你的词汇用起来》中的透析法,隔一个生词查一个,只查一半的生词,剩下的靠猜,那每页只要查2-3个单词左右,这个查词量已经很小了。因为这本书对我来说生词量6、7个不算多,而且作为原著初读者,猜单词的意思往往猜不准,所以我就索性看到不懂的单词每个都会查字典。为了尽快的撸完这本书,我也是给自己定了个目标,每天看30页。看少了不记得前后的情节,看多了怕自己看不下去。别看只有区区的30页,看中文也就半个小时的事情,但是看英文又要查字典,平均要花掉2-3个小时才能看完。所以对于英语原著初读者来说30页是个比较适中的量,后续如果熟练的可以慢慢的增加。这本《奇迹男孩》300多页,大概花了我一周半的时间。

对于英语原版书是看电子版的还是纸质版的,建议还是先看纸质版的
作为英语原著初读者,我自己认为还是先看纸质版。看电子版的有个好处就是可以随时查字典,尤其是用kindle看,开启生词提示,并且长按生词就会调出字典查词,非常方便。正是因为太方便了,会让我们产生依赖,有时很容易的单词还会忍不住去查一下字典。而且有时候要往回看情节翻起来也不太方便。虽然有进度显示但是没有纸质书那么直观。纸质书看起来更加有感觉,可以前后翻,有时不记得前面的情节了可以方便的随时翻看,每天看了多少页插个书签就是。看着书签慢慢的插到了最后心里还是满满的成就感。

对于英语原著初读者来说,撸完一本英文原著,完成从0到1的过程。这种小小的成就感,更加坚定了学习英语的信心。相信经过自己的努力和坚持,看完数十本英文原著以后,英语水平将会有突破性的提高。

学习外语没有其他任何捷径,唯有“结硬寨,打呆仗;日拱一卒,功不唐捐!”

我读过的英文读本豆列: https://www.douban.com/doulist/118432400/

爱分享读书豆瓣小组: https://www.douban.com/group/655112/


关注:“爱分享读书”微信公众号

“爱分享读书”微信公众号

读书我们是认真的

忘掉10000小时,如何快速获得某项技能

发表于 2020-03-28 | 更新于: 2025-04-08 | 分类于 读书 | | 阅读次数:
字数统计: 1.2k | 阅读时长 ≈ 4

一万小时定律

几乎每个人都知道1万小时定律,这个定律被人奉为圭臬。给每个渴望成功的同学们指明了方向,只要在某个领域付出不断的努力,达到10000个小时,就可以成为这方面的专家领袖。

所谓“一万小时定律”,最早出现于作家格拉德威尔《异类》一书。在书中,格拉德威尔举出了例如比尔盖茨这样的例子,言之凿凿的声称:那些天才和专家之所以卓越非凡,并非他们的天赋超人一等,而是他们付出了持续不断的努力。而任何普通人都可以达到这样的目标,只需要付出10000小时的训练即可。

这个定律非常符合大家的胃口,也有一定的道理,不怀疑在一个方向上持续不断的努力肯定会有所成功。在智力上、知识上、经验上,复利效应对每个人来说都是存在的。知识和能力的习得与积累是有复利效应的。所以,大多数的人应该要相信自己能够通过知识和能力的积累和复利获得成功和成长。

但是10000小时不是个很短的时间,如果每天投入2个半小时,那要10年才能成为专家。大多数人不用说坚持10000个小时,坚持100个小时还没有入门,就已经倒下放弃了。而对正常人现实需求来说,一万小时是成为顶尖高手的门槛,可遇而不可求。想要获得比较好的收入,能够做出较好的事情,基本上只需要超过平均水平即可。不必凡事都跟行业内最顶尖的几个人相比,但是能够超过一个行业的平均水平,也足够获取比较好的利润、回报和成绩。

对于任何一件事情、一个行业领域或者是一个学习任务而言也只有先入门了,取得了比较好的利润、回报和成绩,才会有兴趣持续的做下去,才可能有10000小时精进的努力。所以忘掉10000小时,先快速的入门达到超过行业平均水准,才能继续后面的牛逼。

那么问题来了,如何才能快速的入门呢?
李笑来的《财富自由之路》里,指出了两个关键字“最少必要知识”、”用“
当需要进入某个行业、获得某项技能的时候,一定要想办法在最短的时间里弄清楚都有哪些最小必要知识,然后迅速的掌握它们。任何人都可以完成快速入门。例如掌握一门外语的最少必要知识有哪些呢?
1、认识字母
2、认识音标
3、会查字典
4、懂点基本语法
5、会用百度或google等搜索引擎。
如果掌握了这些最小必要的知识,你就已经“入门”了,接下了就只剩下所谓“执行”了,也就是要用起来。通过用起来才能从入门到熟练。然后就要专注于改进了。
所以快速学习或快速掌握一门技能进入某个行业。无外乎就是快速的掌握最小必要的知识迅速入门,然后通过不断的用起来,在用的过程中不断的实践。逐步从入门到熟练,熟练后就可以专注创新改进而达到精进。

道理就是这么个道理,但是为什么有些人学什么东西入门就是比你快呢?
就是他已有的背景知识掌握得比你广、比你好,比如同样是学机器学习,数学系的大概率的要比计算机系的要入门快,计算机系的大概率的要比文科类专业的入门要快。因为学机器学习需要比较强的数学知识背景,虽然入门同样是要掌握那几种常用的算法,数学系的理解起来要比非数学系统理解起来要快得多。

所以要想快速进入某个行业、获得某项技能,先弄清楚这个行业都需要哪些最小必要知识,评估一下自己的背景知识的匹配度,迅速补齐掌握最小的必要知识,持续的用,不断的改进。实际上当你进入到某个行业实际上就已经补齐完善了你的背景知识。通过不断的学习,背景知识框架体系会越来越广,那你学东西会越来越快。形成一个正向循环。让你越来越牛逼!


关注:“爱分享读书”微信公众号

“爱分享读书”微信公众号

读书我们是认真的

《暗时间》读书笔记

发表于 2020-03-28 | 更新于: 2025-04-08 | 分类于 读书 | | 阅读次数:
字数统计: 2k | 阅读时长 ≈ 6

刘未鹏说——

写博客这件事情给我最大的体会就是,一件事情如果你能够坚持做8年,那么不管效率和频率多低,最终总能取得一些很可观的收益。而另一个体会就是,一件事情只要你坚持得足够久,“坚持”就会慢慢变成“习惯”。原本需要费力去驱动的事情便成了家常便饭,云淡风轻。

这本书便是从刘未鹏8年的博客文章中精选出来的,主要关于心智模式、学习方法和时间利用,《暗时间》的书名便来自于此。

《暗时间》

第一章 暗时间

善于利用思维时间的人,可以无形中比别人多出很多时间,从而实际意义上能比别人多活很多年。
学习一门专业应该是投入之间和效率的乘积。
你可以“投入”很多时间在一件事情上面,却发现毫无进展,因为你没有整天把你要做的事情,要学习的东西常驻在你的大脑中,时刻给予它最高的优先级。
如果你有做总结的习惯,你在度过一段时间之后总结自己在某某领域投入了多少时间,建议千万不要粗略地去计算有多少天下班后拿起书来翻看过,因为这样你也许会发现书倒是常翻,但领悟却不见得多深,表面上花的时间不少,收益却不见得那么大。因为看书并记住书中的东西只是记忆,并没有涉及推理,只有靠推理才能深入理解一个事物,看到别人看都不到的地方,这部分推理的过程就是你的思维时间,也是人一生中占据一个显著比例的“暗时间”,你走路、买菜、洗脸洗手、坐公车、逛街、出游、吃饭、睡觉,所有这些时间都可以成为“暗时间”,你可以充分利用这些时间进行思考,反刍和消化平时看和读的东西,让你的认识能够脱离照本宣科的层面。

第二章 设计你自己的进度条

如果没有进度提示,我们无法判断这个等待什么时候才是个尽头。如果有不断增长的进度条,那么我们对于什么时候会达到100%就会有一个粗略的估计。做事情也是同样的道理,善于规划的人,会将目标分割成一个个的里程碑,再将里程碑分割成TODO列表。
过早退出是一切失败的根源。
兴趣遍地都是,专注和持之以恒才是真正稀缺的。
靠专业技能的成功是最具可复制性的。它需要的只是你在一个领域坚持不懈地专注下午,只需要选择一个不算太靠谱的方向,然后专心致志的专下去,最后必然能成为高手或绝顶高手。
反思是让人得以改进自己的最重要的思维品质。
一生的知识积累,自学的起码占90%

第三章 如何有效地记忆与学习

你所拥有的知识并不取决于你记得多少,而在于它们能否在恰当的时候被回忆起来。
如何有效的总结知识,学以致用
1)养成习惯,经常主动回顾一段时间学到的东西。
2)创造回忆的机会
2.1)经常与别人讨论,或者讲给别人听。“教是最好的学”
2.2)整理笔记。
2.3)书写。“书写是更好的思考”
3)设身处地的“虚拟经历”别人经历过的事情。
4)抽象和推广
5)联系/比较自身的经历

第五章 学习习惯

一、学习与思考

1、Google&Wiki 遇到问题先上网搜索,自己找答案。
2、看书只看经典。
3、做读书笔记。便于回顾、加深理解
a.将自己阅读时候的思考总结下来。
b.将书中的好例子摘抄下来。
4、无时不可不思考。思考可以避免焦虑。
5、要事优先
6、重要的事情营造比较大的时间块来完成。
7、多看心理学与思维的书。
8、学习一项知识三问(a.它的本质是什么。b.它的第一原则是什么。c.它的知识结构是怎样的)
9、获得的多少并不取决于读了多少,而取决于思考了多少,多深。
10、善于利用小块时间。
11、养成好习惯。

二、时间管理

1、学习和思考过程中常问自己几个问题
a.你的问题到底是什么?(提醒自己思考不要偏离问题)
b.到现在为止,我到底有了什么收获呢?(提醒自己时不时去总结,整理学习的东西)
c.设想自己正在将东西讲给别人听。
d.时常反省和注意自己的思维过程。(将思维的大致脉络写下来是个很好的习惯)
e.养成反驳自己的想法的习惯。
f.人的思维天生就是极易流于表面来理解事物的。觉得自己理解了一个问题了吗?条件反射的问自己:你真的理解了吗?你真的理解了问题的本质吗?问题的本质到底是什么?目前我的理解是什么?我对这个理解感到满意吗?这样的理解到底有什么建设性呢?等等。
2、重视知识的本质
3、重视积累的强大力量,万事提前准备。
4、抬起头来:时不时抬起头来审视一下自己正在做的事情,自问一下有什么价值,是不是你真正希望做的。它们重要吗?你需要在这个时候学这些吗?你的时间就是你的资源,你投入这些资源来掌握知识,所以到底用来掌握哪些知识是一个很重要的问题。

三 知识结构

抓住不变量
知识分为essential(必要)和non-essential(非必要)的。对于前者提前深入掌握牢靠,对于后者采取待用到的时刻RTM(Read the manual)方法。

第八章 书写是为了更好的思考

1、书写是对思维的备忘
2、书写是对思维的缓存
3、书写是与自己的对话
4、书写是与别人的交流
如果你着自己将一些不成熟的想法写下来,看着自己写的内容,试着进一步拓展它们,就有可能在理性的道路上走得很远,很远。

第九章 为什么你从现在开始就应该写博客

用博客的形式来记录下你有价值的思考,会带来很多好处,却没有任何明显的坏处。
价值博客的几点好处
1、能交到很多志同道合的朋友。
2、书写是为了更好的思考
3、教是最好的学
4、讨论是绝佳的反思
5、激励你去持续学习和思考
6、学会持之以恒地做一件事情。
7、一个长期的价值博客是一份很好的简历。

第十二章 什么才是你的不可替代性&核心竞争力

1、专业领域技能:成为一个专业领域的专家,你的专业技能越强,在这个领域的不可替代性就越高。
2、跨领域的技能:解决问题的能力,创新思维,判断与决策能力,批判性思维能力,表达沟通能力等等。
3、学习能力:持续学习和思考
4、性格要素:专注、持之以恒、自信、自省、好奇心。等等。


关注:“爱分享读书”微信公众号

“爱分享读书”微信公众号

读书我们是认真的

你所谓的财富自由是什么?

发表于 2020-03-27 | 更新于: 2025-04-08 | 分类于 读书 | | 阅读次数:
字数统计: 1.8k | 阅读时长 ≈ 6

财富自由

实现财富自由是现如今大部分人的理想。不管是加班工作赚钱也好,搞刚需副业也好,还是创业做投资也好都是为了一个目的实现财富自由。有些人早早的就已经实现了财富自由,有些人一辈子也没有实现财富自由,更多的人则是在追求财富自由的路上。

看过《穷爸爸富爸爸》的人都知道财富自由是指你无须为生活开销而努力为钱工作的状态。简单地说,你的资产生的被动收入必须至少等于或超过你的日常开资–这是我们大多数人向往的状态。这个定义非常清晰,大多数的人都认同这种说法。但是对我来说感触最深的还是李笑来老师在他的《财富自由之路》里面的定义:“个人财富自由,是指某个人再也不用为了满足生活必须而出售自己的时间了”。这是多么深刻的认识啊,你加班工作也好,副业也好不都是在出售自己的时间获得财富吗?即使是创业做投资本质上也是在出售自己的时间,是在购买别人的时间再出售出去,只是有可能这样出售自己时间的效率更高而已。

李笑来老师在对时间的理解、对心智的认识,对学习的认识、对成长的认识,我觉得都非常的深刻。有人说他的书是鸡汤,但是他总是可以用非常浅显深刻的道理让你心甘情愿的干了这碗鸡汤还回味无穷。他的《财富自由之路》就是这么一本书。

《财富自由之路》

我们要的自由,其本质不是财富,财富只是工具:我们要的自由,本质上是时间的自主权。所以个人财富自由,是指某个人再也不用为了满足生活必须而出售自己的时间了。

如何才能让自己财富自由呢?一个世人皆知的道理就是积累和复利。

爱因斯坦曾经说过:复利是“世界第八大奇迹”。知之者赚,不知之者被赚。但是复利并不是凭空来的,你得现有成本的积累,积累越大复利的效果随着时间的推移效果会越来越显著。

对于资产投资者来说,如果你的投资收益如果是正的话,你不断的积累复投,若干年后你的财富增长将相当的可观。如果天生有个好爹可以继承财富,那么你起点就比别人高,可以通过财富的复利实现自由。但是大多数人没有爹可以拼,没有大笔财富可以继承。不过万幸并且公平的是,在智力上、知识上、经验上,复利效应对每个人来说都是存在的。知识和能力的习得与积累是有复利效应的。所以,大多数的人应该要相信自己能够通过知识和能力的积累和复利获得成功和成长。

复利曲线

一切有意义的成长过程都符合那个“复利曲线”。起初看来斜率突然发生变化的“点”,叫做“拐点”。如果作为一个投资者,你的投资是正利率,那么你的资产变化情况也符合这个有拐点、突破了成本线的、后端急速上扬的“复利曲线”。

如果没有资产可以继承,那就持续积累知识和能力吧。这是大多数人可以成功实现财富自由并且一定能成功的可靠路径。关注成长,而不是成功,因为当你的成长线终于穿越成本线时,你事实上已经成功了,可那肯定不是终点。因为如果你不成长了,有可能这个成长线还会往下掉,将你的成功的成果吞噬。

既然”复利曲线”那么有效,那为什么还有那么多人在成本线下苦苦挣扎,没有碰到所谓的拐点,更不用说什么财富自由了。这里要注意几个被容易忽视的东西,那就是“投入方向”、“沉没成本”、“利润”,“贬值”。

  • 投入方向

如果方向有问题,那么你的努力就是南辕北辙,越努力离成功距离越远,那就谈不上什么积累和复利了。比如现在一个行业已经日落西山了要消亡,你还在这个行业傻傻的坚持努力。基本上是不可能成功的。

  • 沉没成本

当你选择了一个正确的方向,经过了一段时间的努力,取得了一点小小的成绩,但是你停止了放弃了。在积累和复利之前就投降放弃了,以前的努力付出就成了沉没成本。

一个切身体会的例子,就是学英语。比如我通过一段时间的努力,看完了149本书虫,但是最近我放松了自己没有看英语了。如果还经过一段时间不坚持不努力,那我以前积累的这些单词什么的又会忘了。以前的努力将会白费了变成了“沉没成本”。

今天搞搞这个、明天搞搞那个,很多的努力就变成了沉没成本。回头一看,啥都没有积累更谈不上有复利了。所以如果要实现“复利曲线”。坚持和积累非常重要。

  • 利润

复利复利,没有利润怎么能复利呢。利润高的复利效果更加明显,这个道理傻瓜都知道。所以说坚持做一件事情要考虑利润,也就是投入产出比。

比如花大量的时间放在看肥皂剧、刷社交软件上,这些事情不能让你成长或让你的能力提升有限,那对你能力成长产生复利的效果当然有限啊。

  • 贬值

作为资本投资来说要考虑货币贬值,作为知识和能力的习得者来说要考虑知识的贬值。大家都知道计算机技术发展速度迅速,很多技术很快随着科技发展迅速的淘汰贬值。比如以前的CGI 、ASP、VB 等开发语言和技术现在都很少用了。那以前花精力学的这些知识都大幅度贬值了。当然有些知识和技能的贬值速度慢一些,比如通识知识、英语、驾驶、写作等。你赚钱的速度要大于你花钱的速度,你的资本才会有所以积累,有积累才有复利的可能。所以你的学习新知识的速度应该要大于知识贬值速度,你的知识和能力才会有积累和复利的可能。

用正确的方式做正确的事情,你一定会变得更好!

若长期持续用正确的方法做正确的事情,你的未来一定会很伟大!


博客:http://xiejava.ishareread.com/


“fullbug”微信公众号

关注:微信公众号,一起学习成长!

syslog日志接口调试方法

发表于 2020-03-18 | 更新于: 2025-04-08 | 分类于 技术 , 开发 | | 阅读次数:
字数统计: 538 | 阅读时长 ≈ 1

日志数据采集,比较方便常用的就是通过syslog来进行数据采集,syslog可以通过udp协议来进行高效的数据传输。一般来说在工程实施的过程中需要对接对端系统的数据采集源可以通过以下步骤来进行syslog日志接口的调试。主要是验证syslog日志是否能正常送到指定的日志服务器的指定端口,日志服务器的指定端口是否能正常收到对端发过来的日志。

1、检查双方网络是否通畅

网络通畅是所有网络连接的前提条件,可以先通过ping的方式,先确认一下对端数据源是不是可以ping通这边的日志接收服务器地址,看网络是否是通的。
一般来说只到对端能够ping通日志服务器地址就可以了,单向ping通就OK。
如果ping不通,那就要检查日志服务器的网络设置,如是否开启了防火墙,禁ping了。根据网络实际情况调整网络策略,确保网络是通的。

2、检查端口是否通畅

通过数据源服务器telnet一下日志服务器地址和端口,看端口是不是通的。
有很多服务器上可能没有装telnet,也可以用ssh ip 端口 来验证一下。

3、发送简单的报文测试

在对端通过发送udp报文来进行简单的测试
如日志接收服务器地址是172.28.65.32,端口514 则可以通过echo “hello” > /dev/udp/172.28.65.32/514 来发送测试报文
在日志接收服务器用tcpdump收下有没有监听到报文过来。

1
tcpdump udp port 514 -A -i any

如果有就会有相应的显示
tcpdump

4、进行正式接口对接

如果tcpdump可以收到日志,那就说明syslog的通信是没有问题的,接下来就可以进行具体的syslog的配置的调测了。


作者博客:http://xiejava.ishareread.com


“fullbug”微信公众号

关注:微信公众号,一起学习成长!

logstash集成kafka,mysql实现数据采集

发表于 2020-03-16 | 更新于: 2025-04-08 | 分类于 技术 , 开发 | | 阅读次数:
字数统计: 1.3k | 阅读时长 ≈ 5

logstash是一个非常灵活好用的数据采集框架工具,可以通过简单的配置满足绝大多数数据采集场景的需求。
采集数据一个非常典型的场景就是将数据先放到kafka队列里削峰,然后从kafka队列里读取数据到mysql或其他存储系统中进行保存。
从syslog采集日志到kafka然后在从kafka写到mysql数据库中
本文通过一个简单的示例来演示从syslog采集日志到kafka然后在从kafka写到mysql数据库中。
默认已经安装好了kafka、mysql、logstash,并已经经过简单的验证。

准备logstash的环境

一、下载mysql的jdbc驱动包

下载地址:https://mvnrepository.com/artifact/mysql/mysql-connector-java/8.0.15
下载后放到logstash的安装目录的/vendor/jar/目录下

二、安装logstash插件

logstash默认安装了kafka插件,但是mysql插件没有默认安装需要自己安装。
具体安装方法 /bin/logstash-plugin install logstash-output-jdbc ,这里应为要用到logstash写入mysql数据库,所以安装的插件是logstash-output-jdbc,如果要用到从mysql读数据,那么就要安装logstash-input-jdbc。安装方法类似。
因为安装时需要访问国外的源,安装进度很慢很慢,还经常安装不成功,所以需要更改国内的源。
也就是给 Ruby 换成国内的镜像站:https://gems.ruby-china.com/,替代https://rubygems.org。*请注意:国内的镜像站从https://gems.ruby-china.org 换成了 https://gems.ruby-china.com !!!* 现在很多网上的资料就都是写的https://gems.ruby-china.org,导致很多人换了镜像源也装不上。
具体方法如下:

1. 安装Gem并更新

1
2
3
4
5
6
# yum install -y gem
# gem -v
2.0.14.1
# gem update --system
# gem -v
2.7.7

2. 检查并修改镜像源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# gem sources -l
*** CURRENT SOURCES ***

https://rubygems.org/

# gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/
https://gems.ruby-china.org/ added to sources
https://rubygems.org/ removed from sources

# cat ~/.gemrc
---
:backtrace: false
:bulk_threshold: 1000
:sources:
- https://gems.ruby-china.org/
:update_sources: true
:verbose: true

请注意:国内的镜像站从https://gems.ruby-china.org 换成了 https://gems.ruby-china.com !!!现在很多网上的资料就都是写的https://gems.ruby-china.org,导致很多人换了镜像源也装不上。

3. 修改 logstash的 gem 镜像源

cd到logstach的安装目录,可以看到Gemfile文件

1
2
3
4
5
6
7
# vi Gemfile
# This is a Logstash generated Gemfile.
# If you modify this file manually all comments and formatting will be lost.

source "https://rubygems.org"
gem "logstash-core", :path => "./logstash-core"
......

更改默认的 https://rubygems.org 为https://gems.ruby-china.com
更换国内镜像源地址

4. 安装 logstash-output-jdbc

1
2
3
4
#/bin/logstash-plugin install logstash-output-jdbc
Validating logstash-output-jdbc
Installing logstash-output-jdbc
Installation successful

5.查看插件是否安装成功

在logstash的bin目录下执行./logstash-plugin list 可以查看已经安装的插件,可以看到logstash-output-jdbc的插件已经装好。
检查插件安装

配置logstash

新建一个pipline.conf的配置文件

1
vi test-pipeline.conf

文件内容如下:

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
input {
stdin{ #用于测试标准控制台输入的数据
type => "test-log"
}
syslog{ #用于接收来自syslog的日志
type => "test-log"
port => 514
}
kafka {
bootstrap_servers => "172.28.65.26:9092" #kafka服务器地址
topics => "test1" #kafka订阅的topic主题
codec => "json" #写入的时候使用json编码,因为logstash收集后会转换成json格式
consumer_threads => 1
decorate_events => true
add_field => {
"logsource" => "kafkalog"
}
}
}
output
{
if ([type]=="test-log" and "kafkalog" not in [logsource]) {
kafka {
codec => json
topic_id => "test1"
bootstrap_servers => "172.28.65.26:9092"
batch_size => 1
}
}
if ([type] == "test-log" and "kafkalog" in [logsource]) {
jdbc {
driver_jar_path => "/opt/elk/logstash-7.6.0/vendor/jar/jdbc/mysql-connector-java-8.0.15.jar"
driver_class => "com.mysql.jdbc.Driver"
connection_string => "jdbc:mysql://172.28.65.32:3306/testdb?user=yourdbuser&password=yourpassword"
statement => [ "INSERT INTO test_nginx_log (message) VALUES(?)", "message"]
}
}
stdout {
codec => rubydebug
}
}

这个逻辑就是从stdin或syslog接收数据output到kafka,然后从kafka中取出数据加入了一个logsource的字标识是从kafka过来的数据,然后又output到 jdbc写到mysql中去。
如果没有这几个if的逻辑判断,那么就会是个死循环。从kafka读同样的数据又写到kafka中。如果在两台机器上装有logstash一台取数据放到kafka,一台从kafka中取数据放到mysql中就可以不用加这样的判断逻辑会单纯简单一些。

执行logstash并查看效果

通过在logstash安装目录下执行 bin/logstash -f test-pipeline.conf –config.test_and_exit 检查配置文件是否有问题,没有问题以后执行bin/logstash -f test-pipeline.conf –config.reload.automatic 运行logstash。
在控制台输入

1
this is a test!

效果:
从控制台输入信息,可以看到从stdin输入output到stdout的没有logsource标识,input从kafka订阅过来的信息加了一个logsource=>kafkalog的标识。
logsource=>kafkalog的标识
用kafka tool工具看到kafka收到了从stdin发过来的信息。
用kafka tool工具看到kafka收到了从stdin发过来的信息
在看MySQL表里的数据,已经通过logstash从kafka中将数据采集到了MySQL的表中。
MySQL的表的信息数据
再来看从syslog采集日志的效果
从控制台看到的信息效果
控制台看到的信息效果
从kafka tool看到的效果
kafka tool看到的效果
从mysql 表中看到的效果。
mysql 表中看到的效果
可以看到,logstash是一个非常灵活好用的数据采集框架工具,可以通过简单的配置就能满足绝大多数数据采集场景的需求。


作者博客:http://xiejava.ishareread.com


“fullbug”微信公众号

关注:微信公众号,一起学习成长!

解决Hexo博客模板hexo-theme-next的翻页按钮不正常显示问题

发表于 2020-03-10 | 更新于: 2025-04-08 | 分类于 技术 , 开发 | | 阅读次数:
字数统计: 347 | 阅读时长 ≈ 1

用Hexo搭了个Gitpage的博客,兴冲冲的发了11篇博文后发现翻页按钮不正常显示,显示为<i class="fa fa-angle-right"></i>的HTML编码。如下图:
HTML编码
<i class="fa fa-angle-right"></i>这是个什么鬼?
这是一个Font Awesome的字体图标,按道理来说这个图标应该可以正常显示的,现在这个图标不能显示了显示成了html源码。
Font Awesone图标
解决办法:
最简单的办法就是将<i class="fa fa-angle-right"></i>这个不能正常显示的字体图标改成一般的字符,我这里就是改成正常的一般左右键字符“>”,“<”。
在 themes\hexo-theme-next\layout_partials 下找到hexo-theme-next的翻页组件,就是pagination.swig
将

1
2
3
4
5
6
7
8
9
10
11
{% if page.prev or page.next %}
<nav class="pagination">
{{
paginator({
prev_text: '<i class="fa fa-angle-left"></i>',
next_text: '<i class="fa fa-angle-right"></i>',
mid_size: 1
})
}}
</nav>
{% endif %}

改成

1
2
3
4
5
6
7
8
9
10
11
{% if page.prev or page.next %}
<nav class="pagination">
{{
paginator({
prev_text: '<',
next_text: '>',
mid_size: 1
})
}}
</nav>
{% endif %}

重新发布以后可以看到翻页按钮可以正常显示了
正常显示箭头


作者博客:http://xiejava.ishareread.com

通过filebeat、logstash、rsyslog采集nginx日志的几种方式

发表于 2020-03-09 | 更新于: 2025-04-08 | 分类于 技术 , 开发 | | 阅读次数:
字数统计: 1.7k | 阅读时长 ≈ 6

由于nginx功能强大,性能突出,越来越多的web应用采用nginx作为http和反向代理的web服务器。而nginx的访问日志不管是做用户行为分析还是安全分析都是非常重要的数据源之一。如何有效便捷的采集nginx的日志进行有效的分析成为大家关注的问题。本文通过几个实例来介绍如何通过filebeat、logstash、rsyslog采集nginx的访问日志和错误日志。

大家都知道ELK技术栈是采集、分析日志的利器。所以这里介绍的是从nginx采集日志到ES。当然至于日志采集以后存到看大家的需要。通过logstash可以方便的配置日志输出存储的方式。

一般来说nginx默认安装后,日志文件在 /usr/local/nginx/logs 目录下。分别有 access.log和error.log 访问日志和错误日志。
这次示例Elasitcsearch是三个节点组成的集群172.28.65.22、172.28.65.23、172.28.65.24,172.28.65.30 是kibana的地址,172.28.65.32是数据采集服务器,上面装有logstash、nginx、 filebeat。一般来说采集服务器上有logstash,而nginx、 filebeat应该是装在采集目标上。

一、直接通过filebeat采集日志到ES

filebeat到ES
在filebeat的安装目录找到filebeat.yml 配置获取日志文件的路径及输出到ES的配置。
具体:

1
2
3
4
5
6
7
8
- type: log
# Change to true to enable this input configuration.
enabled: true
# Paths that should be crawled and fetched. Glob based paths.
paths:
#- /var/log/*.log
- /usr/local/nginx/logs/*.log
#- c:\programdata\elasticsearch\logs\*

filebeat.yml配置
如果需要在kibana中友好显示的化,可进行kibana配置
kibana配置
输出到es中,在hosts中配置好你的ES服务地址。如果单机只有一个节点,就可以只配一个ip和端口。
filebeat.yml配置中配置es
启动filebeat 进行日志数据采集

1
./filebeat -e -c filebeat.yml -d "publish"

通过elasticsearch-head插件查看es索引中的日志信息
elasticsearch-head插件查看es索引
可以看到nginx中的access.log和error.log的日志都已经上来了。
在kibana中通过filebeat-*过滤看filebeat的索引,可以看到通过filebeat采过来的数据。

kibana中通过filebeat-*过滤看filebeat的索引
这种直接通过filebeat直接对接ES采日志的方式简单直接,但是无法对采集的日志进行预处理和其他一些操作,也不够灵活。
可以在filebeat 和 ES之间加一层Logstash,可以将filebeat于ES解耦,通过Logstash可以做一些预处理,也可以通过Logstash采集到除ES以外的其他数据存储上。

二、通过filebeat采集日志到logstash再送到ES

通过filebeat采集日志到logstash再送到ES
首先得安装 logstash ,安装完后在logstash的安装目录下新建vi filebeat-pipeline.conf
filebeat-pipeline.conf的具体配置如下:

1
2
3
4
5
6
7
8
9
input {
beats {
port => "5044"
}
}
output {
elasticsearch { hosts => ["172.28.65.24:9200"] }
stdout { codec => rubydebug}
}

input配置表示通过5044端口接收beats的数据
output配置表示输出到elasticsearch,并且同时输出到标准输出也就是控制台。
然后通过命令

1
bin/logstash -f filebeat-pipeline.conf --config.reload.automatic

应用filebeat-pipeline.conf启动logstash。
应用filebeat-pipeline.conf启动logstash
启动以后可以看到logstash的启动日志5044端口的服务已经起了,可以接受通过filebeat通过5044端口传过来的数据了。
接下来配置filebeat
在filebeat的安装目录找到filebeat.yml 配置获取日志文件的路径及输出到logstash的配置。不直接输出到ES了。
具体配置如下:
将output.elasticsearch的配置屏蔽
配置output.logstash,配置正确的logstash的服务主机和端口
配置output.logstash
启动filebeat 进行日志数据采集

1
./filebeat -e -c filebeat.yml -d "publish"

我们访问nginx服务提供的web服务http://172.28.65.32/
在logstash的控制台 可以看到相应的访问access.log 日志
logstash的控制台 可以看到相应的访问access.log 日志
同时在ES 中也可以看到有相应的日志数据
在ES 中也可以看到有相应的日志数据

三、直接通过rsyslog采集日志到logstash在送到ES

在很多情况下你需要采集的web服务器并不是自己能够控制的,不是说你想装filebeat就可以让你装的,这时候就可以要求目标数据源通过 syslog 的方式将日志发出来。我们可以再通过 logstash送到ES或其他的日志存储处理平台。
直接通过rsyslog采集日志到logstash在送到ES
通过syslog往日志服务器上发nginx的日志有两种方式,一种就是利用nginx的配置往外发日志,一种就是通过配置linux的rsyslog的配置往外发日志。

通过nginx配置发送syslog到logstash

参考见nginx官方文档:http://nginx.org/en/docs/syslog.html
具体配置如下:
在nginx的配置文件nginx.conf中
在server下配置access_log和error_log的输出方式

1
2
access_log syslog:server=172.28.65.32:514,facility=local7,tag=nginx_access_log,severity=info;
error_log syslog:server=172.28.65.32:514,facility=local7,tag=nginx_error_log,severity=info;

nginx.conf配置
配置完成后执行 ./nginx -s reload 使配置生效。这样就通过linux的rsyslog服务将nginx的日志往外发了。
接着来配置logstash的syslog的服务接收配置 。在logstash的安装目录下新建vi syslog-pipeline.conf
syslog-pipeline.conf的具体配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
input {
syslog{
type => "system-syslog"
port => 514
}
}
output {
elasticsearch {
hosts => ["172.28.65.24:9200"]
index => "system-syslog-%{+YYYY.MM}"
}
stdout { codec => rubydebug}
}

input配置表示通过514端口接收syslog的数据
output配置表示输出到elasticsearch,并且同时输出到标准输出也就是控制台。
通过执行 bin/logstash -f syslog-pipeline.conf --config.reload.automatic 启动logstash
可以看到logstash启动以后开启了514端口的tcp和upd协议的侦听
可以看到logstash启动以后开启了514端口的tcp和upd协议的侦听。
我们访问nginx服务提供的web服务http://172.28.65.32/
在logstash的控制台 可以看到相应的nginx访问access和error的日志
logstash的控制台可以看到相应的nginx访问access和error的日志
同样通过Elasticsearch-head在ES 中也可以看到有相应的日志数据
通过Elasticsearch-head在ES 中也可以看到有相应的日志

通过配置rsyslog发送syslog日志到logstash

有些老版本的nginx不支持配置syslog输出日志,或者说我想输出其他不是nginx的日志该怎么办呢?可以通过直接配置rsyslog的方式来往外发送日志。
在/etc/rsyslog.conf 中配置

1
$IncludeConfig /etc/rsyslog.d/*.conf

/etc/rsyslog.conf
意思是可以引用外部的配置文件,引用外部的配置文件一方面可以不影响主配置文件,另一方面也比较好管理
在/etc/rsyslog.d目录下新建nginx-log.conf
配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ModLoad imfile
$InputFilePollInterval 1
$WorkDirectory /var/spool/rsyslog
$PrivDropToGroup adm

##Nginx访问日志文件路径,根据实际情况修改:
$InputFileName /usr/local/nginx/logs/access.log
$InputFileTag nginx-access:
$InputFileStateFile stat-nginx-access
$InputFileSeverity info
$InputFilePersistStateInterval 25000
$InputRunFileMonitor

##Nginx错误日志文件路径,根据实际情况修改:
$InputFileName /usr/local/nginx/logs/error.log
$InputFileTag nginx-error:
$InputFileStateFile stat-nginx-error
$InputFileSeverity error
$InputFilePersistStateInterval 25000
$InputRunFileMonitor

*.* @172.28.65:514

配置好了以后,重启rsyslog服务

1
systemctl restart rsyslog

我们访问nginx服务提供的web服务http://172.28.65.32/
在logstash的控制台 可以看到同样的效果。
logstash的控制台

本文介绍了如何通过filebeat、logstash、rsyslog采集nginx的访问日志和错误日志的几种方式,具体需要根据实际情况灵活的运用。


作者博客:http://xiejava.ishareread.com


“fullbug”微信公众号

关注:微信公众号,一起学习成长!

<1…181920>
XieJava

XieJava

200 日志
11 分类
25 标签
RSS
GitHub
友情链接
  • 爱分享读书
  • CSDN
  • 豆瓣
© 2025 XieJava | Site words total count: 415.3k

主题 — NexT.Muse
0%