欢迎访问昆山宝鼎软件有限公司网站! 设为首页 | 网站地图 | XML | RSS订阅 | 宝鼎邮箱 | 后台管理


新闻资讯

MENU

软件开发知识

在 pom 文件中加入 dependency groupIdcom.stackify/groupId ar

点击: 次  来源:昆山软开发 时间:2018-09-22

原文出处: 南角影

编者按:做了许多年IT事情,溘然又对日志级别有些苍茫,哈哈,为什么要有又字。是的,人们都在实践中不断的进修并增进本身。写了良久的字,盯住看3分钟,然后你会想,哦?写错了吧 ^_^

原文在: https://stackify.com/java-logging-best-practices/ 。是官方的内容,至于 ELKB,也是雷同的对象。

日志我们应该做的更好了">日志:我们应该做的更好了

我在说什么?此刻有大量的Java日志框架和库,大大都开拓人员天天都在利用。两个最常用的是 log4j 和 logback。他们利用起来很是简朴,而且表示很不错。根基的 Java 日志文件还不足,这里我们会给出一些Java最佳实践可能发起来辅佐你去利用!

你曾经脱分开拓部分去查察过日志文件吗?假如你做过这些工作,你很快会心识到一些问题。

  • 有大量的数据
  • 你需要会见数据
  • 漫衍在多个处事器
  • 一个详细的操纵大概是跨应用的,因此你需要查察多个日志
  • 日志都是流水性的,很难查询。就算你要把数据放在SQL内里,你也需要对文本数据做全索引以便查询。
  • 很难阅读。动静就像意大利面似的混乱难以阅读
  • 你凡是没有任何用户的上下文等信息
  • 你大概缺少一些有用的细节(你的意思是说“log.Info(‘In the method’)没用???)
  • 你需要打点日志文件轮回和保存
  • 别的,你有你应用生成的大量数据,却不能有效的事情起来。

    是时候严肃看待日志了

    一旦你的应用不是运行在你的桌面系统,那么当你的应用不能正确运行的时候,日志(包罗错误信息)就是你的救命稻草。虽然,AMP(机能打点平台)东西会对内存溢出、机能阀值呈现问题的时候发出告诫信息,但这些信息确并不能帮你办理问题,譬喻为什么这个用户不能登录,可能为什么这笔记录没有处理惩罚

    在 Stackify,我们构建了一个日志文化“culture of logging” ,来到达如下方针

    1. 输出所有的工作。尽大概多的记录你所能记录的,老是有相关的上下文日志,这些日志并不会增加开销。 
    2. 要智能事情,不要死事情。在牢靠位置整合所有的日志(约定,好比 d:/someapplogs/),这个位置对所有的开拓人员都是透明的,并可以会见的。从日志内里发明异常有助于晋升我们的产物。

    本文我们将分享这些最佳实践,并分享我们是如何到达以上方针,个中大部门已经在 Stackify’s 日志打点系统中实现了。假如你利用了 前缀式查察系统(Prefix to view your logs,),必然要去看看。

    开始记录所有的工作

    我在许多商店事情过,哪里的信息是这样的

    } catcha(Exception e){
        LOGGER.error(e.getMessage(),e);
    }

    我给这个开拓人员点赞,至少利用了 try/catch 来处理惩罚异常。异常内里会包括仓库信息让我或许知道从哪里来的这个异常,但没有记录更多的上下文信息。

    有时,他们也做了一些前置的日志

    public void processResultes(final List<Double> results){
        LOGGER.debug("Processing resultes");
    }

    可是,凡是这样的语句并不能汇报你应用内里到底产生了什么。假如你认真出产应用的问题办理,那么这样的日志并不能给你什么指示,尤其照旧像大海捞针似的找到这些日志。

    就像之前提及的一样。当出产呈现问题的时候,你不能查察物力处事器上的内容,日志是办理问题最常用的几个手段之一。你想要有大量的关联信息及上下文信息。下面我给出指导性原则。

    Walk the Code

    让我们假设你有个想要处理惩罚的 try/catch 的处所,可是之前并没有汇报你关于请求的更多信息,样例代码是这样的

    public class Foo {
    
        private int id;
    
        private double value;
    
        public Foo(int id, double value) {
         this.id = id;
         this.value = value;
        }
    
        public int getId() {
         return id;
        }
    
        public double getValue() {
         return value;
        }
    
    }

    凭据下面工场模式建设 Foo 工具,留意,我留了一个大概发生错误的处所,要领内里挪用 value.doubleValue(),但没有查抄 null。

    public class FooFactory {
    
        public static Foo createFoo(int id, Double value) {
         return new Foo(id, value.doubleValue());
        }
    
    }

    这是简朴有用的场景。假设这是我应用的一个要害场景(不答允有任何失败),让我们实验加一些日志信息。

    public class FooFactory {
    
        private static Logger LOGGER = LoggerFactory.getLogger(FooFactory.class);
    
        public static Foo createFoo(int id, Double value) {
    
         LOGGER.debug("Creating a Foo");
    
         try {
             Foo foo = new Foo(id, value.doubleValue());
    
             LOGGER.debug("{}", foo);
    
             return foo;
    
         } catch (Exception e) {
             LOGGER.error(e.getMessage(), e);
         }
    
         return null;
        }
    
    }