JAVA业务开发常见错误整理(13.日志记录 14.文件IO)

朱晔《Java业务开发常见错误100例》课程学习整理

一、日志记录

日志记录重复

(1)logger配置继承关系导致日志重复记录

(2)错误配置LevelFilter造成日志重复记录

异步日志问题

(1)记录异步日志撑爆内存

(2)记录异步日志出现日志丢失

(3)记录异步日志出现阻塞

Logback提供的AsyncAppender实现异步日志记录,重要参数:

includeCallerData 控制是否收集调用方数据,默认false,

queueSize 控制阻塞队列大小,使用ArrayBlockingQueue阻塞队列,默认大小256,

discardingThreshold 控制丢弃日志阈值,防止队列满后阻塞。默认队列剩余量低于队列长度的20%,就会丢弃TRACE、DEBUG和INDO级别的日志

nerverBlock 控制队列满时,加入数据是否直接丢弃,不阻塞等待,默认false调用put会阻塞,neverBlock为true时,使用offer方法不阻塞

配置参数注意点

(1)queueSize设置过大,可能导致OOM

(2)queue设置比较小,且discardingThreshold设置为0的值(或者为默认值),队列剩余容量少于discardingThreshold就会丢弃<=INFO日志

(3)neverBlock默认为false,意味着总可能会出现阻塞。如果discardingThreshold为0,那么队列满时再有日志写入就会阻塞;如果discardingThreshold不为0,也只会丢弃<=INFO级别的日志,那么出现大量错误时,还是会阻塞程序

日志框架提供的参数化日志记录方式不能完全取代日志级别的判断。如果日志量很大,获取日志参数代价也很大,就要进行相应日志级别的判断,避免不记录日志也要花费时间获取日志参数问题

二、文件IO

文件读写需要确保字符编码一致

(1)如果需要读写字符流,那么需要确保文件中字符的字符集和字符流的字符集是一致的,否则会产生乱码

(2)使用Files类的一些流式处理操作,注意使用try-with-resources包装Stream,确保底层文件资源可以释放,避免产生too many open files

(3)进行文件字节流操作的时候,一般情况下不考虑进行逐字节操作,使用缓冲区进行批量读写减少IO次数,性能会提高很多。一般可以考虑直接使用缓冲输入输出流BufferedXXXStream,追求极限性能可以考虑FileChannel进行流转发

文件操作因为涉及操作系统和文件系统的实现,JDK并不能确保所有IO API在所有平台的逻辑一致性,代码迁移到新的操作系统或文件系统时,要重新进行功能测试和性能测试

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值