Java日志配置小记

演变历史

Log4j
  • 2001 年由 Ceki Gülcü 发布了 Log4j 并捐献给了 Apache 成为了 Apache 的顶级项目
  • 优点:定义了 Logger、Appender、Level 等思想概念
  • 缺点:性能低、2015年9月停止维护
  • 代码: org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(getClass());
JUL
  • SUN 公司在 JDK1.4 后增加了一个包为 java.util.logging 简称 JUL 来对抗 Log4j,但是对开发造成了麻烦,相互引用的项目之间可能使用了不同的日志框架,使代码变得一片混乱
  • 缺点:JUL 功能远不如 Log4j 完善,自带的 Handlers 有限,参数只接收 String,性能和可用性一般、在 JDK1.5 之后才略微有所提升
JCL
  • 基于以上问题、抽象出来的一套接口层形成 JCL、JCL 会在 ClassLoader 中进行查找,默认使用 Log4j、没有则使用 JUL
  • 缺点:效率低、易混乱、有可能会引发内存泄漏
  • 代码: org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(getClass())
  • 缺陷代码: log.debug("this is a debug info :" + msg); #只能用字符串拼接
Slf4j、Logback(SpringBoot默认的)
  • Log4j 的作者觉得 JCL 不好用、新写了一套接口 Slf4j 同时写了一套该接口的实现 logback
  • 优点:logback 提供更高级的特性、如异步 Logger、Filter 等
  • 代码: log.debug("this is a debug info :", msg); #解决了字符串拼接的问题
Log4j2
  • Apache 宣布不再维护 Log4j 并推荐升级到 Log4j2,虽然 Log4j2 沿袭了 Log4j 的思想,但是 Log4j2 和 Log4j 完全是两码事,并不兼容。
  • Log4j2 以性能著称,比 Log4j 和 Logback 有重⼤改进,继承了 Logback中 好的方面并修复了 Logback 架构中的一些固有问题。功能上,它有着和 Logback 相同的基本操作,同时又有自己独特的部分,⽐如:插件式结构、配置文件优化、异步⽇志等。

配置说明

日志级别

  • all:全部日志
  • trance:路径跟踪
  • debug:日常调试
  • info:打印重要信息
  • warn:警告
  • error:出现错误或问题
  • 级别优先级:ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF

日志组件

  • appender:日志输出目的地、负责日志的输出(输出到什么地方)
  • logger:日志记录器、负责收集处理日志记录(如何处理日志)
  • layout:日志格式化、负责对输出的日志格式化(以什么形式展现)

Logback

 <?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="3 seconds" debug="false">
<!-- lOGGER PATTERN 根据个⼈人喜好选择匹配 -->
<property name="logPattern" value="logback:[ %-5level] [%date{yyyy-MM-dd
HH:mm:ss.SSS}] %logger{96} [%line] [%thread]- %msg%n"></property> <!-- 动态⽇日志级别 -->
    <jmxConfigurator/>
<!-- 控制台的标准输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <charset>UTF-8</charset>
            <pattern>${logPattern}</pattern>
        </encoder>
    </appender>
<!-- 滚动⽂文件 -->
    <appender name="ROLLING_FILE"
 class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>
 
<onMismatch>DENY</onMismatch>
        </filter>
        <file>./logback.log</file>
        <rollingPolicy
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>./logback.log.%d{yyyy-MM-dd}.zip</fileNamePattern> <!-- 最⼤大保存时间 -->
<maxHistory>2</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${logPattern}</pattern>
        </encoder>
</appender>
<!-- DB -->
    <appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
        <connectionSource
class="ch.qos.logback.core.db.DriverManagerConnectionSource">
            <driverClass>com.mysql.jdbc.Driver</driverClass>
            <url>jdbc:mysql://172.17.0.203:3306/log?useSSL=false</url>
            <user>root</user>
            <password>root</password>
        </connectionSource>
    </appender>
    <!-- ASYNC_LOG  -->
<appender name="ASYNC_LOG" class="ch.qos.logback.classic.AsyncAppender"> 
<!-- 不不丢失⽇日志.默认的,如果队列列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的⽇日志 -->
<discardingThreshold>0</discardingThreshold> 
<!-- 更更改默认的队列列的深度,该值会影响性能.默认值为256 --> 
<queueSize>3</queueSize>
<appender-ref ref="STDOUT"/>
</appender>
<!-- ⽇日志的记录级别 -->
<!-- 在定义后引⽤用APPENDER --> 
<root level="DEBUG">
<!-- 控制台 -->
<appender-ref ref="STDOUT"/>
<!-- ROLLING_FILE --> 
<appender-ref ref="ROLLING_FILE"/> 
<!-- ASYNC_LOG -->
<appender-ref ref="ASYNC_LOG"/>
    </root>
</configuration>

处理器 Appender

FileAppender输出到本地文件
KafkaAppender输出到 Kafka 队列
FlumeAppender将几个不同源的日志汇集到一处

配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--status="WARN" :⽤用于设置log4j2⾃自身内部⽇日志的信息输出级别,默认是OFF--> 
<!--monitorInterval="30" :间隔秒数,⾃自动检测配置⽂文件的变更更和重新配置本身-->
<configuration status="info" monitorInterval="30">
    <Properties>
        <!--⾃自定义⼀一些常量量,之后使⽤用${变量量名}引⽤用-->
        <Property name="pattern">log4j2:[%-5p]:%d{YYYY-MM-dd HH:mm:ss} [%t] %c{1}:%L - %msg%n</Property>
    </Properties>
    <!--appenders:定义输出内容,输出格式,输出⽅方式,⽇日志保存策略略等,常⽤用其下三种标签 [console,File,RollingFile]-->
    <appenders>
        <!--console :控制台输出的配置-->
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="${pattern}"/>
        </Console>
        <!--File :同步输出⽇日志到本地⽂文件-->
        <!--append="false" :根据其下⽇日志策略略,每次清空⽂文件重新输⼊入⽇日志,可⽤用于测试-->
        <File name="File" fileName="./log4j2-file.log" append="false">
            <PatternLayout pattern="${pattern}"/>
        </File>
        <RollingFile name="RollingFile" fileName="./log4j2-rollingfile.log"
                     filePattern="./$${date:yyyy-MM}/log4j2-%d{yyyy-MM-dd}-%i.log">
            <!--ThresholdFilter :⽇日志输出过滤-->

            <!--level="info" :⽇日志级别,onMatch="ACCEPT" :级别在info之上则接 受,onMismatch="DENY" :级别在info之下则拒绝-->
            <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="${pattern}"/>
            <!-- Policies :⽇日志滚动策略略-->
            <Policies>
                <!-- TimeBasedTriggeringPolicy :时间滚动策略略, 默认0点产⽣生新的⽂文件,
                interval="6" : ⾃自定义⽂文件滚动时间间隔,每隔6⼩小时产⽣生新⽂文件, modulate="true" : 产⽣生⽂文件是否以0点偏移时间,即6点,12点,18点,0点-->
                <TimeBasedTriggeringPolicy interval="6"
                                           modulate="true"/> <!-- SizeBasedTriggeringPolicy :⽂文件⼤大⼩小滚动策略略-->
                <SizeBasedTriggeringPolicy size="1 MB"/>
            </Policies>
            <!-- DefaultRolloverStrategy属性如不不设置,则默认为最多同⼀一⽂文件夹下7个⽂文 件,这⾥里里设置了了20 -->
            <DefaultRolloverStrategy max="20"/>
        </RollingFile>
    </appenders>
    <!--然后定义logger,只有定义了了logger并引⼊入的appender,appender才会⽣生效-->
    <loggers>
        <!--过滤掉spring和mybatis的⼀一些⽆无⽤用的DEBUG信息-->
        <!--Logger节点⽤用来单独指定⽇日志的形式,name为包路路径,⽐比如要为org.springframework 包下所有⽇日志指定为INFO级别等。 -->
        <logger name="org.springframework" level="INFO"></logger>
        <logger name="org.mybatis" level="INFO"></logger>
        <!--AsyncLogger :异步⽇日志,LOG4J有三种⽇日志模式,全异步⽇日志,混合模式,同步⽇日志,性能 从⾼高到底,线程越多效率越⾼高,也可以避免⽇日志卡死线程情况发⽣生-->
        <!--additivity="false" : additivity设置事件是否在root logger输出,为了了避免重 复输出,可以在Logger 标签下设置additivity为”false”-->
        <AsyncLogger name="AsyncLogger" level="trace" includeLocation="true"
                     additivity="true">
            <appender-ref ref="Console"/>
        </AsyncLogger>
        <logger name="Kafka" additivity="false" level="debug">
            <appender-ref ref="Kafka"/>
            <appender-ref ref="Console"/>
        </logger>
        <!-- Root节点⽤用来指定项⽬目的根⽇日志,如果没有单独指定Logger,那么就会默认使⽤用该Root ⽇日志输出 -->
        <root level="info">
            <appender-ref ref="Console"/>
            <!--<appender-ref ref="File"/>-->
            <!--<appender-ref ref="RollingFile"/>-->
            <!--<appender-ref ref="Kafka"/>-->
        </root>
    </loggers>
</configuration>

写法规范

// 不规范写法:字符串拼接、toJson()这个函数总会被调⽤造成开销更大
logger.debug("this is debug: " + message);
logger.debug("this is json msg: {}", toJson(message));

// 推荐写法
logger.debug("this is debug:{}", message); // SLF4J/LOG4J2
logger.debug("this is json msg: {}", () -> toJson(message)); // LOG4J2
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值