SpringBoot 2.5.5整合輕量級(jí)的分布式日志標(biāo)記追蹤神器TLog

TLog能解決什么痛點(diǎn)

隨著微服務(wù)盛行,很多公司都把系統(tǒng)按照業(yè)務(wù)邊界拆成了很多微服務(wù),在排錯(cuò)查日志的時(shí)候瞬欧。因?yàn)闃I(yè)務(wù)鏈路貫穿著很多微服務(wù)節(jié)點(diǎn)呢铆,導(dǎo)致定位某個(gè)請(qǐng)求的日志以及上下游業(yè)務(wù)的日志會(huì)變得有些困難晦鞋。

這時(shí)候很多童鞋會(huì)開始考慮上SkyWalking,Pinpoint等分布式追蹤系統(tǒng)來解決棺克,基于OpenTracing規(guī)范悠垛,而且通常都是無侵入性的,并且有相對(duì)友好的管理界面來進(jìn)行鏈路Span的查詢娜谊。

但是搭建分布式追蹤系統(tǒng)确买,熟悉以及推廣到全公司的系統(tǒng)需要一定的時(shí)間周期,而且當(dāng)中涉及到鏈路span節(jié)點(diǎn)的存儲(chǔ)成本問題纱皆,全量采集還是部分采集拇惋?如果全量采集,就以SkyWalking的存儲(chǔ)來舉例抹剩,ES集群搭建至少需要5個(gè)節(jié)點(diǎn)撑帖。這就需要增加服務(wù)器成本。況且如果微服務(wù)節(jié)點(diǎn)多的話澳眷,一天下來產(chǎn)生幾十G上百G的數(shù)據(jù)其實(shí)非常正常胡嘿。如果想保存時(shí)間長(zhǎng)點(diǎn)的話,也需要增加服務(wù)器磁盤的成本钳踊。

當(dāng)然分布式追蹤系統(tǒng)是一個(gè)最終的解決方案衷敌,如果您的公司已經(jīng)上了分布式追蹤系統(tǒng),那 TLog 并不適用拓瞪。

項(xiàng)目整合

項(xiàng)目結(jié)構(gòu)

添加依賴

        <!-- 引入全量tlog依賴 -->
        <dependency>
            <groupId>com.yomahub</groupId>
            <artifactId>tlog-all-spring-boot-starter</artifactId>
            <version>1.5.0</version>
        </dependency>

logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志級(jí)別從低到高分為TRACE < DEBUG < INFO < WARN < ERROR < FATAL缴罗,如果設(shè)置為WARN,則低于WARN的信息都不會(huì)輸出 -->
<!-- scan:當(dāng)此屬性設(shè)置為true時(shí)祭埂,配置文件如果發(fā)生改變面氓,將會(huì)被重新加載,默認(rèn)值為true -->
<!-- scanPeriod:設(shè)置監(jiān)測(cè)配置文件是否有修改的時(shí)間間隔蛆橡,如果沒有給出時(shí)間單位舌界,默認(rèn)單位是毫秒。當(dāng)scan為true時(shí)泰演,此屬性生效呻拌。默認(rèn)的時(shí)間間隔為1分鐘。 -->
<!-- debug:當(dāng)此屬性設(shè)置為true時(shí)睦焕,將打印出logback內(nèi)部日志信息藐握,實(shí)時(shí)查看logback運(yùn)行狀態(tài)靴拱。默認(rèn)值為false。 -->
<configuration  scan="true" scanPeriod="10 seconds">

    <contextName>logback</contextName>
    <!-- name的值是變量的名稱猾普,value的值時(shí)變量定義的值袜炕。通過定義的值會(huì)被插入到logger上下文中。定義變量后抬闷,可以使“${}”來使用變量妇蛀。 -->
    <property name="log.path" value="applog/" />
    <property name="log.name" value="springboot-tlog"/>
    <property name="CONSOLE_LOG_PATTERN_FILE" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %C:%M:%L [%thread] %-5level %msg%n"/>

    <!-- 彩色日志 -->
    <!-- 彩色日志依賴的渲染類 -->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
    <!-- 彩色日志格式 -->
    <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>

    <!--輸出到控制臺(tái)-->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <!--此日志appender是為開發(fā)使用耕突,只配置最底級(jí)別笤成,控制臺(tái)輸出的日志級(jí)別是大于或等于此級(jí)別的日志信息-->
<!--        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">-->
<!--            <level>info</level>-->
<!--        </filter>-->
        <encoder class="com.yomahub.tlog.core.enhance.logback.AspectLogbackEncoder">
            <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
            <!-- 設(shè)置字符集 -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>


    <!--輸出到文件-->
    <!-- 時(shí)間滾動(dòng)輸出 level為 INFO 日志 -->
    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在記錄的日志文件的路徑及文件名 -->
        <file>${log.path}/${log.name}/${log.name}_info.log</file>
        <!--日志文件輸出格式-->
        <encoder class="com.yomahub.tlog.core.enhance.logback.AspectLogbackEncoder">
            <pattern>${CONSOLE_LOG_PATTERN_FILE}</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <!-- 日志記錄器的滾動(dòng)策略,按日期眷茁,按大小記錄 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 每天日志歸檔路徑以及格式 -->
            <fileNamePattern>${log.path}/${log.name}/info/${log.name}-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天數(shù)-->
            <maxHistory>180</maxHistory>
        </rollingPolicy>
        <!-- 此日志文件只記錄info級(jí)別的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>info</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 時(shí)間滾動(dòng)輸出 level為 ERROR 日志 -->
    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在記錄的日志文件的路徑及文件名 -->
        <file>${log.path}/${log.name}/${log.name}_error.log</file>
        <!--日志文件輸出格式-->
        <encoder class="com.yomahub.tlog.core.enhance.logback.AspectLogbackEncoder">
            <pattern>${CONSOLE_LOG_PATTERN_FILE}</pattern>
            <charset>UTF-8</charset> <!-- 此處設(shè)置字符集 -->
        </encoder>
        <!-- 日志記錄器的滾動(dòng)策略炕泳,按日期,按大小記錄 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/${log.name}/error/${log.name}-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天數(shù)-->
            <maxHistory>180</maxHistory>
        </rollingPolicy>
        <!-- 此日志文件只記錄ERROR級(jí)別的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <root level="info">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="INFO_FILE" />
        <appender-ref ref="ERROR_FILE" />
    </root>

    <!-- sql打印 -->
<!--    <logger name="com.ybchen.mapper" level="DEBUG"/>-->
</configuration>

請(qǐng)求類

package com.ybchen.request;

import lombok.Data;

/**
 * @author: chenyanbin 2022-10-18 23:03
 */
@Data
public class PersonRequest {
    private Long id;
    private Long age;
    private String name;
}

Controller

package com.ybchen.controller;

import com.ybchen.request.PersonRequest;
import com.yomahub.tlog.core.annotation.TLogAspect;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author: chenyanbin 2022-10-18 22:56
 */
@RestController
@Slf4j
public class DemoController {
    @TLogAspect({"id"})
    @GetMapping("demo1")
    public void demo1(String id, String name) {
        log.info("這是第一條日志---->簡(jiǎn)單例子");
        log.info("這是第二條日志---->簡(jiǎn)單例子");
        log.info("這是第三條日志---->簡(jiǎn)單例子");
        new Thread(() -> log.info("這是異步日志---->簡(jiǎn)單例子")).start();
    }

    @TLogAspect({"id", "name"})
    @GetMapping("demo2")
    public void demo2(String id, String name) {
        log.info("這是第一條日志----->多個(gè)數(shù)值");
        log.info("這是第二條日志----->多個(gè)數(shù)值");
        log.info("這是第三條日志----->多個(gè)數(shù)值");
        new Thread(() -> log.info("這是異步日志----->多個(gè)數(shù)值")).start();
    }

    @TLogAspect(value = {"id", "name"}, pattern = "<-{}->", joint = "_")
    @GetMapping("demo3")
    public void demo3(String id, String name) {
        log.info("多個(gè)數(shù)值-------->加了patter和joint的示例");
    }

    @TLogAspect(str = "陳彥斌博客地址:https://www.cnblogs.com/chenyanbin/")
    @GetMapping("demo4")
    public void demo4(String name){
        log.info("這是第一條日志----->常量字符串標(biāo)簽");
        log.info("這是第二條日志----->常量字符串標(biāo)簽");
        log.info("這是第三條日志----->常量字符串標(biāo)簽");
        new Thread(() -> log.info("這是異步日志----->常量字符串標(biāo)簽")).start();
    }

    @TLogAspect({"request.id","request.age"})
    @GetMapping("demo5")
    public void demo4(PersonRequest request){
        log.info("多參數(shù)加多層級(jí)示例");
    }
}

SpanId的生成規(guī)則

TLog業(yè)務(wù)標(biāo)簽

很多公司的系統(tǒng)在打日志的時(shí)候上祈,每打一個(gè)日志里都會(huì)帶入一些業(yè)務(wù)信息培遵,比如記錄ID,會(huì)員CODE登刺,方便業(yè)務(wù)日志的定位∽淹螅現(xiàn)在有了TLog,不僅能做分布式鏈路標(biāo)簽追加纸俭,還能自動(dòng)幫你做業(yè)務(wù)標(biāo)簽的添加皇耗。這樣在定位日志的時(shí)候可以更加方便的搜索。

Tlog支持方法級(jí)別的自定義業(yè)務(wù)標(biāo)簽揍很。你可以在方法上定義簡(jiǎn)單的標(biāo)注郎楼,來實(shí)現(xiàn)在某一個(gè)方法的日志里,統(tǒng)一加入業(yè)務(wù)的指標(biāo)標(biāo)簽窒悔,用于更加細(xì)致的定位呜袁。

演示

示例1

    @TLogAspect({"id"})
    @GetMapping("demo1")
    public void demo1(String id, String name) {
        log.info("這是第一條日志---->簡(jiǎn)單例子");
        log.info("這是第二條日志---->簡(jiǎn)單例子");
        log.info("這是第三條日志---->簡(jiǎn)單例子");
        new Thread(() -> log.info("這是異步日志---->簡(jiǎn)單例子")).start();
    }
2022-10-18 23:14:37.450  INFO 88321 --- [nio-8080-exec-4] com.ybchen.controller.DemoController     : <0><11477324755760832> [id:"10086"] 這是第一條日志---->簡(jiǎn)單例子
2022-10-18 23:14:37.451  INFO 88321 --- [nio-8080-exec-4] com.ybchen.controller.DemoController     : <0><11477324755760832> [id:"10086"] 這是第二條日志---->簡(jiǎn)單例子
2022-10-18 23:14:37.451  INFO 88321 --- [nio-8080-exec-4] com.ybchen.controller.DemoController     : <0><11477324755760832> [id:"10086"] 這是第三條日志---->簡(jiǎn)單例子
2022-10-18 23:14:37.452  INFO 88321 --- [      Thread-12] com.ybchen.controller.DemoController     : <0><11477324755760832> [id:"10086"] 這是異步日志---->簡(jiǎn)單例子
2022-10-18 23:14:41.160  INFO 88321 --- [nio-8080-exec-5] com.ybchen.controller.DemoController     : <0><11477324998899392> [id:"10087"] 這是第一條日志---->簡(jiǎn)單例子
2022-10-18 23:14:41.160  INFO 88321 --- [nio-8080-exec-5] com.ybchen.controller.DemoController     : <0><11477324998899392> [id:"10087"] 這是第二條日志---->簡(jiǎn)單例子
2022-10-18 23:14:41.160  INFO 88321 --- [nio-8080-exec-5] com.ybchen.controller.DemoController     : <0><11477324998899392> [id:"10087"] 這是第三條日志---->簡(jiǎn)單例子
2022-10-18 23:14:41.161  INFO 88321 --- [      Thread-13] com.ybchen.controller.DemoController     : <0><11477324998899392> [id:"10087"] 這是異步日志---->簡(jiǎn)單例子
2022-10-18 23:14:43.938  INFO 88321 --- [nio-8080-exec-6] com.ybchen.controller.DemoController     : <0><11477325181023936> [id:"10085"] 這是第一條日志---->簡(jiǎn)單例子
2022-10-18 23:14:43.939  INFO 88321 --- [nio-8080-exec-6] com.ybchen.controller.DemoController     : <0><11477325181023936> [id:"10085"] 這是第二條日志---->簡(jiǎn)單例子
2022-10-18 23:14:43.939  INFO 88321 --- [nio-8080-exec-6] com.ybchen.controller.DemoController     : <0><11477325181023936> [id:"10085"] 這是第三條日志---->簡(jiǎn)單例子
2022-10-18 23:14:43.940  INFO 88321 --- [      Thread-14] com.ybchen.controller.DemoController     : <0><11477325181023936> [id:"10085"] 這是異步日志---->簡(jiǎn)單例子

示例二

    @TLogAspect({"id", "name"})
    @GetMapping("demo2")
    public void demo2(String id, String name) {
        log.info("這是第一條日志----->多個(gè)數(shù)值");
        log.info("這是第二條日志----->多個(gè)數(shù)值");
        log.info("這是第三條日志----->多個(gè)數(shù)值");
        new Thread(() -> log.info("這是異步日志----->多個(gè)數(shù)值")).start();
    }
2022-10-18 23:22:33.941  INFO 88321 --- [nio-8080-exec-8] com.ybchen.controller.DemoController     : <0><11477355982223040> [id:"10085",name:"alex"] 這是第一條日志----->多個(gè)數(shù)值
2022-10-18 23:22:33.946  INFO 88321 --- [nio-8080-exec-8] com.ybchen.controller.DemoController     : <0><11477355982223040> [id:"10085",name:"alex"] 這是第二條日志----->多個(gè)數(shù)值
2022-10-18 23:22:33.947  INFO 88321 --- [nio-8080-exec-8] com.ybchen.controller.DemoController     : <0><11477355982223040> [id:"10085",name:"alex"] 這是第三條日志----->多個(gè)數(shù)值
2022-10-18 23:22:33.950  INFO 88321 --- [      Thread-15] com.ybchen.controller.DemoController     : <0><11477355982223040> [id:"10085",name:"alex"] 這是異步日志----->多個(gè)數(shù)值
2022-10-18 23:22:37.744  INFO 88321 --- [nio-8080-exec-9] com.ybchen.controller.DemoController     : <0><11477356232308416> [id:"10086",name:"alex"] 這是第一條日志----->多個(gè)數(shù)值
2022-10-18 23:22:37.744  INFO 88321 --- [nio-8080-exec-9] com.ybchen.controller.DemoController     : <0><11477356232308416> [id:"10086",name:"alex"] 這是第二條日志----->多個(gè)數(shù)值
2022-10-18 23:22:37.744  INFO 88321 --- [nio-8080-exec-9] com.ybchen.controller.DemoController     : <0><11477356232308416> [id:"10086",name:"alex"] 這是第三條日志----->多個(gè)數(shù)值
2022-10-18 23:22:37.745  INFO 88321 --- [      Thread-16] com.ybchen.controller.DemoController     : <0><11477356232308416> [id:"10086",name:"alex"] 這是異步日志----->多個(gè)數(shù)值

示例三

    @TLogAspect(value = {"id", "name"}, pattern = "<-{}->", joint = "_")
    @GetMapping("demo3")
    public void demo3(String id, String name) {
        log.info("多個(gè)數(shù)值-------->加了patter和joint的示例");
    }
2022-10-18 23:24:52.137  INFO 88321 --- [nio-8080-exec-1] com.ybchen.controller.DemoController     : <0><11477365039888064> <-id:"10086"_name:"alex"-> 多個(gè)數(shù)值-------->加了patter和joint的示例
2022-10-18 23:24:56.329  INFO 88321 --- [nio-8080-exec-2] com.ybchen.controller.DemoController     : <0><11477365314614976> <-id:"10089"_name:"alex"-> 多個(gè)數(shù)值-------->加了patter和joint的示例

示例四

    @TLogAspect(str = "陳彥斌博客地址:https://www.cnblogs.com/chenyanbin/")
    @GetMapping("demo4")
    public void demo4(String name){
        log.info("這是第一條日志----->常量字符串標(biāo)簽");
        log.info("這是第二條日志----->常量字符串標(biāo)簽");
        log.info("這是第三條日志----->常量字符串標(biāo)簽");
        new Thread(() -> log.info("這是異步日志----->常量字符串標(biāo)簽")).start();
    }
2022-10-18 23:29:25.801  INFO 10245 --- [nio-8080-exec-4] com.ybchen.controller.DemoController     : <0><11477382974797504> [陳彥斌博客地址:https://www.cnblogs.com/chenyanbin/] 這是第一條日志----->常量字符串標(biāo)簽
2022-10-18 23:29:25.802  INFO 10245 --- [nio-8080-exec-4] com.ybchen.controller.DemoController     : <0><11477382974797504> [陳彥斌博客地址:https://www.cnblogs.com/chenyanbin/] 這是第二條日志----->常量字符串標(biāo)簽
2022-10-18 23:29:25.802  INFO 10245 --- [nio-8080-exec-4] com.ybchen.controller.DemoController     : <0><11477382974797504> [陳彥斌博客地址:https://www.cnblogs.com/chenyanbin/] 這是第三條日志----->常量字符串標(biāo)簽
2022-10-18 23:29:25.803  INFO 10245 --- [       Thread-8] com.ybchen.controller.DemoController     : <0><11477382974797504> [陳彥斌博客地址:https://www.cnblogs.com/chenyanbin/] 這是異步日志----->常量字符串標(biāo)簽
2022-10-18 23:29:30.216  INFO 10245 --- [nio-8080-exec-5] com.ybchen.controller.DemoController     : <0><11477383264138944> [陳彥斌博客地址:https://www.cnblogs.com/chenyanbin/] 這是第一條日志----->常量字符串標(biāo)簽
2022-10-18 23:29:30.217  INFO 10245 --- [nio-8080-exec-5] com.ybchen.controller.DemoController     : <0><11477383264138944> [陳彥斌博客地址:https://www.cnblogs.com/chenyanbin/] 這是第二條日志----->常量字符串標(biāo)簽
2022-10-18 23:29:30.217  INFO 10245 --- [nio-8080-exec-5] com.ybchen.controller.DemoController     : <0><11477383264138944> [陳彥斌博客地址:https://www.cnblogs.com/chenyanbin/] 這是第三條日志----->常量字符串標(biāo)簽
2022-10-18 23:29:30.218  INFO 10245 --- [       Thread-9] com.ybchen.controller.DemoController     : <0><11477383264138944> [陳彥斌博客地址:https://www.cnblogs.com/chenyanbin/] 這是異步日志----->常量字符串標(biāo)簽

示例五

@TLogAspect支持點(diǎn)操作符,適用于對(duì)象的取值简珠,支持類型:

  • Bean對(duì)象
  • Map對(duì)象
  • Json格式的字符串
  • Fastjson的JSONObject對(duì)象
    @TLogAspect({"request.id","request.age"})
    @GetMapping("demo5")
    public void demo4(PersonRequest request){

        log.info("多參數(shù)加多層級(jí)示例");
    }



================



@Data
public class PersonRequest {
    private Long id;
    private Long age;
    private String name;
}
2022-10-18 23:32:58.761  INFO 14747 --- [nio-8080-exec-2] com.ybchen.controller.DemoController     : <0><11477396931212992> [request.id:10089,request.age:27] 多參數(shù)加多層級(jí)示例
2022-10-18 23:33:03.289  INFO 14747 --- [nio-8080-exec-3] com.ybchen.controller.DemoController     : <0><11477397228025536> [request.id:10099,request.age:27] 多參數(shù)加多層級(jí)示例
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末阶界,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子聋庵,更是在濱河造成了極大的恐慌荐操,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件珍策,死亡現(xiàn)場(chǎng)離奇詭異托启,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)攘宙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門屯耸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拐迁,“玉大人,你說我怎么就攤上這事疗绣∠哒伲” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵多矮,是天一觀的道長(zhǎng)缓淹。 經(jīng)常有香客問我,道長(zhǎng)塔逃,這世上最難降的妖魔是什么讯壶? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮湾盗,結(jié)果婚禮上伏蚊,老公的妹妹穿的比我還像新娘。我一直安慰自己格粪,他們只是感情好躏吊,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著帐萎,像睡著了一般比伏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上疆导,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天赁项,我揣著相機(jī)與錄音,去河邊找鬼是鬼。 笑死肤舞,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的均蜜。 我是一名探鬼主播李剖,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼囤耳!你這毒婦竟也來了篙顺?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤充择,失蹤者是張志新(化名)和其女友劉穎德玫,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體椎麦,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宰僧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了观挎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片琴儿。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡段化,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出造成,到底是詐尸還是另有隱情显熏,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布晒屎,位于F島的核電站喘蟆,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏鼓鲁。R本人自食惡果不足惜蕴轨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望坐桩。 院中可真熱鬧尺棋,春花似錦封锉、人聲如沸绵跷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽碾局。三九已至,卻和暖如春奴艾,著一層夾襖步出監(jiān)牢的瞬間净当,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工蕴潦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留像啼,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓潭苞,卻偏偏與公主長(zhǎng)得像忽冻,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子此疹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容