java日志---最佳实践

一:日志的概念

对程序操作的记录

二:为什么需要日志?

必要性,没有它,我们会怎样?

1.无法准确定位问题
2.无法快速解决问题
3.无法进行用户行为分析

意义,有了它,我们可以用来做什么?

1.优秀的日志实践能极大帮助地程序员快速定位问题,减少在线错误报警
2.快速定位问题之后日志可以帮助我们有针对性地解决问题
3.数据分析:大数据的兴起,使得大量的日志分析成为可能,日志中蕴含了大量的用户数据,包括点击行为,兴趣偏好等,用户画像对于公司下一步的战略方向有一定指引作用。

三:我们需要什么样的日志?

何时记录?何处记录?

1.编程语言提示异常:如今各类主流的编程语言都包括异常机制,业务相关的流行框架有完整的异常模块------应该考虑单独打到异常处理里面,从而保证业务代码的整洁

2.业务流程预期不符:除开平台以及编程语言异常之外,项目代码中结果与期望不符时也是日志场景之一,常见的合适场景包括外部参数不正确,数据处理问题导致返回码不在合理范围内等。

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

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

日志的分类:级别、内容

1.级别

ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF

在这里插入图片描述

2.内容
(1)切换环境:spring-boot提供了一种很简单的日志配置标签< springProfile >,支持多环境的日志配置

<!-- 测试环境 -->
	<springProfile name="test">
		<!-- 每天产生一个文件 -->
		<appender name="TEST-FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
			<!-- 文件路径 -->
			<file>${TEST_FILE_PATH}</file>
			<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
				<!-- 文件名称 -->
				<fileNamePattern>${TEST_FILE_PATH}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
				<!-- 文件最大保存历史数量 -->
				<MaxHistory>100</MaxHistory>
			</rollingPolicy>
			
			<layout class="ch.qos.logback.classic.PatternLayout">
				<pattern>${PATTERN}</pattern>
			</layout>
		</appender>
		
		<root level="info">
			<appender-ref ref="TEST-FILE" />
		</root>
	</springProfile>

(2)按照类型输出:

<!--输出error文件-->
    <appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <encoder>
            <pattern>
                %d{yyyy/MM/dd-HH:mm:ss} %level [%thread] %caller{1} - %msg%n
            </pattern>
        </encoder>
        <!--滚动策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--路径-->
            <fileNamePattern>../logs/auth-error.%d.log</fileNamePattern>
        </rollingPolicy>
    </appender>

    <!--输出info文件-->
    <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!--过滤error日志-->
            <level>ERROR</level>
            <onMatch>DENY</onMatch>
            <onMismatch>ACCEPT</onMismatch>
        </filter>
        <encoder>
            <pattern>
                %d{yyyy/MM/dd-HH:mm:ss} %level [%thread] %caller{1} - %msg%n
            </pattern>
        </encoder>
        <!--滚动策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--路径-->
            <fileNamePattern>../logs/auth-info.%d.log</fileNamePattern>
        </rollingPolicy>
    </appender>

(3)日志输出格式

   <!--输出格式-->
        <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
            <layout class="ch.qos.logback.classic.PatternLayout">
                <pattern>
                    %d{yyyy/MM/dd-HH:mm:ss} %level [%thread] %caller{1} - %msg%n
                </pattern>
            </layout>
        </appender>

(4)定期清理

<!--只保留最近90天的日志-->
            <maxHistory>90</maxHistory>
            <!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
            <totalSizeCap>1GB</totalSizeCap>

四、如何更好地利用这些日志?

管理:分类、存储(按照类型分类打印日志:info、error……)
展示和查看:
分析和处理:预警、改进程序

五、如何平衡日志记录和程序的性能?

1.选择框架:springboot默认配置:lombok+slf4j+logback
2.配置优化:0配置
3.最佳实践,高性能
(1)根本原则:有必要才记录日志,频繁过量日志对性能是有损耗的,并且这种风险不常在系统正常时出现,系统出现问题时大量ERROR、INFO等问题相关日志有可能产生连锁反应,造成严重的后果。将关键信息保存到日志,同时考虑极端场景日志爆发。
(2)Logger获取:根据系统使用的日志框架组合,确定正确的实例获取方式。在log4j的早期版本,一般要求使用static,而在高版本以及后来的slf4j等一些框架封装中,该问题已经得到优化,获取(创建)logger实例的成本已经很低。但对于多例,尤其是需要频繁创建的class,推荐添加static前缀。
(3)输出等级校验:在log4j 1.x版本,对于可以预见的会频繁产生的日志输出,先判断一下(logger.isXXXEnabled(),对于性能有很大提升,在其它外观框架或者log4j 2.x中已经自动实现。
(4)输出格式:禁止使用字符串拼接,使用参数方式。

反例:
logger.debug("Processing trade with id: " + id + " symbol: " + symbol);
正例:
logger.debug("Processing trade with id: {} symbol : {} ", id, symbol);

(5)样式配置:布局配置输出的信息也会影响到性能,需要根据logger的具体使用场景来选择输出合适信息。

参考实现

从Spring-Boot开始深入理解Spring系列(三)——Spring-Boot集成主流java的log框架-logback和log4j2
https://www.cnblogs.com/xiexj/p/9417128.html
https://zhuanlan.zhihu.com/p/27363484

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值