精华内容
下载资源
问答
  • QQ空间日志备份工具,可方便快捷的备份空间日志,并导出为网页、Word和文本格式。提醒:QQ空间权限要设置为任何人可以访问(如果有安全需要,可以备份后再修改回原来的设置)
  • 等到将来有一天,看到自己辛苦的大作成了一本本巨著,那该是多么的有成就感……当然,如果好友权限许可,还可以帮好友备份啦~特别提醒那些追MM的,如果将你心爱的女孩子的日志做成电子书送给她,你能想象下她会有...
  • QQ空间日志备份导出工具,独家支持转载日志的处理,独家支持未审核通过日志的备份,独家支持QQ空间升级后的日志备份和导出,支持日志中图片(包括外链)下载到本地,并完美导出成本地网页文件。 详细介绍 相信QQ...
  • 1、您QQ空间设置访问权限为“回答问题”、或者“指定好友可见”,好友不在指定的权限之内,这两种情况您更新内容后,好友空间动态里不会收到提醒;2、您QQ空间设置“自己的动态更新通知到所有好友”的情况,...

    展开全部

    QQ空间更新了说说后,好友空间动态没有收到提醒,可能会有以下几种情况影32313133353236313431303231363533e58685e5aeb931333365633865响:

    1、您QQ空间设置访问权限为“回答问题”、或者“指定好友可见”,好友不在指定的权限之内,这两种情况在您更新内容后,好友空间动态里不会收到提醒;

    2、您QQ空间设置“自己的动态更新不通知到所有好友”的情况,好友空间动态则无法显示。建议您修改动态隐私设置,点击这里了解设置方法;

    3、好友的个人中心动态设置了忽略您的空间更新,建议联系好友,让对方设置关注您的空间更新;

    4、好友的个人中心动态设置了忽略说说更新,建议联系好友,让对方设置关注好友的说说更新。

    官方解决办法:将自己空间的访问权限设置为完全公开。然后在出现的“将QQ空间日志和照片更新显示在QQ上”勾选。

    另外:QQ空间6.0版要在好友空间显示自己的动态:可以在:空间设置→同步设置,全勾选起来。

    在升级6.0QQ空间后、访问权限为非完全公开的QQ空间动态更新在好友个中心中将无法显示。只有访问权限设置为完全公开的或是所有好友可见的QQ空间才能在好友的个人中心显示自己空间动态。

    注意:当自己的空间设置了为指定好友可见、这时自己的QQ空间动态更新就不能再显示在好友个人中心里了。好友必需访问空间才能见到你的更新。

    空间升级到6.0以后,就会遇到这个情况。现在升级到6.0后想换回5.0版本的又换不了。还说是什么升级优化,越来越差。去官方网址反应这个糟糕的升级优化情况。我也反应了,都没人理会的。发动大家都去反应下。人多力量大,才能引起重视。强烈要求让他们把这那个功能还给QQ用户!强烈要求让他们把这那个功能还给QQ用户!强烈要求让他们把这那个功能还给QQ用户!

    不是想着那些空间记录,真想放弃用QQ空间了。

    QQ空间6.0优化得相当失败。现在连留言时原来精美的签名档也无法自动显示了。

    展开全文
  • 可能会有以下几种情况影响:1、您QQ空间设置访问权限为“回答问题”、或者“指定好友可见”,好友不在指定的权限之内,这两种情况您更新内容后,好友空间动态里不会收到提醒;2、您QQ空间设置“自己的动态更新...

    展开全部

    QQ空间更新了说说后,好友空636f707962616964757a686964616f31333365646339间动态没有收到提醒,可能会有以下几种情况影响:

    1、您QQ空间设置访问权限为“回答问题”、或者“指定好友可见”,好友不在指定的权限之内,这两种情况在您更新内容后,好友空间动态里不会收到提醒;

    2、您QQ空间设置“自己的动态更新不通知到所有好友”的情况,好友空间动态则无法显示。建议您修改动态隐私设置,点击这里了解设置方法;

    3、好友的个人中心动态设置了忽略您的空间更新,建议联系好友,让对方设置关注您的空间更新;

    4、好友的个人中心动态设置了忽略说说更新,建议联系好友,让对方设置关注好友的说说更新。

    官方解决办法:将自己空间的访问权限设置为完全公开。然后在出现的“将QQ空间日志和照片更新显示在QQ上”勾选。

    另外:QQ空间6.0版要在好友空间显示自己的动态:可以在:空间设置→同步设置,全勾选起来。

    在升级6.0QQ空间后、访问权限为非完全公开的QQ空间动态更新在好友个中心中将无法显示。只有访问权限设置为完全公开的或是所有好友可见的QQ空间才能在好友的个人中心显示自己空间动态。

    注意:当自己的空间设置了为指定好友可见、这时自己的QQ空间动态更新就不能再显示在好友个人中心里了。好友必需访问空间才能见到你的更新。

    空间升级到6.0以后,就会遇到这个情况。现在升级到6.0后想换回5.0版本的又换不了。还说是什么升级优化,越来越差。去官方网址反应这个糟糕的升级优化情况。我也反应了,都没人理会的。发动大家都去反应下。人多力量大,才能引起重视。强烈要求让他们把这那个功能还给QQ用户!强烈要求让他们把这那个功能还给QQ用户!强烈要求让他们把这那个功能还给QQ用户!

    不是想着那些空间记录,真想放弃用QQ空间了。

    QQ空间6.0优化得相当失败。现在连留言时原来精美的签名档也无法自动显示了。

    展开全文
  • 惊讶!我定的日志规范被CTO全公司推广了

    千次阅读 多人点赞 2019-12-24 08:22:00
    打印日志是一门艺术,但长期被开发同学所忽视。日志就像车辆保险,没人愿意为保险付钱,但是一旦出了问题都又想有保险可用。我们打印日志的时候都很随意,可是用的时候会吐槽各种 SB 包括自己!写...

    打印日志是一门艺术,但长期被开发同学所忽视。日志就像车辆保险,没人愿意为保险付钱,但是一旦出了问题都又想有保险可用。我们打印日志的时候都很随意,可是用的时候会吐槽各种 SB 包括自己!写好每一条日志吧,与君共勉!

    1. 日志

    1.1 日志是什么?

    日志,维基百科的定义是记录服务器等电脑设备或软件的运作。

     

    日志文件提供精确的系统记录,根据日志最终定位到错误详情和根源。日志的特点是,它描述一些离散的(不连续的)事件。例如:应用通过一个滚动的文件输出 INFO 或 ERROR 信息,并通过日志收集系统,存储到一些存储引擎(Elasticsearch)中方便查询。

    1.2 日志有什么用?

    在上文中我们解释了日志的作用是提供精准的系统记录方便根因分析。那么具体在哪些具体方面它可以发挥作用?

     

    • 打印调试:即可以用日志来记录变量或者某一段逻辑。记录程序运行的流程,即程序运行了哪些代码,方便排查逻辑问题。

    • 问题定位:程序出异常或者出故障时快速的定位问题,方便后期解决问题。因为线上生产环境无法 debug,在测试环境去模拟一套生产环境,费时费力。所以依靠日志记录的信息定位问题,这点非常重要。还可以记录流量,后期可以通过 ELK(包括 EFK 进行流量统计)。

    • 用户行为日志:记录用户的操作行为,用于大数据分析,比如监控、风控、推荐等等。这种日志,一般是给其他团队分析使用,而且可能是多个团队,因此一般会有一定的格式要求,开发者应该按照这个格式来记录,便于其他团队的使用。当然,要记录哪些行为、操作,一般也是约定好的,因此,开发者主要是执行的角色。

    • 根因分析(甩锅必备:即在关键地方记录日志。方便在和各个终端定位问题时,别人说时你的程序问题,你可以理直气壮的拿出你的日志说,看,我这里运行了,状态也是对的。这样,对方就会乖乖去定位他的代码,而不是互相推脱。

    1.3 什么时候记录日志?

    上文说了日志的重要性,那么什么时候需要记录日志。

     

    • 系统初始化:系统或者服务的启动参数。核心模块或者组件初始化过程中往往依赖一些关键配置,根据参数不同会提供不一样的服务。务必在这里记录 INFO 日志,打印出参数以及启动完成态服务表述。

    • 编程语言提示异常:如今各类主流的编程语言都包括异常机制,业务相关的流行框架有完整的异常模块。这类捕获的异常是系统告知开发人员需要加以关注的,是质量非常高的报错。应当适当记录日志,根据实际结合业务的情况使用 WARN 或者 ERROR 级别。

    • 业务流程预期不符:除开平台以及编程语言异常之外,项目代码中结果与期望不符时也是日志场景之一,简单来说所有流程分支都可以加入考虑。取决于开发人员判断能否容忍情形发生。常见的合适场景包括外部参数不正确,数据处理问题导致返回码不在合理范围内等等。

    • 系统核心角色,组件关键动作:系统中核心角色触发的业务动作是需要多加关注的,是衡量系统正常运行的重要指标,建议记录 INFO 级别日志,比如电商系统用户从登录到下单的整个流程;微服务各服务节点交互;核心数据表增删改;核心组件运行等等,如果日志频度高或者打印量特别大,可以提炼关键点 INFO 记录,其余酌情考虑 DEBUG 级别。

    • 第三方服务远程调用:微服务架构体系中有一个重要的点就是第三方永远不可信,对于第三方服务远程调用建议打印请求和响应的参数,方便在和各个终端定位问题,不会因为第三方服务日志的缺失变得手足无措。

    2. 日志打印

    2.1 Slf4j & Logback

    Slf4j 英文全称为 “ Simple Logging Facade for Java ”,为 Java 提供的简单日志门面。Facade 门面,更底层一点说就是接口。它允许用户以自己的喜好,在工程中通过 Slf4j 接入不同的日志系统。

     

    Logback 是 Slf4j 的原生实现框架,同样也是出自 Log4j 一个人之手,但拥有比 Log4j 更多的优点、特性和更做强的性能,Logback 相对于 Log4j 拥有更快的执行速度。基于我们先前在 Log4j  上的工作,Logback 重写了内部的实现,在某些特定的场景上面,甚至可以比之前的速度快上 10 倍。在保证 Logback 的组件更加快速的同时,同时所需的内存更加少。

    2.2 日志文件

    日志文件放置于固定的目录中,按照一定的模板进行命名,推荐的日志文件名称:

    当前正在写入的日志文件名:<应用名>[-<功能名>].log
    如:example-server-book-service-access.log
    
    
    已经滚入历史的日志文件名:<应用名>[-<功能名>].yyyy-MM-dd-hh.[滚动号].log
    如:example-server-book-service-access.2019-12-01-10.1.log
    

     

    2.3 日志变量定义

    推荐使用 lombok(代码生成器) 注解 @lombok.extern.slf4j.Slf4j 来生成日志变量实例。

     

    <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.10</version>
        <scope>provided</scope>
    </dependency>
    

     

    代码示例

    import lombok.extern.slf4j.Slf4j;
    
    
    @Slf4j
    public class LogTest {
        public static void main(String[] args) {
            log.info("this is log test");
        }
    }
    

    2.4 日志配置

    日志记录采用分级记录,级别与日志文件名相对应,不同级别的日志信息记录到不同的日志文件中。如有特殊格式日志,如 access log,单独使用一个文件,请注意避免重复打印(可使用 additivity="false" 避免 )。

     

    2.5 参数占位格式

    使用参数化形式 {} 占位,[] 进行参数隔离,这样的好处是可读性更高,而且只有真正准备打印的时候才会处理参数。

     

    // 正确示例,必须使用参数化信息的方式
    log.debug("order is paying with userId:[{}] and orderId : [{}]",userId, orderId);
    // 错误示例,不要进行字符串拼接,那样会产生很多 String 对象,占用空间,影响性能。及日志级别高于此级别也会进行字符串拼接逻辑。
    log.debug("order is paying with userId: " + userId + " and orderId: " + orderId);
    
    2.6 日志的基本格式
    
    

    2.6.1 日志时间

    作为日志产生的日期和时间,这个数据非常重要,一般精确到毫秒。

     

    yyyy-MM-dd HH:mm:ss.SSS
    

    2.6.2 日志级别

    日志的输出都是分级别的,不同的设置不同的场合打印不同的日志。

     

    主要使用如下的四个级别:

    • DEBUG:DEUBG 级别的主要输出调试性质的内容,该级别日志主要用于在开发、测试阶段输出。该级别的日志应尽可能地详尽,开发人员可以将各类详细信息记录到 DEBUG 里,起到调试的作用,包括参数信息,调试细节信息,返回值信息等等,便于在开发、测试阶段出现问题或者异常时,对其进行分析。

    • INFO:INFO 级别的主要记录系统关键信息,旨在保留系统正常工作期间关键运行指标,开发人员可以将初始化系统配置、业务状态变化信息,或者用户业务流程中的核心处理记录到INFO日志中,方便日常运维工作以及错误回溯时上下文场景复现。建议在项目完成后,在测试环境将日志级别调成 INFO,然后通过 INFO 级别的信息看看是否能了解这个应用的运用情况,如果出现问题后是否这些日志能否提供有用的排查问题的信息。

    • WARN:WARN 级别的主要输出警告性质的内容,这些内容是可以预知且是有规划的,比如,某个方法入参为空或者该参数的值不满足运行该方法的条件时。在 WARN 级别的时应输出较为详尽的信息,以便于事后对日志进行分析。

    • ERROR:ERROR 级别主要针对于一些不可预知的信息,诸如:错误、异常等,比如,在 catch 块中抓获的网络通信、数据库连接等异常,若异常对系统的整个流程影响不大,可以使用 WARN 级别日志输出。在输出 ERROR 级别的日志时,尽量多地输出方法入参数、方法执行过程中产生的对象等数据,在带有错误、异常对象的数据时,需要将该对象一并输出。

    2.6.3 DEBUG / INFO 的选择

     

    DEBUG 级别比 INFO 低,包含调试时更详细的了解系统运行状态的东西,比如变量的值等等,都可以输出到 DEBUG 日志里。INFO 是在线日志默认的输出级别,反馈系统的当前状态给最终用户看的。输出的信息,应该对最终用户具有实际意义的。从功能角度上说,INFO 输出的信息可以看作是软件产品的一部分,所以需要谨慎对待,不可随便输出。如果这条日志会被频繁打印或者大部分时间对于纠错起不到作用,就应当考虑下调为 DEBUG 级别。

    • 由于 DEBUG 日志打印量远大于 INFO,出于前文日志性能的考虑,如果代码为核心代码,执行频率非常高,务必推敲日志设计是否合理,是否需要下调为 DEBUG 级别日志。

    • 注意日志的可读性,不妨在写完代码 review 这条日志是否通顺,能否提供真正有意义的信息。

    • 日志输出是多线程公用的,如果有另外一个线程正在输出日志,上面的记录就会被打断,最终显示输出和预想的就会不一致。

    2.6.4 WARN / ERROR 的选择

     

    当方法或者功能处理过程中产生不符合预期结果或者有框架报错时可以考虑使用,常见问题处理方法包括:

    • 增加判断处理逻辑,尝试本地解决:增加逻辑判断吞掉报警永远是最优选择抛出异常,交给上层逻辑解决

    • 抛出异常,交给上层逻辑解决

    • 记录日志,报警提醒

    • 使用返回码包装错误做返回

    一般来说,WARN 级别不会短信报警,ERROR 级别则会短信报警甚至电话报警,ERROR 级别的日志意味着系统中发生了非常严重的问题,必须有人马上处理,比如数据库不可用,系统的关键业务流程走不下去等等。错误的使用反而带来严重的后果,不区分问题的重要程度,只要有问题就error记录下来,其实这样是非常不负责任的,因为对于成熟的系统,都会有一套完整的报错机制,那这个错误信息什么时候需要发出来,很多都是依据单位时间内 ERROR 日志的数量来确定的。

     

    2.6.5 强调ERROR报警

    • ERROR 级别的日志打印通常伴随报警通知。ERROR的报出应该伴随着业务功能受损,即上面提到的系统中发生了非常严重的问题,必须有人马上处理。

    ERROR日志目标

    • 给处理者直接准确的信息:ERROR 信息形成自身闭环。

    问题定位:

    • 发生了什么问题,哪些功能受到影响

    • 获取帮助信息:直接帮助信息或帮助信息的存储位置

    • 通过报警知道解决方案或者找何人解决

    2.6.6 线程名称

    输出该日志的线程名称,一般在一个应用中一个同步请求由同一线程完成,输出线程名称可以在各个请求产生的日志中进行分类,便于分清当前请求上下文的日志。

    2.6.7 opentracing 标识

    在分布式应用中,用户的一个请求会调用若干个服务完成,这些服务可能还是嵌套调用的,因此完成一个请求的日志并不在一个应用的日志文件,而是分散在不同服务器上不同应用节点的日志文件中。该标识是为了串联一个请求在整个系统中的调用日志。

    • 唯一字符串(trace id)

    • 调用层级(span id)

    通过搜索 trace id 就可以查到这个 trace id 标识的请求在整个系统中流转(处理)过程中产生的所有日志。

    2.6.8 biz 标识

    在业务开发中,我们的日志都是和业务相关联的,有时候是需要根据用户或者业务做聚类的,因此一次请求如果可以通过某项标识做聚类的时候,可以将聚类标识打印到日志中。

     

    • 用户标识(user id)

    • 业务标识(biz id)

    2.6.9 日志记录器名称

    日志记录器名称一般使用类名,日志文件中可以输出简单的类名即可,看实际情况是否需要使用包名和行号等信息。主要用于看到日志后到哪个类中去找这个日志输出,便于定位问题所在。

    2.6.10 日志内容

    禁用 System.out.println 和 System.err.println

    变参替换日志拼接

    输出日志的对象,应在其类中实现快速的 toString 方法,以便于在日志输出时仅输出这个对象类名和 hashCode

    预防空指针:不要在日志中调用对象的方法获取值,除非确保该对象肯定不为 null,否则很有可能会因为日志的问题而导致应用产生空指针异常。

     

    2.6.11 异常堆栈

    异常堆栈一般会出现在 ERROR 或者 WARN 级别的日志中,异常堆栈含有方法调用链的系统,以及异常产生的根源。异常堆栈的日志属于上一行日志的,在日志收集时需要将其划至上一行中。

    2.7 最佳实践

    2.7.1 日志格式

    2019-12-01 00:00:00.000|pid|log-level|[svc-name,trace-id,span-id,user-id,biz-id]|thread-name|package-name.class-name : log message
    
    • 时间

    • pid,pid

    • log-level,日志级别

    • svc-name,应用名称

    • trace-id,调用链标识

    • span-id,调用层级标识

    • user-id,用户标识

    • biz-id,业务标识

    • thread-name,线程名称

    • package-name.class-name,日志记录器名称

    • log message,日志消息体

     

    2.7.2 日志模块扩展

    日志模块是基于以下技术点做扩展的。

     

    • Slf4j MDC 实现原理(暂不开展详解,如有兴趣私下沟通)

    • Opentracing Scope 原理(暂不开展详解,如有兴趣私下沟通)

     

    在每个 tracing 链路中,将 Opentracing Scope 中的上下文信息放置 MDC 中,根据 Spring Boot Logging 扩展接口扩展的取值逻辑 logging.pattern.level 的取值逻辑。

     

    相关源码参考:

     

    Spring Cloud Sleuth:

    https://github.com/spring-cloud/spring-cloud-sleuth/blob/master/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/TraceEnvironmentPostProcessor.java

     

    https://github.com/spring-cloud/spring-cloud-sleuth/blob/master/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/log/Slf4jCurrentTraceContext.java

     

    修改 logback 配置文件中每个 appender 的 pattern 为以下默认值即可实现标准化。

     

    %d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}|${PID:- }|%level|${LOG_LEVEL_PATTERN:-%5p}|%t|%-40.40logger{39}: %msg%n
    

    logback.xml 节选

    <configuration><property name="LOG_PATH"
              value="${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}"/>
    
    
    
    
    <springProperty scope="context" name="APP_NAME"
                    source="spring.application.name" defaultValue="spring-boot-fusion"/>
    <!-- 全局统一 pattern -->
    <property name="LOG_PATTERN"
              value="%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}|${PID:- }|%level|${LOG_LEVEL_PATTERN:-%5p}|%t|%-40.40logger{39}: %msg%n"/>
    <!-- 输出模式 file,滚动记录文件,先将日志文件指定到文件,当符合某个条件时,将日志记录到其他文件 -->
    <appender name="fileInfo" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。-->
        <file>${LOG_PATH}/${APP_NAME}-info.log</file>
        <!--滚动策略  基于时间的分包策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- yyyy-MM-dd 时间策略则为一天一个文件 -->
            <FileNamePattern>${LOG_PATH}/${APP_NAME}-info.%d{yyyy-MM-dd-HH}.%i.log</FileNamePattern>
            <!--日志文件保留小时数-->
            <MaxHistory>48</MaxHistory>
            <maxFileSize>1GB</maxFileSize>
            <totalSizeCap>20GB</totalSizeCap>
        </rollingPolicy>
        <!--  layout 负责把事件转换成字符串,格式化的日志信息的输出 -->
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>${LOG_PATTERN}</pattern>
        </layout>
        <!--级别过滤器,根据日志级别进行过滤。如果日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志-->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!--设置过滤级别-->
            <level>INFO</level>
            <!--用于配置符合过滤条件的操作-->
            <onMatch>ACCEPT</onMatch>
            <!--用于配置不符合过滤条件的操作-->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    </configuration>
    

     

    代码使用示例:

     

    @Override
    public Result<PagingObject<SimpleResponse>> page(@RequestParam(value = "page-num", defaultValue = "1") int pageNum,
                                                     @RequestParam(value = "page-size", defaultValue = "10") int pageSize) {
        LogStandardUtils.putUserId("userId123");
        LogStandardUtils.putBizId("bizId321");
        producerService.sendMsg("xxx");
        simpleClient.page(pageNum, pageSize);
        return new Result<>(simpleService.page(pageNum, pageSize));
    }
    

     

    日志记录

    2019-12-04 16:29:08.223|43546|INFO|[example-server-book-service,ac613cff04bac8b1,4a9adc10fdf0eb5,userId123,bizId321]|XNIO-1 task-4|c.n.u.concurrent.ShutdownEnabledTimer   : Shutdown hook installed for: NFLoadBalancer-PingTimer-example-server-order-service
    2019-12-04 16:29:08.224|43546|INFO|[example-server-book-service,ac613cff04bac8b1,4a9adc10fdf0eb5,userId123,bizId321]|XNIO-1 task-4|c.netflix.loadbalancer.BaseLoadBalancer : Client: example-server-order-service instantiated a LoadBalancer: DynamicServerListLoadBalancer:{NFLoadBalancer:name=example-server-order-service,current list of Servers=[],Load balancer stats=Zone stats: {},Server stats: []}ServerList:null
    2019-12-04 16:29:08.234|43546|INFO|[example-server-book-service,ac613cff04bac8b1,4a9adc10fdf0eb5,userId123,bizId321]|XNIO-1 task-4|c.n.l.DynamicServerListLoadBalancer     : Using serverListUpdater PollingServerListUpdater
    2019-12-04 16:29:08.247|43546|INFO|[example-server-book-service,ac613cff04bac8b1,4a9adc10fdf0eb5,userId123,bizId321]|XNIO-1 task-4|c.n.l.DynamicServerListLoadBalancer     : DynamicServerListLoadBalancer for client example-server-order-service initialized: DynamicServerListLoadBalancer:{NFLoadBalancer:name=example-server-order-service,current list of Servers=[],Load balancer stats=Zone stats: {},Server stats: []}ServerList:ConsulServerList{serviceId='example-server-order-service', tag=null}
    2019-12-04 16:29:08.329|43546|WARN|[example-server-book-service,ac613cff04bac8b1,4a9adc10fdf0eb5,userId123,bizId321]|XNIO-1 task-4|c.p.f.l.ctl.common.rule.StrategyRule    : No up servers available from load balancer: DynamicServerListLoadBalancer:{NFLoadBalancer:name=example-server-order-service,current list of Servers=[],Load balancer stats=Zone stats: {},Server stats: []}ServerList:ConsulServerList{serviceId='example-server-order-service', tag=null}
    2019-12-04 16:29:08.334|43546|WARN|[example-server-book-service,ac613cff04bac8b1,4a9adc10fdf0eb5,userId123,bizId321]|XNIO-1 task-4|c.p.f.l.ctl.common.rule.StrategyRule    : No up servers available from load balancer: DynamicServerListLoadBalancer:{NFLoadBalancer:name=example-server-order-service,current list of Servers=[],Load balancer stats=Zone stats: {},Server stats: []}ServerList:ConsulServerList{serviceId='example-server-order-service', tag=null}
    2019-12-04 16:29:08.342|43546|ERROR|[example-server-book-service,ac613cff04bac8b1,4a9adc10fdf0eb5,userId123,bizId321]|XNIO-1 task-4|c.p.f.w.c.advice.ExceptionHandlerAdvice : 当前程序进入到异常捕获器,出错的 url 为:[ http://127.0.0.1:10011/simples ],出错的参数为:[ {"querystring":"{}","payload":""} ]
    java.lang.RuntimeException: com.netflix.client.ClientException: Load balancer does not have available server for client: example-server-order-service
    
    3 日志服务
    

    3.1 SLS 阿里云日志服务

    阿里云日志服务(简称 SLS)是针对日志类数据的一站式服务,在阿里巴巴集团经历大量大数据场景锤炼而成。您无需开发就能快捷完成日志数据采集、消费、投递以及查询分析等功能,提升运维、运营效率,建立 DT 时代海量日志处理能力。

    project

    项目、管理日志基础单元,服务日志建议一个环境建为一个 Project,这样日志记录是整体一个闭环,日志记录随整个环境内的服务调用产生。

    logstore

    日志库,日志库建议按照日志类型分为不同的,如特定格式的 access 日志,以及 info / warn / error 日志,特定格式可以配置更为方面的索引以及告警设置。

    注意:请勿按照应用服务区分为不同的 logstore,在微服务架构中,一次请求交叉了多个应用服务,日志是散落在各个应用服务中的,按照服务区分 logstore,需要开发同学十分了解应用运行状况和调用拓扑图,这点往往是不具备的。

    实时采集与消费

    功能:

    • 通过ECS、容器、移动端、开源软件、JS等接入实时日志数据(例如Metric、Event、BinLog、TextLog、Click等)。

    • 提供实时消费接口,与实时计算及服务对接。

    用途:数据清洗(ETL)、流计算(Stream Compute)、监控与报警、 机器学习与迭代计算。

     

                 

    查询分析

    实时索引、查询分析数据。

    • 查询:关键词、模糊、上下文、范围。

    • 统计:SQL聚合等丰富查询手段。

    • 可视化:Dashboard + 报表功能。

    • 对接:Grafana、JDBC/SQL92。

    用途:DevOps / 线上运维,日志实时数据分析,安全诊断与分析,运营与客服系统。

     

                 

    消费投递

    稳定可靠的日志投递。将日志中枢数据投递至存储类服务进行存储。支持压缩、自定义Partition、以及行列等各种存储方式。

    用途:数据仓库 + 数据分析、审计、推荐系统与用户画像。

     

                 

    告警

    日志服务的告警功能基于仪表盘中的查询图表实现。在日志服务控制台查询页面仪表盘页面设置告警规则,并指定告警规则的配置、检查条件和通知方式。设置告警后,日志服务定期对仪表盘的查询结果进行检查,检查结果满足预设条件时发送告警通知,实现实时的服务状态监控。

     

    最佳实践

    阿里云的日志服务功能相当强大,想用好日志服务可以参考:

     

    https://help.aliyun.com/document_detail/29090.html?spm=a2c4g.11186623.6.1079.4edd3aabvs50OW

    3.2 ELK 通用日志解决方案

    ELK 是 Elasticsearch、Logstash、Kibana 三大开源框架首字母大写简称。市面上也被成为 Elastic Stack。其中 Elasticsearch 是一个基于 Lucene、分布式、通过 Restful 方式进行交互的近实时搜索平台框架。像类似百度、谷歌这种大数据全文搜索引擎的场景都可以使用 Elasticsearch 作为底层支持框架,可见 Elasticsearch 提供的搜索能力确实强大,市面上很多时候我们简称 Elasticsearch 为 es。Logstash 是 ELK 的中央数据流引擎,用于从不同目标(文件/数据存储/MQ)收集的不同格式数据,经过过滤后支持输出到不同目的地(文件/ MQ / Redis / Elasticsearch / Kafka 等)。Kibana 可以将 Elasticsearch 的数据通过友好的页面展示出来,提供实时分析的功能。

    4 实践说明

    普通格式日志

    2019-11-26 15:01:03.332|1543|INFO|[example-server-book-service,28f019d57b8336ab,630697c7f34ca4fa,105,45982043|XNIO-1 task-42]|c.p.f.w.pay.PayServiceImpl     : order is paying with userId: 105 and orderId: 45982043
    
     
    

    普通日志前缀是固定的,可以固定分词索引,方便更快的查询分析。

    特定格式日志

    以 access 日志为例

     

    2019-11-26 15:01:03.332|1543|INFO|[example-server-book-service,28f019d57b8336ab,630697c7f34ca4fa,105,45982043|XNIO-1 task-42]|c.p.f.w.logging.AccessLoggingFilter     :
    > url: http://liweichao.com:10011/actuator/health
    > http-method: GET
    > request-header: [Accept:"text/plain, text/*, */*", Connection:"close", User-Agent:"Consul Health Check", Host:"liweichao.com:10011", Accept-Encoding:"gzip"]
    > request-time: 2019-11-26 15:01:03.309
    > querystring: -
    > payload: -
    > extra-param: -
    
    
    
    
    < response-time: 2019-11-26 15:01:03.332
    < take-time: 23
    < http-status: 200
    < response-header: [content-type:"application/vnd.spring-boot.actuator.v2+json;charset=UTF-8", content-size:"15"]
    < response-data: {"status":"UP"}
    

     

    特定格式日志可按格式创建索引更方便聚焦查询分析和告警,如根据 take-time,http-status,biz-code 等值。

     

    参考文献

    • Java日志记录最佳实践 :https://www.jianshu.com/p/546e9aace657)

    • 别在 Java 代码里乱打日志了,这才是打印日志的正确姿势!:https://mp.weixin.qq.com/s/hJvkRlt9xQbWhYy1G7ZDsw

    • 阿里云日志服务:https://help.aliyun.com/product/28958.html?spm=a2c4g.11186623.3.1.7cfd735dv8i1pB

    • Spring Boot Logging:https://docs.spring.io/spring-boot/docs/2.2.1.RELEASE/reference/html/spring-boot-features.html#boot-features-logging

    • Spring Cloud Sleuth:https://github.com/spring-cloud/spring-cloud-sleuth

    • Opentracing:https://github.com/opentracing

    展开全文
  • SqlServer删除表,记录日志

    千次阅读 2018-09-21 15:26:28
    本文 没有给出 通过delete from table 记录日志的 方法。     禁掉ldf文件 1。对表进行TRUNCATE TABLE 操作 2。Simple Recvery Mode下的 SELECT INTO, BCP (Bulk Insert/Bulk Update), CREATE INDEX ...

     

    本文 没有给出   通过delete from table   不记录日志的 方法。

     

     

    禁掉ldf文件

    1。对表进行TRUNCATE TABLE 操作

    2。在Simple Recvery Mode下的 SELECT INTO, BCP (Bulk Insert/Bulk Update), CREATE INDEX 以及对于Text/Image数据类型 等的操作。

    3。如果使用Full Recovery Mode,所有的操作都将会被记录(还包括数据库备份等)


    我觉得在使用大量的删除插入语句的时候如果不想让DB记录log,应该可以在执行语句前执行下列语句将日志记录方式改为simple

    ALTER DATABASE [CSMCISA] SET RECOVERY simple
    GO

    然后在执行完成后再将数据库的日志记录方式改过来就行了,如果不放心就写再事务中,确保日志记录方式不会因为我们的操作而改变.

    ALTER DATABASE [CSMCISA] SET RECOVERY full/bulk_logged
    GO

    我的问题:

    SQL Server中可不可以指定某一些语句不记录到日志。

    比如我在清理某个日志表的时候,因为不是全部删除,只是删除某个时间段之前。比如以下SQL

    Delete Table1 where Time < '2004-03-01'

    由于删除量很大,记录日志的话,删除后,产生3、4G的日志很正常。
    删除完了后,又要清理日志,非常麻烦,尤其是硬盘空间不是很大的时候,更郁闷,要一次一点点地删除。

    删除的时候,设置数据库的日志为最小,这个方案不太可行,因为我正常的日志希望仍然记录。我不想再做清理的时候,影响我其他执行的日志记录。

     


    微软工程师的答案:

     

     

    根据您的描述,您想在删除 (Delect Table) 表中的某些记录时,不让SQL Server记录日志。并且不想设置数据库的日志为最小(因为希望其他正常的日志希望仍然记录)。

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

    根据我的理解,基本上这是无法实现的。SQL Server 引擎在设计上就会对您的 Delete 操作进行日志记录。至今没有办法强制制定某一些语句不记录到日志中。关于这点,您可以参见 《Inside SQL Server》 一书中第三章 "SQL Server Architecture"一节下的 "The SQL Server Engine" 主题。其中从底层讲述了各种SQL Manager包括:

    The Row Operations Manager and the Index Manager
    The Page Manager and the Text Manager
    The Transaction Manager and Lock Manager

    其中最主要的是 Transaction Manager, Page Manager以及Row Operations Manager。一般情况下,在对任何数据精心操作的时候,SQL Server都会根据恢复模式(Recovery Mode)的不同级别,进行日志记录。我相信您深知这一点。

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

    但是,SQL Server在设计上对以下情况的操作不进行日志记录:

    --------------------------------------------------------------------------
    1。对表进行TRUNCATE TABLE 操作

    2。在Simple Recvery Mode下的 SELECT INTO, BCP (Bulk Insert/Bulk Update), CREATE INDEX 以及对于Text/Image数据类型 等的操作。

    3。如果使用Full Recovery Mode,所有的操作都将会被记录(还包括数据库备份等)

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

    基于以上原则,以及您删除表的要求。虽然不一定完全满足您那边的要求,但是根据我的经验,我给您如下建议:

    1。如果您在执行 Delete Table1 where Time < '2004-03-01' 由于涉及的记录比较多,所以日志记录也相应很大(3-4G),如果可行,我建议您尝试以下方式:

    -- 选出您所需要保留的记录到新的表。如果您使用 Full Recovery Mode
    -- 根据SELECT INTO的记录数,日志可能会比较大
    Select * into Table2 From Table1 Where Time > = '2004-03-01'

    -- 然后直接Truncate Table1。无论何种恢复模式都不会进行日志记录
    Truncate table Table1

    -- 最后对Table2进行改名为Table1
    EC sp_rename 'Table2', 'Table1'


    2。由于您的磁盘空间有限,您需要选择合适的恢复模式,关于这点您可参见以下文档中有关 AUTO_SHRINK 以及 Recovery Options部分:

    Setting Database Options:
    _8_des_03_6ohf.asp">http://msdn.microsoft.com/library/default.asp?url=/library/en-us/createdb/cm_8_des_03_6ohf.asp

    3。关于数据库备份策略和恢复模式的选择,下面的技术文档提供了很好的范例:

    Backup and Recovery of Related Databases:
    sql/ad_bkprst_9ttf.asp">http://msdn.microsoft.com/library/default.asp?url=/library/en-us/adminsql/ad_bkprst_9ttf.asp

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

    综上所述,SQL Server将会对 Detele Table 做日志记录,并且我们无法强制禁止这个日志记录。因为SQL Server数据存储和日志记录引擎设计上为了更好的保持数据的完整性和再发生数据库崩溃或灾难的时候,能恢复您的数据库或其中的某些事务操作。所以从原理上来说,我们没有办法使用特定的语句不记录这个Delete动作。

    另外,我发表了自己对您问题的看法,并提供了您一些建议。不知道在您那边具体是否能对您的问题有所帮助。如果我建议的第一种情况下,所涉及的数据量不是很大(如果恢复模式不是Full则更好),那么您可以利用SQL Server对表进行 Truncate 操作不做日志记录的原则,尝试这种方法。但是有一点需要提醒您,就是 Truncate Table 不会进行日志记录,所以一旦 Truncate,您将无法在恢复这个表。所以之前,您需要确认这一点!

    展开全文
  • 赶上1024有征文活动,就写一篇吧,实习的这段时间,我更加认识到日志的重要性,客户端值没传过来?看日志,服务崩溃了?看日志,没错,日志是出现异常第一个想到的东西,它记录了程序运行过程中所调用的函数,所...
  • 因为本来系统盘就分区比较小,这是由于数据库使用过程中会使日志文件不断增加,使得数据库的性能下降,并且占用大量的磁盘空间。SQL Server数据库都有log文件,log文件记录用户对数据库修改的操作。可以通过直接...
  • 最佳日志数据实践

    千次阅读 2017-07-13 11:24:38
    原文链接: https://zhuanlan.zhihu.com/p/273634840. 缘起大约三年前,我曾经写过一篇 最佳日志实践,还被码农周刊选为那年的 最受欢迎技术干货 之一。当时我任职于网易杭州研究院的存储平台组,主要做网易...
  • 装Ubuntu 16.04双系统,每次关机都会报一堆pcie问题,出现系统盘根目录磁盘空间不够的提醒,于是用磁盘空间分析工具查看,/var/log/下kern.log 和syslog非常大,两个kern.log都接近10G,一个syslog也接近10G,三个点...
  • SpringBoot日志配置详解

    千次阅读 2020-12-20 23:53:06
    前言​记录应用系统曰志主要有三个原因 记录操作轨迹、监控系统运行状况、...​全面有效的日志系统有助于建立完善的应用监控体系,由此工程师可以实时监控系统运行状况,及时预警,避免故障发生。监控系统运行状况,...
  • 首先intellij idea中创建一个工作空间(file-&gt;new-&gt;project-&gt;emptyProject)创建好工作空间后创建java普通项目(intellij idea中就是创建modules)使用快捷键ctrl+shift+alt+s打开project ...
  • 日志打印规范

    千次阅读 2020-11-28 13:31:55
    不仅是初学者,很多老码农也能很好的打印日志(大牛除外,如果你是大牛,就需要看本文了),本质的原因是没有意识到为什么要打印日志,打印日志的目的是什么,这里我就为大家介绍一下。 最重要的原则:确保...
  • 打印日志是一门艺术,但长期被开发同学所忽视。日志就像车辆保险,没人愿意为保险付钱,但是一旦出了问题都又想有保险可用。我们打印日志的时候都很随意,可是用的时候会吐槽各种 SB 包括自己!写好每一条日志吧,与...
  • 闪回日志管理

    千次阅读 2014-11-14 14:25:26
    闪回是10g之后才有的,他与undo中的前影像数据不同,闪回日志是以数据块为单位的,而undo是以行为单位的 开启闪回 查询闪回日志的基本信息 SQL> select NAME,LOG#,THREAD# ,SEQUENCE#, BYTES,FIRST_...
  • 线上服务被干爆了,竟然是日志的锅!!

    千次阅读 多人点赞 2020-12-07 10:02:02
    本文要介绍的是一个发生我们线上环境的真实案例,问题发生某次大促期间,对我们的线上集群造成了比较大的影响,这篇文章简单复盘一下这个问题。问了方便大家理解,实际排查和解决过程可能和本文描述的并完全...
  • Java虚拟机(三)垃圾标记算法与Java对象的生命周期这篇文章中,提到了Java虚拟机的GC日志。DVM和ART的GC日志与Java虚拟机的日志有较大的区别,这篇文章就对DVM和ART的GC日志进行分析。
  • 无法输出日志的时候,无论怎么配置log4j,不管是properties的还是xml的,都起作用。 有些时候,我们没做什么配置就能输出日志.... 这是一个让无数人烦躁的问题。其实解决问题很容易(我过了这么久才解决,以前...
  • [全]!!!!日志分析大全

    千次阅读 2019-10-15 14:04:11
    日志分析 欢迎访问个人网站下载资源 1.Linux日志分析 由系统进程rsyslogd统一管理系统日志 ...rsyslogd服务配置文件解析 ...格式:$ModLoad module-name(/lib64/rsyslog中模块注意不用添加.so),开启日...
  • Linux日志分析和故障处理

    千次阅读 2019-09-29 17:05:58
    一、日志文件简介 1.日志文件用于记录系统、程序运作中发生的各种事件  2.日志文件的分类  1)日志管理服务:由系统服务rsyslog管理  ·软件包 rsyslog-5.8…rpm  ·主程序 /sbin/rsyslogd  ·配置文件 /etc/...
  • 编者按:做了很多年IT工作,突然又对日志级别有些迷茫,哈哈,为什么要有又字。是的,人们都实践中不停的学习并增进自己。写了好久的字,盯住看3分钟,然后你会想,哦?写错了吧 ^_^原文: ...
  • 日志打印的规范以及实现方式

    千次阅读 多人点赞 2019-01-08 18:00:16
    原因3:跟踪性能下降的问题范围,产品所反映出来的性能问题,很难开发过程中暴露出来,这需要进行全方位的测试跟踪,而通过日志提供的详细执行时间记录可以很方便的找出应用的性能瓶颈 原因...
  • java 怎么合理的打印日志

    千次阅读 2019-08-20 15:45:27
    1.日志的主要作用 1)日志是系统运行的“照妖镜”,通过它能够实时反映系统的运行状态; 如上图所示,系统A中producer不断产生数据放入到data queue中,sender不断从data queue中取数据发送给下游系统B的receiver,...
  • 数据库使用过程中会使日志文件不断增加,使得数据库的性能下降,并且占用大量的磁盘空间。SQL Server数据库都有log文件,log文件记录用户对数据库修改的操作。可以通过直接删除log文件和清空日志在清除数据库日志...
  • linux的日志轮转

    千次阅读 2019-10-25 18:31:14
    众所周知日志是记录用户的操作和做的改变,随着时间的增加日志文件会变得越来越大,那么就会占据本地的空间,影像系统。 日志轮转系统就是解决这个问题的方案之一,简单来说就是将日志定期作备份重新存储为一个文件...
  • 这个实验里,你将FortiGate飞塔防火墙本地配置日志设置,配置警告邮件和显示日志
  • mybatis的日志打印关闭

    万次阅读 2018-02-08 17:23:25
    无法输出日志的时候,无论怎么配置log4j,不管是properties的还是xml的,都起作用。有些时候,我们没做什么配置就能输出日志....这是一个让无数人烦躁的问题。其实解决问题很容易(我过了这么久才解决,以前都用...
  • Python异常和日志

    千次阅读 2018-06-26 23:11:51
    异常和日志 一、异常 1.什么是异常 通常来说,当我们尝试做一件事情的时候,这个过程中有可能会发生一些意外情况影响程序的执行,这种情况就称之为异常。要注意的是:异常不是错误。 比如说:创建一个函数,...
  • 目录一、inode与block1.1 inode和block概述1.2 inode的...1-2三、恢复误删除的文件3.1 恢复EXT类型的文件3.2 恢复XFS类型的文件3.3 xfsdump使用限制四、分析日志文件4.1 日志文件 4-14.2 日志文件 4-24.3 内核及系统日

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 25,225
精华内容 10,090
关键字:

发日志不在空间提醒