生产环境搭建EFK日志分析系统

日志分析系统的搭建与使用

日志分析系统一般有ELKEFK两种,区别在于使用日志搜集的组件不同LlogstashFFileBeat,剩下的两种分别是_EElasticsearchKKibana
过程中所有不懂的地方,请及时查看Elasticsearch官方文档,这个文档目前是业内好评做多的文档,很全!很全!很全!

版本介绍: ElasticSearchKibanaFileBeat 均使用7.12.0版本。

各种组件的搭建

Elasticsearch的搭建过程

Docker方式安装搭建(可以连接外网并有访问权限)

1、104服务器拉取ElasticSearch镜像
注意:直接从docker hub搜索到的镜像版本可能比较低,这里以官方文档中给出的镜像为准:

docker pull docker.elastic.co/elasticsearch/elasticsearch:7.10.1

尝试执行,发现找不到资源,不清楚什么鬼,若无法拉取,可以改成这样(后面的一些操作照葫芦画瓢):

docker pull elasticsearch:7.10.1

2、创建并启动elasticsearch

因为是本地开发用,所以部署为单机模式,若以集群模式部署可以参考这里
discovery.type=single-node表示单节点(单机模式)。
/home/dockerapps/elasticsearch/data:/usr/share/elasticsearch/data将物理机dockerapp下的目录映射到容器以进行持久化。
另外可以不映射9300端口,这里的9300是集群用的。

docker run -p 9200:9200 -p 9300:9300 
-v /home/dockerapps/elasticsearch/data:/usr/share/elasticsearch/data 
-e "discovery.type=single-node" 
--name elasticsearch docker.elastic.co/elasticsearch/elasticsearch:7.10.1

执行后出现AccessDeniedException,修改物理机目录对应权限

chmod -R 777 /home/dockerapps/elasticsearch/data

重新启动容器,问题解决。测试访问http://192.168.3.104:9200/
得到es基本信息

{
  "name" : "XX-XX-XX",
  "cluster_name" : "elasticsearch-application",
  "cluster_uuid" : "HLt04VgUTkisbTgIGXrQ",
  "version" : {
    "number" : "7.12.0",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "78722783c38caa25a70982b5b042074cde5d3b3a",
    "build_date" : "2021-03-18T06:17:15.410153305Z",
    "build_snapshot" : false,
    "lucene_version" : "8.8.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

有以上信息表示成功部署,若没有请查看日志,根据报错去找百度。
至此esdocker部署完毕。

离线安装搭建

1、创建用户和组

Elasticsearch 5 版本开始,出于系统安全考虑设置,不再允许直接使用 root 用户启动了,会报 can not run elasticsearch as root异常信息,所以需要将 Elasticsearch 启动在普通用户下,且为了环境隔离,最好为 Elasticsearch 单独创建一个独立的用户,譬如 elsearch,用户名可自定义。

useradd elsearch  # 新建 elsearch 用户
passwd elsearch   # 修改 elsearch 用户的密码, 这一步不设置就是没密码

请使用 root 用户执行上述命令,以创建 elsearch 用户及修改密码。

2、环境变量

elsearch 用户配置 Elasticsearch配置环境变量。切换到 elsearch 用户下,编辑打开用户环境变量文件:

vim /home/elsearch/.bash_profile

将如下信息追加到文件中末尾的新行中:(我安装是提示此处需要JDK环境我就把JDK也放下去了,这里应该是不需要的,因为ES自己有Java类库和环境。在根目录下bin/elasticsearch-env中有对于Java环境的判断)

export JAVA_HOME=${你的Java的安装路径}
export ES_HOME=/usr/local/elasticsearch
export PATH=$PATH:$ES_HOME/bin:$JAVA_HOME/bin

再通过键入 :wq 保存且退出后,一定要再通过 source ~/.bash_profile命令使变更生效。

3、资源限制

3.1 最大线程数
 一般在 Linux系统的默认情况下,系统普通用户可以创建的线程数是 1024个,此处应确保 elsearch 用户可以创建的线程数至少为 2048 个。可用如下方式设置:

vim /etc/security/limits.d/90-nproc.conf

在打开的文件新行中追加如下内容:

elsearch   soft    nproc    4096

如果未修改该配置,启动时将会报形如下述内容的异常信息:
max number of threads [1024] for user [elsearch] likely too low, increase to at least [4096]

3.2 打开的文件数与线程数

vim /etc/security/limits.conf 

在打开的文件新行中追加如下内容:

elsearch   soft   nofile   65536
elsearch   hard   nofile   131072
elsearch   soft   nproc    4096
elsearch   hard   nproc    4096

注意:此处的 elsearch 与上述创建的用户名elsearch对应。
如果未修改该配置,启动时将会报形如下述内容的异常信息: node validation exception bootstrap checks failed
3.3 系统控制文件
Elasticsearch 默认使用 mmapfs目录存储索引,而 Linux 默认对 mmap计数限制可能太低,会导致内存异常。系统控制文件是管理系统中的各种资源控制的配置文件,ES需要开辟一个 65536 字节以上空间的虚拟内存,但 Linux 又不允许任何用户直接开辟虚拟内存,所以通过如下方式修改:

vim /etc/sysctl.conf 

在打开的文件新行中增加如下内容:

vm.max_map_count=655360

再执行 sysctl -p命令使其生效。
如果未修改该配置,启动时将会报形如下述内容的异常信息: max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]

4、下载安装配置

官方下载压缩包地址:https://www.elastic.co/cn/start
找对应的机器版本下载,这里我使用最新版本Linux 7.12.0

4.1、启动

将下载好的安装包 elasticsearch-7.12.0-linux-x86_64.tar.gz 上传至 elsearch用户的主目录下,解压并移动到 /usr/local/目录下(不一定是/usr/local目录, 也可以是别的目录, 只是我比较喜欢把程序文件夹放到这个目录下, 把数据文件夹放到 /data目录下而已) 。

tar -zxf elasticsearch-7.12.0-linux-x86_64.tar.gz  #解压安装包
mv elasticsearch-7.12.0-linux-x86_64 /usr/local/elasticsearch  #移动到指定目录,并更名
chown -R elsearch:elsearch /usr/local/elasticsearch   #变更程序所属用户组

注意:使用root用户执行上述命令。
ElasticSearch目录结构:

目录 配置文件 备注
bin 二进制脚本文件。
启动 elasticsearch、安装插件、运行统计数据等
config elasticsearch.yml,jvm.options 集群配置文件。user、role based 相关配置。
jvm配置文件可以配置jvm启动参数-Xms-Xmx等参数,一般设置为RAM的50%就可以了。
jdk Java 运行环境
data path.data 数据文件
lib Java 类库
logs path.log 日志默认存放目录
modules 所有 Elasticsearch 模块
plugins 已安装的插件

JVM其他配置

ElasticsearchJVM 的配置专门准备了一个 config/jvm.options 配置文件,7.12.0版本的默认设置 JVM启动时占用内存与运行时的最大占用内存皆为 1 GB,即 -Xms1g -Xmx1g。在实际使用环境中,可能存在需调整的情况,下面给出三条调整建议:

· Xmx 和 Xms 设置成一样。
· 不要超过机器总内存的 50%。
· 不要超过 30 GB。
ElasticSearch的配置
Elasticsearch 的配置同样遵循“约定大于配置”的设计原则。Elasticsearch 具有极好的默认值设置,用户仅需很少的配置既可使用 Elasticsearch。用户既可以使用集群更新设置 API 在在正在运行的集群上更改大多数设置,也可以通过配置文件对 Elasticsearch 进行配置。Elasticsearch 服务的主配置文件为 config/elasticsearch.yml
注意:下述配置中多处使用了 hostname 作为地址信息,请留意配置相关 hosts 映射关系。
1、集群名称
 默认的集群名称为 elasticsearch,如果存在多个集群,或需要为该集群起一个具有义务含义的名称,则需要为其重定义名称。

cluster.name: elasticsearch-application

注意:elasticsearch-application 的日志文件名皆以集群名为前缀。

2、节点名称
 默认情况下,Elasticsearch 将使用随机生成的 UUID 的前七个字符作为节点 ID,该节点名称一经生成后,即使重启服务亦不会变更,所以建议配置一个更有意义的名称,一般直接使用主机名(hostname)作为节点名。

node.name: ${HOSTNAME}

一般情况下,直接使用上述表达式即可,服务启动时会自动通过执行hostname命令获取节点名。如若将其变更为具体的节点名,且是直接将此配置拷贝到其他节点上,以形成集群时,则需要另单独修改之,因为形成集群的必要条件是集群名相同,节点名不同。

3、logsdata 路径配置
Elasticsearch 是会像数据库一样存储大量数据的,且有时还会根据日志信息排查问题,所以数据和日志的存放目录都会另外指定到有较大存储空间的磁盘上保存。

path.data: /home/ellison/elasticsearch-7.12.0/data
path.logs: /home/ellison/elasticsearch-7.12.0/logs

若不存在上述目录,Elasticsearch在启动时是不会去自动创建,所以需自行创建,且需保证 elsearch 用户拥有读写权限,最好将该目录所属用户及用户组修改为 elsearch。下面提供相关命令,以供参考。

mkdir -p /home/ellison/elasticsearch-7.12.0/data  #递归创建目录
chown -R elsearch:elsearch /home/ellison/elasticsearch-7.12.0  #变更目录所属用户及用户组

data 目录是可以设多个路径。

path:
  data:
    - /data/elasticsearch/data_1
    - /data/elasticsearch/data_2
    - /data/elasticsearch/data_3

在生产环境中一定要为path.data 指定多个路径,如果有条件的话,最好保证这些目录挂载到不同的物理磁盘上。这样做有两个好处:

提升读写性能:比起单块磁盘,多块物理磁盘同时读写数据有更高的吞吐量。
能够实现故障转移:即 Failover。
4、network.host
 默认情况下,此 elasticsearch 服务绑定到回环地址上,例如 127.0.0.1``(::1),因为几乎每台机器的回环地址都是 127.0.0.1,在其他机器上通过回环地址访问的肯定只能也是其本地环境,所以如此配置,意味着只有本机才能访问此服务。要想其他节点也能访问到此服务,则需要绑定到一个非回环地址。

network.host: 10.251.74.113

请将上述 IP 地址(IPv4 或 IPv6)修改为当前节点的对外 IP 地址。

5、discovery.seed_hosts
 集群中拥有被选举成 Master 节点资格的地址列表。可以是以逗号分隔的单个字符串,每个节点的格式为:host:port 或 host,若并没有明确指定端口,则默认使用 9300。

discovery.seed_hosts: ["node1", "node2", "node3"]

上述表示 node1、node2 和 node3 三个节点皆有资格被选举成 Master 节点。

cluster.initial_master_nodes

在一个新集群初始化时,符合 Master 节点资格的节点集。

cluster.initial_master_nodes: ["slave09", "slave10"]

在完成环境变量和参数配置的前提下,使用 elsearch 用户执行以下命令即可启动 elasticsearch

[elsearch@JV-PRD-MD elasticsearch-7.12.0] ./bin/elasticsearch -d

参数-d表示在后台以守护进程模式运行。或者使用nohup后台启动也可以。
执行完启动命令后,可通过查看/home/ellison/elasticsearch-7.12.0/logs目录下的 elasticsearch-application-xxxxx.log(若在配置过程中修改了集群名称,则此文件名应为"集群名.log")文件,来检测启动过程中是否存在问题。
 在确认启动日志中无异常信息后,在浏览器中输入地址访问即可:出现一堆json数据则表示安装成功。

4.2、单节点多实例启动

在同一个节点上启动多个 elasticsearch 实例:

bin/elasticsearch -E node.name=node1 -E cluster.name=my_cluster -E path.data=/data/es/node1 -d
bin/elasticsearch -E node.name=node2 -E cluster.name=my_cluster -E path.data=/data/es/node2 -d
bin/elasticsearch -E node.name=node3 -E cluster.name=my_cluster -E path.data=/data/es/node3 -d

执行完上述命令后,可在终端执行下述命令查看集群的节点信息:

curl -X GET http://localhost:9200/_cat/nodes

得到的节点信息为:

10.251.74,113 26 64 0 0.00 0.01 0.05 dilmrt - node1
10.251.74,113 25 64 0 0.00 0.01 0.05 dilmrt * node2
10.251.74,113 27 64 0 0.00 0.01 0.05 dilmrt - node3
4.3、停止

简单粗暴,使用jps查询Java进程,然后直接kill -9干死。
或者网上有一些会封装一些脚本操作,可以学习(下面封装是copy其他博客):

# 方式一:组合命令
ps -ef|grep Elasticsearch|grep -v grep|awk '{print $2}'|xargs kill -SIGTERM
# 方式二:封装脚本,整理成一个stop.sh 脚本,存放于 你安装的es的根目录的/bin/ 目录下,要记得为该脚本赋可执行权限:chmod +x stop.sh
#!/bin/sh

SIGNAL=${SIGNAL:-TERM}

case "`uname`" in
  Linux)
    bin_abs_path=$(readlink -f $(dirname $0))
    ;;
  *)
    bin_abs_path=`cd $(dirname $0); pwd`
    ;;
esac
base_dir=`cd $bin_abs_path/..; pwd`

PIDS=$(ps ax|grep Elasticsearch|grep java|grep "$base_dir"|grep -v grep|awk '{print $1}')

if [ -z "$PIDS" ]; then
  echo "No elasticsearch server to stop"
  exit 1
else
  kill -s $SIGNAL $PIDS
  while true
  do
    PID=$(ps ax|grep Elasticsearch|grep java|grep "$base_dir"|grep -v grep)
    if [ -z "$PID" ]; then
      echo " stopped"
      break
    fi
    echo -n "."
    sleep 1
  done
fi

Kibana的搭建过程

Docker方式安装搭建

docker run -p 5601:5601  --name kibana docker.elastic.co/kibana/kibana:7.10.1

此时通过日志发现无法连接到elasticsearch,因此做一个容器和物理机的路径映射,并修改一些配置

docker cp kibana:/usr/share/kibana /home/dockerapps
docker stop kibana
docker rm kibana
docker run -p 5601:5601 -v /home/dockerapps/kibana:/usr/share/kibana --name kibana docker.elastic.co/kibana/kibana:7.10.1

修改kibana/config/kibana.yml,指定elasticsearch.hosts的正确地址并重启容器。
访问http://192.168.3.104:5601 进入kibana管理页面,有界面显示表示成功,否则请查看日志具体排查问题。
kibana 安装完毕首次访问。

离线安装搭建

先参考官方教程:https://www.elastic.co/guide/en/kibana/6.5/rpm.html
跟 es步骤一样,下载、安装、配置、启动、停止
这里列一下配置、启动和停止:

配置

[ellison@JV-PROD-MD Kibana-7.12.0]# vi /home/ellison/Kibana-7.12.0/kibana.yml

填写如下配置:

server.port: 5601                               // 监听端口
server.host: "10.251.74.113"                     // 监听IP地址,建议内网ip
elasticsearch.url: "http://10.251.74.113:9200"   // elasticsearch连接kibana的URL,也可以填写10.251.74.*,因为它们是一个集群

启动

[ellison@JV-PROD-MD Kibana-7.12.0]# ./bin/kibana 

后台进程启动

[ellison@JV-PROD-MD Kibana-7.12.0]# nohup ./bin/kibana &

启动无报错后.
验证服务看到有TCP进程后,去浏览器地址访问 10.251.74.113:5601会有界面出现。
验证服务命令:

[root@JV-PROD-MD Kibana-7.12.0]# ss -antlup | grep 5601

停止

[root@JV-PROD-MD Kibana-7.12.0]# netstat -tunlp | grep 5601

查到进程后直接kill -9

FileBeat的搭建过程

Docker方式安装搭建

**1、启动FileBeat容器 **
注意映射spring boot的日志存放路径和elasticsearch地址。

docker run -d \
--name=filebeat \
--user=root \
--volume="/var/lib/docker/containers:/var/lib/docker/containers:ro" \
--volume="/var/run/docker.sock:/var/run/docker.sock:ro" \
--volume="/root/dockerapps/services/logs:/data/logs" \
docker.elastic.co/beats/filebeat:7.10.1 filebeat -e -strict.perms=false \
-E output.elasticsearch.hosts=["192.168.3.104:9200"]

2、配置FileBeat 读取日志文件的路径及规则
我这里是不同的服务部署在了多个服务器,所以我在相应的机器均部署一个FileBeat组件进行日志读取传输。

全部属性配置,官网想当全也很白话,建议查看官网

或者参考CSDN博客:https://blog.csdn.net/qq_27818541/category_10299800.html

<<112机器配置文件>>:
下面是测试通过的最终配置文件:

# ============================== Filebeat inputs ===============================
filebeat.inputs: 
# 业务系统日志抓取
- type: log
  enabled: true
  paths:
    - "/root/applog/boe-wms/*"
  tags: ["wms"]
  multiline:
    pattern: ^[0-9]{4}
    negate: true
    match: after
    timeout: 3s

# 接口日志抓取
- type: log
  enabled: true
  paths:
    - "/root/applog/boe-wms-interface/*"
  tags: ["interface"]
  multiline:
    pattern: ^[0-9]{4}
    negate: true
    match: after
    timeout: 3s

# 工作流服务日志抓取
- type: log
  enabled: true
  paths:
    - "/root/applog/boe-wms-workflow/*"
  tags: ["workflow"]
  multiline:
    pattern: ^[0-9]{4}
    negate: true
    match: after
    timeout: 3s
# 读取 FileBeat 软件的日志,并配置标签便于检索
- type: filestream
  enabled: true
  paths:     
    - "/usr/local/filebeat-data/logs/*"

# ============================== Filebeat modules ==============================

filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: false

# ======================= Elasticsearch template setting =======================

setup.template.settings:
  index.number_of_shards: 1

# =================================== Kibana ===================================

setup.kibana:
  host: "10.251.74.113:5601"

# ---------------------------- Elasticsearch Output ----------------------------
output.elasticsearch:
  hosts: ["10.251.74.113:9200"]

# ================================= Processors =================================
processors:
  - script:
      lang: javascript
      id: my_filter
      tag: enable
      source: >
        function process(event){
          var str = event.Get("message");
          var time = str.splict(" ").slice(0,2).join(" ");
          event.Put("_time",time);
        }
  - timestamp:
      field: log_time
      timezone: Asia/Shanghai
      layouts:
        - '2006-01-02 15:04:05'
        - '2006-01-02 15:04:05.999'
      test:
        - '2021-04-13 14:57:51'  
  - add_host_metadata:
      when.not.contains.tags: forwarded
  - add_cloud_metadata: ~
  - add_docker_metadata: ~
  - add_kubernetes_metadata: ~

# ================================== Logging ===================================

logging.level: info
logging.to_files: true
logging.files:
  path: /usr/local/filebeat-data/logs
  name: filebeat
  keepfiles: 7
  permissions: 0644


重启filebeat容器,进入[kibana>Stack Management>Index patterns] 添加filebeat索引并查看日志。

<<111服务器配置>>:
下面是测试通过的最终配置文件:

# ============================== Filebeat inputs ===============================
filebeat.inputs: 
# 读取 admin 服务的日志,并配置标签便于检索
- type: log
  enabled: true
  paths:
    - "/root/applog/savor-admin/*"
  tags: ["admin","savor-admin"]
  mutiline:
    pattern: ^[0-9]{4}
    negate: true
    match: after
    timeout: 3s
# 读取 auth 服务的日志,并配置标签便于检索
- type: log
  enabled: true
  paths:
    - "/root/applog/savor-auth/*"
  tags: ["auth","savor-auth"]
  mutiline:
    pattern: ^[0-9]{4}
    negate: true
    match: after
    timeout: 3s
# 读取 dict 服务的日志,并配置标签便于检索
- type: log
  enabled: true
  paths:
    - "/root/applog/savor-dict/*"
  tags: ["dict","savor-dict"]
  mutiline:
    pattern: ^[0-9]{4}
    negate: true
    match: after
    timeout: 3s
# 读取 gate 服务的日志,并配置标签便于检索
- type: log
  enabled: true
  paths:
    - "/root/applog/savor-gate/*"
  tags: ["gate","savor-gate"]
  mutiline:
    pattern: ^[0-9]{4}
    negate: true
    match: after
    timeout: 3s
# 读取 general 服务的日志,并配置标签便于检索
- type: log
  enabled: true
  paths:
    - "/root/applog/savor-general/*"
  tags: ["general","savor-general"]
  mutiline:
    pattern: ^[0-9]{4}
    negate: true
    match: after
    timeout: 3s
# 读取 FileBeat 软件的日志,并配置标签便于检索
- type: filestream
  enabled: true
  paths:     
    - "/usr/local/filebeat-data/logs/*"

# ============================== Filebeat modules ==============================

filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: false

# ======================= Elasticsearch template setting =======================

setup.template.settings:
  index.number_of_shards: 1

# =================================== Kibana ===================================

setup.kibana:
  host: "10.251.74.113:5601"

# ---------------------------- Elasticsearch Output ----------------------------
output.elasticsearch:
  hosts: ["10.251.74.113:9200"]

# ================================= Processors =================================
processors:
  - script:
      lang: javascript
      id: my_filter
      tag: enable
      source: >
        function process(event){
          var str = event.Get("message");
          var time = str.splict(" ").slice(0,2).join(" ");
          event.Put("_time",time);
        }
  - timestamp:
      field: log_time
      timezone: Asia/Shanghai
      layouts:
        - '2006-01-02 15:04:05'
        - '2006-01-02 15:04:05.999'
      test:
        - '2021-04-13 14:57:51'  
  - add_host_metadata:
      when.not.contains.tags: forwarded
  - add_cloud_metadata: ~
  - add_docker_metadata: ~
  - add_kubernetes_metadata: ~

# ================================== Logging ===================================

logging.level: info
logging.to_files: true
logging.files:
  path: /usr/local/filebeat-data/logs
  name: filebeat
  keepfiles: 7
  permissions: 0644



离线安装搭建

这里离线安装是傻瓜式的,直接tar后,上面的配置信息写到filebeat.yml文件启动即可。

启动

保守一点,启动新进行测试启动,会验证yaml的配置文件是否正确,正常启动后 ctrl+c,然后利用后台启动即可。
非后台启动服务方式:

[ellison@JV-PROD-MD ~]# cd filebeat-7.12.0-linux-x86_64
[ellison@JV-PROD-MD filebeat-7.12.0-linux-x86_64]# ./filebeat -e -c filebeat.yml

后台启动服务方式:

[ellison@JV-PROD-MD filebeat-7.12.0-linux-x86_64]# nohup ./filebeat -e -c filebeat.yml &

LogStash的搭建过程

Docker方式安装搭建

离线安装搭建

启动

各种组件的使用

Kibana 使用

Kibana在搭建结束后,界面配置教程,参考官方使用手册Kibana使用手册

ElasticSearch+Kibana+filebeat 设置用户名密码登陆

修改ES配置

首先修改ES的配置文件:elasticsearch.yml, 添加如下配置

xpack.security.enabled: true
xpack.license.self_generated.type: basic
xpack.security.transport.ssl.enabled: true

配置完后,重启ES。然后去ESbin目录下,执行设置用户名和密码的命令,然后一次逐个设置密码:

./elasticsearch-setup-passwords interactive

这里会设置六个账号的密码:

  • elastic
  • apm_system
  • kibana
  • kibana_system
  • logstash_system
  • beats_system
  • remote_monitoring_user

修改kibana配置

设置完毕后,去设置kibana的配置文件:

elasticsearch.username: "elastic"
elasticsearch.password: "boe123456"

修改保存后,重启Kibana
这时候 需要认证才可登陆,登陆账号密码为elastic/boe123456

修改fileBeat配置

在安装FileBeat服务的每台机器上都修改下配置文件。
filebeat.yml配置文件中添加ES的访问用户名和密码。
注意:Kibana设置中也要添加用户名密码,均为ES的密码:

# =================================== Kibana ===================================

setup.kibana:
  host: "10.251.74.113:5601"
  username: "elastic"   # ES 服务用户名
  password: "你的es服务密码"  # ES 服务密码

# ---------------------------- Elasticsearch Output ----------------------------
output.elasticsearch:
  hosts: ["10.251.74.113:9200"] # ES 服务地址
  username: "elastic"   # ES 服务用户名
  password: "你的es服务密码"  # ES 服务密码

在修改完配置后,记得要重启FileBeat服务。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容