美文网首页
java日志该如何输出

java日志该如何输出

作者: 时间道 | 来源:发表于2019-08-16 11:43 被阅读0次

    日志要求:

    • 重要日志一定要打印到日志文件
    • 日志文件应该每天滚动一次,日志多的可以每个小时滚动一次
    • 日期必须精确到毫秒,而不是秒
    • 确保日志是按事件顺序输出
    • 【推荐】最好能打印调用方信息,比如访问者ip等信息
    • 日志文件要可以方便使用grep语句查看
    • 日志文件归档:需要告知运维归档
    • 日志预警,通过ES实现
    • 对于无法预知的异常,一定要打印堆栈:LOGGER.error("context:{},exception:{}", JSON.toJSONString(context), e);
    • 打印错误信息时,要打印访问的上下文
    • 对于调用接口返回错误的日志(暂定):
      如果为1代表系统异常,打印error级别来预警,否则打印warn级别或者info级别

    工具:

    项目尽可能的使用log4j2 或者 logback,并且使用slf4j接口打印日志:

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    private static final Logger logger = LoggerFactory.getLogger(Abc.class);
    

    日志要分级别打印:

    • trace:跟踪日志,与debug差别不大
    • debug:调试问题使用,一定要打印出输入、输出数据
    • info:打印程序运行信息,启动信息等
    • warn:打印一些警告信息,比如参数校验错误等等
    • error:打印程序错误信息,必须要打印上下文信息,方便查找问题
    • fatal:重大灾难信息,比如数据库无法连接等需要立即处理的问题
    • bussiness: 打印重要业务的日志,比如抢购成功、订单创建成功的相关信息、删除用户等

    日志文件分开打印,便于查看和抓取日志:

    • *.debug.log
    • *.info.log
    • *.warn.log
    • *.error.log
    • *.biz.log

    ELK日志收集预警:

    为了ELK收集方便,日志可以打印成json格式:
    info.json
    warn.json
    error.json

    error级别日志3分钟预警,发送邮件
    warn级别日志10分钟预警,发送邮件

    logback可以使用logstash-logback-encoder来打印json格式日志:

    <dependency>
        <groupId>net.logstash.logback</groupId>
        <artifactId>logstash-logback-encoder</artifactId>
        <version>4.5.1</version>
    </dependency>
    

    ** logback.xml配置:**

    <appender name="LOGSTASH" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/log.json</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/log.json.%d{yyyy-MM-dd}</fileNamePattern>
            <maxHistory>7</maxHistory>
        </rollingPolicy>
        <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
            <jsonFactoryDecorator class="com.sq.proxy.config.MyJsonFactoryDecorator" />
            <providers>
                <timestamp>
                    <pattern>yyyy-MM-dd'T'HH:mm:ss.SSSZZ</pattern>
                </timestamp>
                <pattern>
                    <pattern>{"level":"%level","service":"${springAppName:-}","host":"%ip","pid":"${PID:-}","thread":"%thread","class":"%logger{40}:%L","message": "%message"},</pattern>
                </pattern>
            </providers>
        </encoder>
    </appender>
    打印堆栈:
    

    java 代码:

    logger.error("getBalanceHint() 异常:{}", ExceptionUtils.getFullStackTrace(e));
    

    相关文章

      网友评论

          本文标题:java日志该如何输出

          本文链接:https://www.haomeiwen.com/subject/zqefsctx.html