精华内容
下载资源
问答
  • 日志级别

    2020-04-14 17:47:44
    日志级别 从小到大 ALL、DEBUG 、INFO、WARA、ERROR 、FATAL 、OFF ALL(输出所有类型日志) DEBUG (输出DEBUG 以上级别日志) INFO(输出INFO以上级别日志) WARA(输出WARA以上级别日志) ERROR (输出ERROR 以上...

    日志级别 从小到大
    ALL、DEBUG 、INFO、WARA、ERROR 、FATAL 、OFF
    ALL(输出所有类型日志)
    DEBUG (输出DEBUG 以上级别日志)
    INFO(输出INFO以上级别日志)
    WARA(输出WARA以上级别日志)
    ERROR (输出ERROR 以上级别日志)
    FATAL (输出FATAL 以上级别日志)
    OFF (关闭日志输出)

    展开全文
  • 之前看了网上发的日志级别的使用规范和「日志管理与分析权威指南」里面的日志级别规范和说明,具体内容如下。JAVA Log4j的8个日志级别log4j定义了8个级别的log(除去OFF和ALL,可以说分为6个级别),优先级从高到低...

    0eb8a344ecb1fe0b1f1529f3ede8869e.gif

    之前看了网上发的日志级别的使用规范和「日志管理与分析权威指南」里面的日志级别规范和说明,具体内容如下。

    JAVA Log4j的8个日志级别

    log4j定义了8个级别的log(除去OFF和ALL,可以说分为6个级别),优先级从高到低依次为:OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、 ALL。

    「ALL」: 最低等级的,用于打开所有日志记录。

    「TRACE」 : designates finer-grained informational events than the DEBUG.Since:1.2.12,很低的日志级别,一般不会使用。

    「DEBUG」:  指出细粒度信息事件对调试应用程序是非常有帮助的,主要用于开发过程中打印一些运行信息。

    「INFO」: 消息在粗粒度级别上突出强调应用程序的运行过程。打印一些你感兴趣的或者重要的信息,这个可以用于生产环境中输出程序运行的一些重要信息,但是不能滥用,避免打印过多的日志。

    「WARN」: 表明会出现潜在错误的情形,有些信息不是错误信息,但是也要给程序员的一些提示。

    「ERROR」: 指出虽然发生错误事件,但仍然不影响系统的继续运行。打印错误和异常信息,如果不想输出太多的日志,可以使用这个级别。

    「FATAL」: 指出每个严重的错误事件将会导致应用程序的退出。这个级别比较高了。重大错误,这种级别你可以直接停止程序了。

    「OFF」:  最高等级的,用于关闭所有日志记录。

    如果将log level设置在某一个级别上,那么比此级别优先级高的log都能打印出来。例如,如果设置优先级为WARN,那么OFF、FATAL、ERROR、WARN4个级别的log能正常输出,而INFO、DEBUG、TRACE、 ALL级别的log则会被忽略。Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。

    致命错误「FATAL」

    表示需要立即被处理的系统级错误。当该错误发生时,表示服务已经出现了某种程度的不可用,系统管理员需要立即介入。

    这属于最严重的日志级别,因此该日志级别必须慎用,如果这种级别的日志经常出现,则该日志也失去了意义。

    通常情况下,一个进程的生命周期中应该只记录一次FATAL级别的日志,即该进程遇到无法恢复的错误而退出时。

    当然,如果某个系统的子系统遇到了不可恢复的错误,那该子系统的调用方也可以记入FATAL级别日志,以便通过日志报警提醒系统管理员修复。

    错误 「ERROR」

    错误日志是用来传递系统或应用程序中出现的各种级别的错误。例如,操作系统在无法同步缓存区到磁盘的时候会生成错误信息。不确定的是,许多错误信息只能给出为什么出错的起点,要寻找出导致错误发生的根本原因还需要进一步分析。

    该级别的错误也需要马上被处理,但是紧急程度要低于FATAL级别。当ERROR错误发生时,已经影响了用户的正常访问。从该意义上来说,实际上ERROR错误和FATAL错误对用户的影响是相当的。

    FATAL相当于服务已经挂了,而ERROR相当于好死不如赖活着,然而活着却无法提供正常的服务,只能不断地打印ERROR日志。

    特别需要注意的是,ERRORFATAL都属于服务器自己的异常,是需要马上得到人工介入并处理的情况。而对于用户自己操作不当,如请求参数错误等等,是绝对不应该记为ERROR日志的。

    警告 「WARN」

    警告信息是在系统即将丢失东西,而又不影响系统运行下而产生的,例如一个应用程序在没有获得正确数量的参数传递的时候,但是它又能够在没有这些参数的情况下正常运行,这种情况下可能就是记录警告信息提示使用者或者管理员。

    该日志表示系统可能出现问题,也可能没有问题,这种情况在例如网络的波动等情况。对于那些目前还不是错误,然而不及时处理也会变为错误的情况,也可以记为WARN日志,例如一个存储系统的磁盘使用量超过阀值,或者系统中某个用户的存储配额快用完等等。

    对于WARN级别的日志,虽然不需要系统管理员马上处理,也是需要即时查看并处理的。因此此种级别的日志也不应太多,能不打WARN级别的日志,就尽量不要打。

    信息 「INFO」

    这种类型的信息被设计成告诉用户或者开发者一些没有风险的事情发生了。该种日志记录系统正常运行状态,例如某个子系统的初始化,某个请求的成功执行等等。

    通过查看INFO级别的日志,可以很快地对系统中出现的WARN,ERROR,FATAL错误进行定位。INFO日志不宜过多,通常情况下,INFO级别的日志应该不大于TRACE日志的10%。

    调试 DEBUG or TRACE

    软件系统在应用程序代码运行时生成的调式信息,是为了给软件开发人员提供故障检测和定位问题的帮助。

    这两种日志具体的规范应该由项目组自己定义,该级别日志的主要作用是对系统每一步的运行状态进行精确的记录。

    通过该种日志,可以查看某一个操作每一步的执行过程,可以准确定位是何种操作,何种参数,何种顺序导致了某种错误的发生。可以保证在不重现错误的情况下,也可以通过DEBUG(或TRACE)级别的日志对问题进行诊断。

    需要注意的是,DEBUG日志也需要规范日志格式,应该保证除了记录日志的开发人员自己外,其他的如运维,测试人员等也可以通过DEBUG(或TRACE)日志来定位问题。

    Python日志级别参考: http://suo.im/6fvfZa  http://suo.im/6ut404

    Linux系统日志级别参考: http://suo.im/60sStE

    d4bedf912be93b49d8e16aae11c4f9a8.png

    展开全文
  • 1. Spark设置日志级别 前言 Spark有多种方式设置日志级别,这次主要记录一下如何在Spark-submit设置Spark日志级别,本文介绍三种方式 需求 因为Spark的日志级别默认为INFO(log4j.rootCategory=INFO, console),这样在...

    1. Spark设置日志级别

    前言

    Spark有多种方式设置日志级别,这次主要记录一下如何在Spark-submit设置Spark日志级别,本文介绍三种方式

    需求

    • 因为Spark的日志级别默认为INFO(log4j.rootCategory=INFO, console),这样在运行程序的时候有很多我不需要的日志信息都打印出来了,看起来比较乱,比较烦,抓不住重点,而我只想把warn和error打印出来。
    • 之前在测试环境或者在IDEA我是通过其他几种方式(下面会介绍)设置的,但是在生产环境下不允许我修改集群的配置文件(不是我负责~),而在代码里设置日志级别却不生效(原因还没找到),最后通过spark-submit里设置日志级别搞定的。

    1.1 Spark-sumbit设置日志级别, Spark job 独立的log4j配置方法

    1.1.1 Linux命令如下

    spark-submit \
    --conf "spark.driver.extraJavaOptions=-Dlog4j.configuration=file:log4j.properties"
    

    或者

    spark-submit \
    --conf "spark.driver.extraJavaOptions=-Dlog4j.configuration=file:/log4j.xml" 
    

    这里的log4j配置可以是 log4j.properties 或者 log4j.xml ,没有限制
    其中log4j.properties/xml为我将本地的日志文件,拷贝到执行spark-submit的机器上

    1.1.2 Spark job 独立的log4j配置方法详解

    • spark中提供了log4j的方式记录日志。可以在**$SPARK_HOME/conf/下,将 log4j.properties.template 文件copy为 log4j.properties 来启用log4j配置。但这个配置为全局配置, 不能单独配置某个job的运行日志。如下介绍spark (streaming) job独立配置**的log4j的方法。

    • 设置方法
      spark job提交时可以在 --conf 中配置log4j.configuration 参数来指定log4j 配置文件,例如:

    spark-submit \
    --conf "spark.driver.extraJavaOptions=-Dlog4j.configuration=file:/log4j.xml" 
    

    (这里的log4j配置可以是 log4j.properties 或者 log4j.xml ,没有限制)

    • 配置示例
      例如使用xml格式配置文件:
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
    <log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/' >
    
        <appender name="FILE" class="org.apache.log4j.DailyRollingFileAppender">
            <param name="file" value="${log_name}.log" />
            <param name="threshold" value="INFO"/>
            <param name="DatePattern" value="yyyyMMdd"/>
            <param name="append" value="true" />
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" value="%d [%t] %-5p %c(%L) - %m%n"/>
            </layout>
        </appender>
    
        <root>
        //指出日志级别
            <priority value ="INFO"/>
            <appender-ref ref="FILE"/> 
        </root>
    </log4j:configuration> 
    

    对于<param name="file" value="${log_name}.log" >可以写死一个log路径,也可以在代码中做设置,例如设置log名字为myLog,可以在Logger初始化之前 设置: System.setProperty(“log_name”, “myLog”);

    1.2 修改集群配置文件

    cd $SPARK_HOME/conf 
    cp log4j.properties.template log4j.properties
    vim log4j.properties
    

    将log4j.rootCategory=INFO, console改为log4j.rootCategory=WARN, console

    1.3 在IDEA里设置

    • 将log4j.properties放在项目的src/main/resources即可
    • 代码里配置
    spark.sparkContext.setLogLevel("WARN")
    

    在这里插入图片描述

    2. 总结Spark三种设置日志级别方式

    • 如果在自己的测试集群上, 直接修改$Spark_HOME/conf下的log4j.properties即可
    • 如果在IDEA里,将log4j.properties放在项目的src/main/resources即可
    • 如果在生产环境的集群,又不允许修改配置文件的话,用上面的spark-submit --conf即可
    展开全文
  • 前言关于日志级别,大部分项目可能都设置为info级别,当然也可能有一些追求性能或者说包含很多敏感信息的项目直接将级别设置为warn或者error;这时候如果项目中出现一些未知异常,需要用到很详细的日志信息,此时...

    前言

    关于日志级别,大部分项目可能都设置为info级别,当然也可能有一些追求性能或者说包含很多敏感信息的项目直接将级别设置为warn或者error;这时候如果项目中出现一些未知异常,需要用到很详细的日志信息,此时如果项目中没有动态改变日志级别的机制,排查问题将很棘手。

    日志系统

    我们常用的一些日志系统包括:Log4j2LogbackJava Util Logging;我们想动态改变日志的级别,前提是这些日志系统都支持我们直接设置日志等级,当然这些系统提供了很简单的接口;

    • Log4j2
    LoggerContext loggerContext = (LoggerContext) LogManager.getContext(false);LoggerConfig loggerConfig = loggerContext.getConfiguration().getLoggers().get("root");loggerConfig.setLevel(level);
    • Logback
    LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();Logger logger = loggerContext.getLogger("root");((ch.qos.logback.classic.Logger) logger).setLevel(level);
    • Java Util Logging
    Logger logger = Logger.getLogger("root");logger.setLevel(level);

    当然除了上面直接设置日志级别的方式,也有可以动态加载配置文件的方式,同样也可以在配置文件中动态改变日志级别,以logback为例:

    LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();File externalConfigFile = new File("logback.xml");JoranConfigurator configurator = new JoranConfigurator();configurator.setContext(lc);lc.reset();            configurator.doConfigure(externalConfigFileLocation);

    上面简单介绍了一下每种日志系统都是如何去设置日志级别的,最关键的是设置完之后,可以实时生效,立马可以看到我们想要的日志;有了这些下面其实就是通过何种方式去改变日志级别的问题了;

    如何动态改变级别

    如何去动态改变级别,最简单的方式就是对外提供一个接口,给定一个日志级别作为参数实时变更;或者通过配置中心的方式;另外其实像SpringBoot这些主流的框架本身也提供了动态修改的功能;下面可以具体看一下是如何实现的,以logback为例;

    自定义接口

    自定义一个给定日志级别的接口,外部直接通过调用接口来改变级别:

    @RequestMapping(value = "logLevel/{logLevel}")public String changeLogLevel(@PathVariable("logLevel") String logLevel) {    try {        LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();        Logger logger = loggerContext.getLogger("root");        ((ch.qos.logback.classic.Logger) logger).setLevel(Level.valueOf(logLevel));    } catch (Exception e) {        logger.error("changeLogLevel error", e);        return "fail";    }    return "success";}

    想要改变日志级别直接请求如下地址即可,设置一个debug的级别:

    http://[ip]:[port]/logLevel/debug

    这种方式虽然比较简单,但是如果节点很多的话,操作起来就很麻烦,当然也可以汇总所有节点路径,一次操作触发所有节点的请求;其实最好的办法应该是类似发布订阅的方式,发布者会给所有订阅者都发送一个更改日志级别的通知,有新的节点只要成为订阅者即可,这种方式其实就是现在主流的配置中心的方式。

    配置中心

    配置中心的目的其实就是把一些会经常变动的参数集中保存起来,某个系统启动时去配置中心获取相关的参数,同时会对这些参数进行监听,后面在配置中心里面改变参数的值会实时推送给相关系统;这样系统就可以在不重启的情况下就更新了配置;
    利用现有的一些中间件我们就能很快实现一个配置中心,比如Zookeeper提供了对某个Node进行监听的功能,MQ和Redis都有发布订阅的功能,所以用来实时推送变更再好不过了;

    • Zookeeper方式

    可以直接使用PathChildrenCache用来监听子节点的CHILD_ADDED,CHILD_UPDATED,CHILD_REMOVED事件;这样如果在Zookeeper服务端对节点的值就行更新,客户端会触发以上三个事件:

    private void watcherPath(String path) {    PathChildrenCache cache = new PathChildrenCache(client, path, true);    cache.start(StartMode.POST_INITIALIZED_EVENT);    cache.getListenable().addListener(new PathChildrenCacheListener() {        @Override        public void childEvent(CuratorFramework client, PathChildrenCacheEvent event) throws Exception {            switch (event.getType()) {            case CHILD_ADDED:                break;            case CHILD_UPDATED:                String logLevel = new String(event.getData().getData());                 //日志级别更新处理                break;            case CHILD_REMOVED:                break;            default:                break;            }        }    });}
    • MQ方式

    MQ一般都有Queue和Topic方式,Topic方式其实就是订阅发布模式,所有的集群节点可以订阅某个Topic,这样发布端发送更新日志级别的消息,其他订阅节点都能收到:

    //日志等级Topicprivate final String TOPIC = "LOGLEVEL"; private void watcherPaths() throws JMSException {    Topic topic = session.createTopic(TOPIC);    MessageConsumer consumer = session.createConsumer(topic);    consumer.setMessageListener(new MessageListener() {        @Override        public void onMessage(Message message) {            TextMessage tm = (TextMessage) message;            String logLevel = tm.getText();            //日志级别更新处理        }    });}
    • Redis方式

    Redis其实除了缓存的功能,也提供了类似MQ的发布订阅的模式;集群节点通过订阅一个channel,发布端通过此channel来发布消息:

    private void watcherPaths() throws JMSException {    jedis.subscribe(new JedisPubSub() {        @Override        public void onMessage(String channel, String message) {             String logLevel = message;             //日志级别更新处理        }    },"LOGLEVEL");}

    SpringBoot内置

    SpringBoot2.0之后可以通过actuator动态调整日志级别,主要是通过暴露loggers这个endpoint来实现,具体步骤如下:

    • 需要引入actuator
    org.springframework.boot    spring-boot-starter-actuator
    • 暴露loggers

    在application.properties中添加如下配置:

    management.endpoints.web.exposure.include=loggers
    • 查看日志级别

    启动服务可以通过:

    http://[ip]:[port]/actuator/loggers

    查看当前项目每个包的日志级别:

    {levels: [   "OFF","ERROR","WARN","INFO","DEBUG","TRACE"],loggers: {   ROOT: {      configuredLevel: "INFO",      effectiveLevel: "INFO"   },...}
    • 动态修改日志级别

    发送POST请求到:

    http://[ip]:[port]/actuator/loggers/[包路径]

    需要在body中指定configuredLevel参数;
    比如修改整个项目日志级别为error:

    http://[ip]:[port]/actuator/loggers/root

    cbaff2312a8038ca5e2fe55e2c0b427e.png

    关于SpringBoot内部是如何实现动态改变日志级别的,可以查看其实现核心类LoggersEndpoint:

    @Endpoint(id = "loggers")public class LoggersEndpoint {    private final LoggingSystem loggingSystem;    @WriteOperation    public void configureLogLevel(@Selector String name, @Nullable LogLevel configuredLevel) {        Assert.notNull(name, "Name must not be empty");        this.loggingSystem.setLogLevel(name, configuredLevel);    }    ...}

    具体通过LoggingSystem来对日志系统动态改变级别,上面也介绍了主流使用的日志系统,SpringBoot也都支持这些系统,这是一个抽象类,具体实现类:

    • JavaLoggingSystem
    • Log4J2LoggingSystem
    • LogbackLoggingSystem
    • NoOpLoggingSystem

    分别对应了几种日志系统,这几个类内部其实也是调用上面介绍的方法去改变日志级别,当然SpringBoot自动会识别出当前使用的是哪个日志系统,然后使用哪个LoggingSystem;

    总结

    大部分公司其实更多的还是使用配置中心的方式来动态改变日志级别,这种方式更加灵活,而且配置中心已经成为很多公司的标配组件,不光用来改变日志级别,所有有可能改变的参数都可以使用。

    感谢关注

    可以关注微信公众号「回滚吧代码」,第一时间阅读,文章持续更新;专注Java源码、架构、算法和面试。

    展开全文
  • Log 日志级别

    万次阅读 多人点赞 2016-09-07 12:51:06
    一直对于程序中的日志级别有点模糊,今天专门百度学习下。遂成此文;     日志记录器(Logger)是日志处理的核心组件。log4j具有5种正常级别(Level)。: 1.static Level DEBUG :     DEBUG Level指出细粒度信息事件...
  • java日志级别

    千次阅读 2020-03-03 17:58:18
    java中日志级别有7 个级别:severe、Warning、info、config、fine、finer、finest。默认情况只记录前三个级别。另外可以使用Level.ALL开启所有的级别记录。或者使用Level.OFF关闭所有的级别记录。 log4j中日志级别...
  • JAVA 日志级别

    2020-12-02 11:05:06
    log4j定义了8个级别的log(除去OFF和ALL,可以说分为6个级别) ... designates finer-grained informational events than the DEBUG.Since:1.2.12,很低的日志级别,一般不会使用。 DE...
  • SpringBoot不重启修改日志级别【Slf4jj动态日志级别】 前言 需求: 线上日志级别高,而定位问题时需要低级别日志便于分析问题 功能:不重启服务器,提供设置页,手动触发Slf4j 项目日志级别变化 扩展:可将此功能放...
  • 日志级别排序

    千次阅读 2019-07-26 19:56:54
    日志级别下拉菜单能否按照日志输出量从大到小或者从小到大排序: silent < error < warning < info < debug
  • 为了减少日志频繁打印带来的性能影响,线上环境设置的日志级别一般都相对较高。而当出现生产问题需要排查的时候,可能需要适当降低日志级别(例如DEBUG)来打印更多的日志信息帮助定位问题。 传统的做法一般是: 1、...
  • python日志级别

    2018-11-30 12:21:42
    python日志级别: critical&amp;gt;error&amp;gt;waring&amp;gt;info&amp;gt;debug 级别越高打印的日志越少,反之亦然,即 Debug : 打印全部的日志(notset等同于debug) info : 打印info,warning,...
  • ceph日志级别

    千次阅读 2017-08-14 00:25:49
    在ceph运行的过程中,可以通过调整日志级别来排查系统异常等。代码文件中经常有dout(10)这样的语句。表示输出到日志,而数字则代表日志级别。日志的设置有debug_osd,debug_mon等。#define dout_subsys ceph_subsys_...
  • Log日志级别

    2020-05-20 16:33:41
    1. 日志级别 日志一共分成5个等级,从低到高分别是: DEBUG INFO WARNING ERROR CRITICAL 说明: DEBUG:详细的信息,通常只出现在诊断问题上 INFO:确认一切按预期运行 WARNING:一个迹象表明,一些意想不到的事情...
  • JUL日志级别介绍

    2020-05-05 14:10:27
    日志的级别 ...jul中定义的日志级别 * java.util.logging.Level中定义了日志的级别: SEVERE(最高值) WARNING INFO (默认级别) CONFIG FINE FINER FINEST(最低值) * 还有两个特殊的级...
  • 更改日志级别 在运行时中更改日志记录级别非常重要,这主要在生产环境中非常重要,在生产环境中,您可能希望在有限的时间内进行调试日志记录。 好了,更改根记录器非常简单–假设您有一个具有所需记录级别的输入...
  • tomcat日志级别

    千次阅读 2018-06-05 15:21:05
    tomcat日志级别有以下几种: Log level Description SEVERE(highest) Captures exception and Error WARNING Warning messages INFO Informational message, related to the server activity CONFIG ...
  • Linux系统日志级别

    2018-01-21 22:06:19
    /proc/sys/kernel/printk文件定义了4个数字, 查看日志级别:cat /proc/sys/kernel/printk4 4 1 7①控制台日志级别:优先级高于该值的消息将被打印至控制台。②缺省的消息日志级别:将用该值来打印没有优先级的消息...
  • Log的日志级别

    2017-07-10 17:00:08
    Log.v(TAG, "日志级别 v"); 提示 黑色 Log.d(TAG, "日志级别 debug"); 调试 蓝色 Log.i(TAG, "日志级别 info"); 信息 绿色 Log.w(TAG, "日志级别 warn"); 警告 橘黄色 Log.e(TAG, "日志级别 error"); ...
  • 动态修改springboot日志级别

    千次阅读 2020-03-26 13:58:04
    为了减少日志频繁打印带来的性能影响,线上设置的日志级别相对较高。当线上应用出现问题需要我们排查的时候,可能需要适当降低日志级别(例如DEBUG)来打印更多的日志信息。 传统的方式需要1、修改日志级别 2、重启...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,944
精华内容 8,377
关键字:

日志级别