前言

设计思路如下

有3台机器

2台做elasticsearch的主副节点

1台做kibana和elasticsearch_head 由于机器匮乏我还在这台机器上部署了logstash和nginx服务

先说目的:将nginx的日志通过logstash收集后发送到ela,然后kibana进行展示

环境如下
elasticsearch master 10.5.2.175:9200
elasticsearch salve 10.5.2.176:9200
logstash 172.17.211.153 启动命令: nohup /usr/local/logstash/bin/logstash -f /usr/local/logstash/config/agent.conf -w 10 -l /usr/local/logstash/logs/logstash-plain.log &
nginx
es-head: 172.16.211.143:9100
kibana: 172.16.211.143:5601

架构如下:

加redis/kafa的原因:

在生产环境中,我们的日志可能会有瞬时高峰,而这个时候如果直接存入es,可能会导致es承受不住,从而影响日志的收集和查询。 一般情况下,我们会将日志存直接放到kafka或者redis这种读写性能非常高的应用中,作为一个缓存,然后通过下游组件(例如logstash)进行消费、过滤后存入ES,然后通过可视化界面查看。

ELK的工作流程

  • logstash客户端收集到日志后将日志存入到redis之类的缓存中
  • Logstash_server将数据从redis中提取出来并根据/usr/local/logstash/patterns下的文件(文件名随意取)这里叫grok-patterns里面根据不同的日志,比如apache、nginx服务规定的不同格式来进行切割,切割完毕后将日志存入到elastaicsearch中,格式里面的key vlaue值就是els中的字段和值
  • elastaicsearch对logstash_server发送过来的值进行集群保存,提供被调用接口以及快速的搜索服务(这里还可以安装分词插件,当做搜索引擎)
  • kibana对es根据条件进行搜索并对搜索到的数据进行展示,使我们看起来更加直观。

一、elasticsearch

Elasticsearch 是一个开源的搜索引擎,建立在一个全文搜索引擎库 Apache Lucene 基础之上。 Lucene 可以说是当下最先进、高性能、全功能的搜索引擎库—无论是开源还是私有。

中文文档https://www.elastic.co/guide/cn/elasticsearch/guide/current/intro.html#intro

elasticsearch的安装

需要有jdk环境
vim /etc/elasticsearch/jvm.options
2g
2g 1.vim /etc/elasticsearch/elasticsearch.yml
http.port: 9200
discovery.zen.ping.unicast.hosts: ["10.5.2.175","10.5.2.176"]
network.host: 10.5.2.175 2.vim /etc/systemd/system.conf
DefaultLimitNOFILE=65536
DefaultLimitNPROC=32000
DefaultLimitMEMLOCK=infinity 3.vim /etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536
* soft nproc 32000
* hard nproc 32000
* hard memlock unlimited
* soft memlock unlimited 4.vim /etc/sysconfig/elasticsearch
JAVA_HOME=/usr/java/jdk1.8.0_151 5.vim /usr/lib/systemd/system/elasticsearch.service
[Service]
LimitMEMLOCK=infinity

elasticsearch的问题

启动elasticsearch失败,报找不到JAVA环境,可明明系统是有的 解决方法如下:

vim /etc/sysconfig/elasticsearch
JAVA_HOME=/usr/java/jdk1.8.0_151

elasticsearch的概念

index 索引 相当于数据库里的“数据库” 他是我们存储和索引关联数据的地方

type 类数据 将一类的数据放到一起 相当于数据库中的“表”

id 相当于数据库表中的一行

  • Elastic 本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个 Elastic 实例。单个 Elastic 实例称为一个节点(node)。一组节点构成一个集群(cluster)。

  • Elastic 会索引所有字段,经过处理后写入一个反向索引(Inverted Index)。查找数据的时候,直接查找该索引。

    倒排索引(反向索引)

    原始文档

    创建倒排索引列表

    倒排索引创建索引的流程:

    1) 首先把所有的原始数据进行编号,形成文档列表

    2) 把文档数据进行分词,得到很多的词条,以词条为索引。保存包含这些词条的文档的编号信息。

    搜索的过程:

    当用户输入任意的词条时,首先对用户输入的数据进行分词,得到用户要搜索的所有词条,然后拿着这些词条去倒排索引列表中进行匹配。找到这些词条就能找到包含这些词条的所有文档的编号。

    然后根据这些编号去文档列表中找到文档

  • 所以,Elastic 数据管理的顶层单位就叫做 Index(索引)。它是单个数据库的同义词。每个 Index (即数据库)的名字必须是小写。

下面的命令可以查看当前节点的所有 Index。

$ curl -X GET 'http://localhost:9200/_cat/indices?v

index 索引 相当于数据库里的“数据库” 他是我们存储和索引关联数据的地方

type 类数据 将一类的数据放到一起 相当于数据库中的“表”

id 相当于数据库表中的一行

pertty 在网页中格式化输出响应内容

elasticsearch的操作方法

官方教程在这里,我觉得这个更加实用官方教程 https://www.cnblogs.com/chuyuan/p/11380744.html

# 增加
http://10.5.103.176:9200/database1/table1 {
"name": "doudou",
"age": 4.5,
"weight": 20,
} # 查询 # 以上方法是正确的
但是再增加一个table2的是否发生如下报错
http://10.5.103.176:9200/database1/table2
{
"name": "dianche1",
"weight": 1000
} 原因是elastic search在6.x版本调整了, 一个index只能存储一种type。

GET /atguigu/_mapping
1. 检索文档
Mysql : select * from user where id = 1
ES : GET /atguigu/doc/1
响应结果
{
"_index" : "megacorp",
"_type" : "employee",
"_id" : "1",
"_version" : 1,
"found" : true,
"_source" : {
"first_name" : "John",
"last_name" : "Smith",
"age" : 25,
"about" : "I love to go rock climbing",
"interests": [ "sports", "music" ]
}
} 2.简单检索
Mysql : select * from user
ES : GET /megacorp/employee/_search 3.全文检索
ES : GET /megacorp/employee/_search?q=haha
查询出所有文档字段值为haha的文档 4.搜索(模糊查询)
ES : GET /megacorp/employee/_search?q=hello
查询出所有文档字段值分词后包含hello的文档 5.聚合
PUT atguigu/_mapping/doc
{
"properties": {
"interests": {
"type": "text",
"fielddata": true
}
}
}

elasticsearch-head的安装

ealsticsearch只是后端提供各种api,那么怎么直观的使用它呢?elasticsearch-head将是一款专门针对于elasticsearch的客户端工具,是es的集群管理工具、数据可视化、增删改查工具。相关详细的教程在这里

1 https://www.sojson.com/blog/85.html

2 https://www.cnblogs.com/xuwenjin/p/8792919.html

3 https://blog.csdn.net/huwei2003/article/details/40581143

一、下载head插件
https://github.com/mobz/elasticsearch-head 二、解压到任意目录
注意:为避免找不到,一定要和elasticsearch的安装目录区分开 三、安装Node.js
因为head是一个Node.js项目。所以,如果没有安装nodejs需要先安装Node.js
32位安装包下载地址: https://nodejs.org/dist/v4.4.3/node-v4.4.3-x86.tar.gz
64位安装包下载地址: https://nodejs.org/dist/v4.4.3/node-v4.4.3-x64.tar.gz
检测PATH环境变量是否配置了Node.js,打开命令行输入命令"which npm",输出如下结果:
/usr/bin/npm
wget https://nodejs.org/dist/latest-v8.x/node-v8.16.0.tar.gz
tar xf node-v8.16.0.tar.gz
cd node-v8.16.0
./configure --prefix=/usr/local/node-v8.16
make -j 8 && make install
添加环境变量
vim /etc/profile
################nodejs###############
export NODE_HOME=/usr/local/node-v8.16
export PATH=$PATH:$NODE_HOME/bin
source /etc/profile
node -v
v8.16.0
npm -v
6.4.1 四、安装npm
yum install npm -y 五、es-head安装:
解压源码包:elasticsearch-head.tar.gz
启动:cd /usr/local/src/elasticsearch-head
npm run start &
访问地址是http://{你的ip地址}:9200/_plugin/head/
在浏览器中输入:这台机器的ip+端口
http://10.5.2.220:9100/

问题解决:

在elasticsearch中没有当天的索引

头一天使用过的bj日志第二天无法收集到,原因是昨天logstash已经收集过一遍,就被打过了标签,今天再使用的话,如果这个日志是不再增加的就不会被收集,因为日志中没有新的内容进来,解决方法如下:

在logstash的config文件下的agent.conf加入以下配置
start_position =>"beginning"#检查时间戳

二、kibana

语言设置

vim config/kibana.yml
i18n.locale: "en" 或者zh-CN中文
systemctl restart kibana重启即可

安装配置

重新加载systemctl配置,这个是针对centos7以上使用systemctl kibana restart命令的

systemctl daemon-reload

这里由于是二进制的安装方法,所以要设置一个systemctl start kibana.service的启动方法

1. vim /usr/lib/systemd/system/kibana.service
添加以下内容
[Unit]
Description=Kibana
After=network.target [Service]
ExecStart=/usr/local/kibana/bin/kibana
Type=simple
PIDFile=/usr/local/kibana/kibana.pid
Restart=always
#User=es 这里我直接使用root用户进行启动
#Group=es
[Install]
WantedBy=default.target 2. 重新加载一下配置文件
systemctl daemon-reload 3. 启动
systemctl start kibana.service 4. 访问测试
http://10.5.2.220:5601

查询语法

参考地址1 参考地址2 参考地址3https://blog.csdn.net/u013958257/article/details/88567581

kibana查询语法基于Lucene

Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。Lucene是一套用于全文检索和搜寻的开源程式库,由Apache软件基金会支持和提供。Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。在Java开发环境里Lucene是一个成熟的免费开源工具。就其本身而言,Lucene是当前以及最近几年最受欢迎的免费Java信息检索程序库。人们经常提到信息检索程序库,虽然与搜索引擎有关,但不应该将信息检索程序库与搜索引擎相混淆。
Lucene最初是由Doug Cutting开发的,在SourceForge的网站上提供下载。在2001年9月作为高质量的开源Java产品加入到Apache软件基金会的 Jakarta家族中

kibana在ELK阵营中用来查询展示数据

elasticsearch构建在Lucene之上,过滤器语法和Lucene相同

1. 根据某个字段查询
精确匹配: agent:"Mozilla/5.0"
如果不带双引号,只要包含指定值就可以搜索到 agent:Mozilla/5.0
如果是数值类型没有以上区别 2. 数组范围查询
[7758794 TO 7758794] 表示等于,原意思是一个区间范围
指定区间: response:[100 TO 200]
大于等于指定数值的: response:[201 TO *]
小于等于指定数值的: response:[* TO 200] 3. 从指定时间到现在/或者查询指定时间前数据
2015-05-20T09:20:41.943Z之后的数据: @timestamp:{2015-05-20T09:20:41.943Z TO *}
2015-05-20T09:20:41.943Z之前的数据: @timestamp:{* TO 2015-05-20T09:20:41.943Z }
指定时间范围: @timestamp:{2015-05-20T09:20:41.943Z TO 015-05-22T09:20:41.943Z}
备注:09:20:41事实上是17:20:41,存在8个小时差 4. 正则匹配
包含指定值: request:/uploads*/
不包含指定值: !request:/uploads*/ 5. 逻辑查询
AND(与关系数据库一样) request:/uploads*/ AND response:404
OR(与关系数据库一样) request:/uploads*/ OR response:200
组合查询: (uid OR token) AND version 6. 存在/不存在
存在host字段但不存在url字段: _exists_:host AND _missing_:url
特殊转义字符
+ – && || ! () {} [] ^” ~ * ? : \

kibana创建索引模式(手动)

https://blog.csdn.net/weixin_34727238/article/details/81540692

当在els中有了当天的索引,就可以到kibana中取创建索引模式了,只是这里提供了一手动创建的方式,无法自动进行,需要本地定义脚本的方式进行自动索引的创建。

等所有索引都创建完毕后,在下面就能看到了

然后在下面这个里面就能看到我们的索引里面的数据情况了,前提是你的logstash成功将切割后的日志发送到了els中



否则就是以下这种的

kibana创建索引模式(自动)

由于logstash客户端运行的问题,只要有当天日志产生,就会将该日志发送给elasticsearch,然后会在elasticsearch里面产生一个新的索引

方法如下:

在kibana节点上写一个脚本,然后设置定时任务执行kibana中索引与elasticsearch的关联
vim /usr/local/scripts/kibana_create_index.sh
#!/bin/bash
today=`date +%Y-%m-%d`
index_name="bj169-hc360-${today}.log"
curl -X POST -H "kbn-xsrf:reporting" -H "Content-Type: application/json" -d '{"attributes":{"title":"'$log_name'"}}' 'http://172.16.211.143:5601/api/saved_objects/index-pattern' 这里遇到一个问题,json中调用变量的问题,一直调用不到,后来各种查询原来是格式不对 json数据里变量要用''括起来
<font color=gray size=72>color=gray</font>

json数据里变量要用''括起来https://www.cnblogs.com/landhu/p/7048255.html

ELK 索引生命周期管理

问题解决

Kibana server is not ready yet出现的原因

第一点:KB、ES版本不一致(网上大部分都是这么说的)

解决方法:把KB和ES版本调整为统一版本

第二点:kibana.yml中配置有问题(通过查看日志,发现了Error: No Living connections的问题)

解决方法:将配置文件kibana.yml中的elasticsearch.url改为正确的链接,默认为: http://elasticsearch:9200

改为http://自己的IP地址:9200

第三点:浏览器没有缓过来

解决方法:刷新几次浏览器。

终极解决方法:在elasticsearch中删除kibana的相关索引,只是再打开kibana看不到其他了之前创建的图形什么的了

kibana可以做哪些分析

分析的必要性:顶级

  • 用户分布
  • PV、UV
  • 状态码
  • 访问时间

更多图形看这里https://www.cnblogs.com/hanyifeng/p/5860731.html

比较牛逼一点的教程看这里https://www.bilibili.com/video/BV1TE411A77i?p=6

三、logstash

logstash和filebeat的对比

Filebeat是收集日志的另外一种方式,二者区别在于以下

Filebeat用于日志收集和传输,相比Logstash更加轻量级和易部署,对系统资源开销更小,日志流架构的话,Filebeat适合部署在收集的最前端,Logstash相比Filebeat功能更强,可以在Filebeat收集之后,由Logstash进一步做日志的解析,至于kafka也可以考虑添加,然后收集的数据都存放在elasticsearch中。

  1. logstash和filebeat都是可以作为日志采集的工具,目前日志采集的工具有很多种,如fluentd, flume, logstash,betas等等。甚至最后我决定用filebeat作为日志采集端工具的时候,还有人问我为什么不用flume,logstash等采集工具。
  2. logstash出现时间要比filebeat早许多,随着时间发展,logstash不仅仅是一个日志采集工具,它也是可以作为一个日志搜集工具,有丰富的input|filter|output插件可以使用。常用的ELK日志采集方案中,大部分的做法就是将所有节点的日志内容上送到kafka消息队列,然后使用logstash集群读取消息队列内容,根据配置文件进行过滤。上送到elasticsearch。logstash详细信息可前往https://www.elastic.co/
  3. logstash是使用Java编写,插件是使用jruby编写,对机器的资源要求会比较高,网上有一篇关于其性能测试的报告。之前自己也做过和filebeat的测试对比。在采集日志方面,对CPU,内存上都要比前者高很多。LogStash::Inputs::Syslog 性能测试与优化
  4. filebeat也是elastic.公司开发的,其官方的说法是为了替代logstash-forward。采用go语言开发。代码开源。elastic/beats filebeat是beats的一个文件采集工具,目前其官方基于libbeats平台开发的还有PacketbeatMetricbeatWinlogbeat。filebeat性能非常好,部署简单。是一个非常理想的文件采集工具。我自己采集工具也是基于beats源码进行的二次开发。

https://blog.csdn.net/m0_38120325/article/details/79072921

自动创建elasticsearch的索引

在logstash客户端的配置文件中会有这么一个配置文件



就是会将日志发送到当天日期的索引汇总,没有的话自动创建索引,我们只需要做的就是每日删除旧的索引。

电子书教程推荐:http://doc.yonyoucloud.com/doc/logstash-best-practice-cn/get_start/introduction.html

启动方法 基于最基础的 nohup 方式
nohup /usr/local/logstash/bin/logstash -f /usr/local/logstash/conf/agent.conf &> /dev/null 也可以用daemontools来进行管理
安装
yum -y install supervisord --enablerepo=epel
在 /etc/supervisord.conf 配置文件里添加内容,定义你要启动的程序:
[program:elkpro_1]
environment=LS_HEAP_SIZE=5000m
directory=/opt/logstash
command=/opt/logstash/bin/logstash -f /etc/logstash/pro1.conf --pluginpath /opt/logstash/plugins/ -w 10 -l /var/log/logstash/pro1.log
[program:elkpro_2]
environment=LS_HEAP_SIZE=5000m
directory=/opt/logstash
command=/opt/logstash/bin/logstash -f /etc/logstash/pro2.conf --pluginpath /opt/logstash/plugins/ -w 10 -l /var/log/logstash/pro2.log 然后启动 service supervisord start 即可。
logstash 会以 supervisord 子进程的身份运行,你还可以使用 supervisorctl 命令,单独控制一系列 logstash 子进程中某一个进程的启停操作: supervisorctl stop elkpro_2
  • 一个普通logstash_agent文件解析(logstash agent配置)

比如同一个nginx服务有3个点,怎么测试其中每一个点都将日志成功的发送出去了呢?

思路1:

在elasticsearch中查一条数据,然后再去各个点上找这条数据出现的次数,如果每个点都有该数据,多查几条数据,尽量在每一个点都查到,如下

这里查106.121.152.208这个IP,发现以下三个点都出现了该条数据

通过以下方法,在elk中找到了3条数据,说明至少这个3个点的日志都已经上传成功了

grok语法

官方给定的语法

https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns

https://github.com/elastic/logstash/tree/v1.4.2/patterns

如果你使用的正则语言可以将nginx日志进行匹配,就可以成功对日志进行切割,效果看下图:

网站是这个:http://grokdebug.herokuapp.com/

1. 线上配置的信息格式192.168.70.94 跟权威指南中的一样
SYSLOGBASE %{SYSLOGTIMESTAMP:timestamp} (?:%{SYSLOGFACILITY} )?%{SYSLOGHOST:logsource} %{SYSLOGPROG}: 以下这个是Logstash默认自带了Apache标准日志的grok正则表达式:
COMMONAPACHELOG %{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] "(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest
})" %{NUMBER:response} (?:%{NUMBER:bytes}|-) COMBINEDAPACHELOG %{COMMONAPACHELOG} %{QS:referrer} %{QS:agent} 2. 我的nginx日志切割格式
NGINX_ACCESS %{IPORHOST:remote_addr} - %{USERNAME:remote_user} \[%{HTTPDATE:tiem_local}\] \"%{DATA:request}\" %{INT:status} %{NUMBER:bytes_sent} \"%{DATA:http_referer}\" \"%{DATA:http_user_agent}\" MAINNGINXLOG %{COMBINEDAPACHELOG} %{QS:x_forwarded_for}
COMBINEDAPACHELOG 合并的apache日志  logstash客户端用的是这种方式
COMMONAPACHELOG 普通的apache日志
当grok匹配失败的时候,插件会为这个事件打个tag,默认是_grokparsefailure。LogStash允许你把这些处理失败的事件路由到其他地方做后续的处理
input { # ... }
filter {
grok {
match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} \[%{IPV4:ip};%{WORD:environment}\] %{LOGLEVEL:log_level} %{GREEDYDATA:message}" }
}
}
output {
if "_grokparsefailure" in [tags] {
# write events that didn't match to a file
file { "path" => "/tmp/grok_failures.txt" }
} else {
elasticsearch { }
}
}

看下面红色的地方,表示grok匹配失败,才会将tags的标签定义成_grokparsefailure这个默认的

解决说是要设置锚点 目前不懂什么意思 先放到这里

https://www.jianshu.com/p/86133dd66ca4

另外一种说法,暂时不会用,先放着
1.
if "_grokparsefailure" in [tags] { drop { } }
2.match语句跟第一个一样的 没啥要点,看着官网例子搞就行了 3.尽量用grok吧 ,grep功能以后要去掉的。

当时想的另外一种解决方法就是改nginx的日志格式成json形式的,但是我不想用这种方法。

log_format json '{"@timestamp":"$time_iso8601",'
'"host":"$server_addr",'
'"clientip":"$remote_addr",'
'"request":"$request",'
'"status":"$status",'
'"request_method": "$request_method",'
'"size":"$body_bytes_sent",'
'"request_time":"$request_time",'
'"upstreamtime":"$upstream_response_time",'
'"upstreamhost":"$upstream_addr",'
'"http_host":"$host",'
'"url":"$uri",'
'"http_forward":"$http_x_forwarded_for",'
'"referer":"$http_referer",'
'"agent":"$http_user_agent"}'; access_log /var/log/nginx/access.log json ;

问题解决

Nginx日志没有被成功切割的终极原因

    以下是两种日志方式:
log_format main '$remote_addr - $remote_user [$time_iso8601] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" "$host" "$request_time"'; log_format format2 '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" "$host" "$request_time"'; 在logstash中进行切割的时候调用的时间变量是不同的,灵感来自如下:
grok {
match => { "message" => "%{TIMESTAMP_ISO8601:time}" }
}
date{
match => ["time", "yyyy-MM-dd HH:mm:ss", "ISO8601"]
target => "@timestamp"
}
mutate{
remove_field => ["time"]
}
定义:
HTTPDATE %{MONTHDAY}/%{MONTH}/%{YEAR}:%{TIME} %{INT}
TIMESTAMP_ISO8601 %{YEAR}-%{MONTHNUM}-%{MONTHDAY}[T ]%{HOUR}:?%{MINUTE}(?::?%{SECOND})?%{ISO8601_TIMEZONE}?
#NGINX_ACCESS %{IPORHOST:remote_addr} - %{USERNAME:remote_user} \[%{HTTPDATE:time_iso8601}\] \"%{DATA:request}\" %{INT:status} %{NUMBER:bytes_sent} \"%{DATA:http_referer}\" \"%
{DATA:http_user_agent}\" {DATA:http_user_agent}\"
NGINX_ACCESS %{IPORHOST:remote_addr} - %{USERNAME:remote_user} \[%{TIMESTAMP_ISO8601:time_iso8601}\] \"%{DATA:request}\" %{INT:status} %{NUMBER:bytes_sent} \"%{DATA:http_refere
r}\" \"%{DATA:http_user_agent}\" SYSLOGBASE %{SYSLOGTIMESTAMP:timestamp} (?:%{SYSLOGFACILITY} )?%{SYSLOGHOST:logsource} %{SYSLOGPROG}:
COMMONAPACHELOG %{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] "(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest
})" %{NUMBER:response} (?:%{NUMBER:bytes}|-)
COMBINEDAPACHELOG %{COMMONAPACHELOG} %{QS:referrer} %{QS:agent} Nginx中时间格式1:$time_local 对应logstash中\[%{HTTPDATE:timestamp}\]
Nginx中时间格式2:$time_iso8601 对应logstash中\[%{TIMESTAMP_ISO8601:timestamp}\]

ELK的踩坑之旅的更多相关文章

  1. 我的微信小程序入门踩坑之旅

    前言 更好的阅读体验请:我的微信小程序入门踩坑之旅 小程序出来也有一段日子了,刚出来时也留意了一下.不过赶上生病,加上公司里也有别的事,主要是自己犯懒,就一直没做.这星期一,赶紧趁着这股热乎劲,也不是 ...

  2. vue+ vue-router + webpack 踩坑之旅

    说是踩坑之旅 其实是最近在思考一些问题 然后想实现方案的时候,就慢慢的查到这些方案   老司机可以忽略下面的内容了 1)起因  考虑到数据分离的问题  因为server是express搭的   自然少 ...

  3. 微信小程序之mpvue+iview踩坑之旅

    因为之前参照微信的原生的文档写过一些小程序的demo,写的过程比较繁琐,后来出了美团的mpvue,可以直接使用vue开发,其他的不作对比,这篇文章记录一下踩坑之旅. 参照mpvue http://mp ...

  4. vue踩坑之旅 -- computed watch

    vue踩坑之旅 -- computed watch 经常在使用vue初始化组件时,会报一些莫名其妙的错误,或者,数据明明有数据,确还是拿不到,这是多么痛苦而又令人忍不住抓耳挠腮,捶胸顿足啊 技术点 v ...

  5. Python踩坑之旅其一杀不死的Shell子进程

    目录 1.1 踩坑案例 1.2 填坑解法 1.3 坑位分析 1.4 坑后扩展 1.4.1 扩展知识 1.4.1 技术关键字 1.5 填坑总结 1.1 踩坑案例 踩坑的程序是个常驻的Agent类管理进程 ...

  6. Python 踩坑之旅进程篇其三pgid是个什么鬼 (子进程\子孙进程无法kill 退出的解法)

    目录 1.1 踩坑案例 1.2 填坑解法 1.3 坑位分析 1.4.1 技术关键字 下期坑位预告 代码示例支持 平台: Centos 6.3 Python: 2.7.14 Github: https: ...

  7. [代码修订版] Python 踩坑之旅 [进程篇其四] 踩透 uid euid suid gid egid sgid的坑坑洼洼

    目录 1.1 踩坑案例 1.2 填坑解法 1.3 坑位分析 1.4 技术关键字 1.5 坑后思考 下期坑位预告 代码示例支持 平台: Centos 6.3 Python: 2.7.14 代码示例: 公 ...

  8. CentOS7使用tar.gz包安装MySql的踩坑之旅

    由于客户的CentOS服务器没有安装yum工具,只能通过下载tar.gz包安装mysql,于是跟着万能的百度开启了漫漫踩坑之旅: 1.下载mysql-5.6.33-linux-glibc2.5-x86 ...

  9. EasyTrader踩坑之旅总结

    ​ easytrader是用python写的可以调用主要券商完成自动化炒股的一个软件 ,但我用的是同花顺,在研究过程中,发现同花顺暂时调不通.后来搜索发现thstrade的源码作者说是easytrad ...

随机推荐

  1. wordpress各种获取路径和URl地址的函数总结

    wordpress中的路径也不是很负责,有人为了让wordpress运行速度更快,就直接写了绝对地址,其实这样是很不好的,有可能别人修改了wordpress程序的地址,那么这样你编写的这个插件或者是主 ...

  2. Istio Polit-agent & Envoy 启动流程

    开篇 通过上一篇 Istio Sidecar注入原理 文章可以发现,在应用提交到kubernate部署时已经同时注入了Sidecar应用. 细心的话应该还可以发现,除了注入了istio-proxy应用 ...

  3. [256个管理学理论]001.蝴蝶效应(Butterfly Effect)

    蝴蝶效应(Butterfly Effect) 来自于大洋彼岸的让你看不懂的解释: 蝴蝶效应是指在一个动力系统中,初始条件下微小的变化能带动整个系统的长期的巨大的连锁反应,是一种混沌的现象.“蝴蝶效应” ...

  4. (七)剩余DAO代码

    AccountDAO.java package com.aff.bookstore.dao; import com.aff.bookstore.domain.Account; public inter ...

  5. 【Socket通信】关于Socket通信原理解析及python实现

    Socket(套接字)通信{网络通信其实就是Socket间的通信},首先了解下概念:[来源于百度百科] "两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket.& ...

  6. Beta冲刺 —— 5.30

    这个作业属于哪个课程 软件工程 这个作业要求在哪里 Beta冲刺 这个作业的目标 Beta冲刺 作业正文 正文 github链接 项目地址 其他参考文献 无 一.会议内容 1.讨论并解决每个人存在的问 ...

  7. Chisel3 - util - Arbiter

    https://mp.weixin.qq.com/s/7Y23gV6yPvtmvKHTo2I8mw   基于ReadyValid接口实现的多入单出仲裁器.   参考链接: https://github ...

  8. 如何让a==1&&a==2&a==3成立

    /* * == 进行比较的时候,如果左右两边数据类型不一样,则先转换为相同的数据类型,然后在进行比较 *    1.{} == {} false 两个数据进行比较,比较的是堆内存的地址 *    2. ...

  9. MyBatis特性详解

    缓存简介 一般我们在系统中使用缓存技术是为了提升数据查询的效率.当我们从数据库中查询到一批数据后将其放入到混存中(简单理解就是一块内存区域),下次再查询相同数据的时候就直接从缓存中获取数据就行了. 这 ...

  10. pip安装Python库速度慢的解决方法

    最近在写大数据文本挖掘的考查报告,需要用到 jieba切词,于是在pycharm中安装 jieba 库 首先是在 File—settings中通过搜索安装,然而安了五分钟之后还是失败了 于是通过终端输 ...