zoukankan      html  css  js  c++  java
  • log4j学习(二) 不要用log4j了,用slf4j + logback吧

       标题比较尴尬,log4j学习系列的最后一篇是放弃log4j    - -!

       一、 简介

          log4j的作者提出了slf4j,简单日志门面,相当于是一套统一的java日志api,是个接口标准,编程时使用这个抽象层的接口标准,对接口编程,那么具体的日志实现部分就可以灵活的进行替换了——————例如,代码中使用slf4j编程,实现配置为log4j、也可以配置为logback 。

         logback也是log4j作者开发的日志库,用于替换log4j,总之比log4j更好更强大。

         于是,java日志的最佳实践就是: slf4j + logback 

    二、使用slf4j + logback 


          maven引入  

            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
                <version>1.7.5</version>
            </dependency>
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-classic</artifactId>
                <version>1.0.13</version>
            </dependency>

        src/main/resources/logback.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!--debug="true" : 打印logback内部状态(默认当logback运行出错时才会打印内部状态 ),配置该属性后打印条件如下(同时满足): 
        1、找到配置文件 2、配置文件是一个格式正确的xml文件 也可编程实现打印内部状态,例如: LoggerContext lc = (LoggerContext) 
        LoggerFactory.getILoggerFactory(); StatusPrinter.print(lc); -->
    <!-- scan="true" : 自动扫描该配置文件,若有修改则重新加载该配置文件 -->
    <!-- scanPeriod="30 seconds" : 配置自动扫面时间间隔(单位可以是:milliseconds, seconds, minutes 
        or hours,默认为:milliseconds), 默认为1分钟,scan="true"时该配置才会生效 -->
    <configuration debug="false" scan="true" scanPeriod="30 seconds" packagingData="true">
        <!-- 设置 logger context 名称,一旦设置不可改变,默认为default -->
        <contextName>remote-server</contextName>
        
        <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
            <!-- encoders are by default assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
            <encoder>
                <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
            </encoder>
        </appender>
        
        <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">  
            <!-- 当前活动日志文件名 -->
            <file>./rpc_demo_log.log</file>
            <!-- 文件滚动策略根据%d{patter}中的“patter”而定,此处为每天产生一个文件 -->
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!-- 归档文件名“.zip或.gz结尾”,表示归档文件自动压缩 -->
                <FileNamePattern>./rpc_demo_log%d{yyyyMMdd}.log.zip</FileNamePattern>
                <maxHistory>30</maxHistory>
            </rollingPolicy>
           
            <!--rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
                <fileNamePattern>renhai%i.log</fileNamePattern>
                <minIndex>1</minIndex>
                <maxIndex>10</maxIndex>
            </rollingPolicy>
            
            <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
                <maxFileSize>20MB</maxFileSize>
            </triggeringPolicy-->
            
            <!-- <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
              rollover daily
              <fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
               each file should be at most 30MB, keep 60 days worth of history, but at most 20GB
               <maxFileSize>30MB</maxFileSize>    
               <maxHistory>60</maxHistory>
               <totalSizeCap>20GB</totalSizeCap>
            </rollingPolicy> -->
            
            <encoder>
              <pattern>%d{HH:mm:ss.SSS}[%-5level][%thread]%logger{36} - %msg%n</pattern>
              <!-- <pattern>%d{HH:mm:ss.SSS}[%-5level][%thread] - %msg%n</pattern> -->
            </encoder>
        </appender>
        
        <!-- 日志级别若没显示定义,则继承最近的父logger(该logger需显示定义level,直到rootLogger)的日志级别-->
        <!-- logger的appender默认具有累加性(默认日志输出到当前logger的appender和所有祖先logger的appender中),可通过配置 “additivity”属性修改默认行为-->
        <!-- <logger name="com.yinz"  level="debug" additivity="false" >
            <appender-ref ref="FILE"/>
        </logger> -->
    
        <!-- 至多只能配置一个root -->
        <root level="info">
            <appender-ref ref="STDOUT" />
            <appender-ref ref="FILE" />
        </root>
    </configuration>

    代码中使用举例

    private Logger logger = LoggerFactory.getLogger(RpcServerApp.class);
  • 相关阅读:
    VMware workstation安装Windows Server 2012 R2步骤详解(附下载链接)
    英文系统下Oracle SQL Developer 汉化
    C# .NET Core Linux、Windows统一文件路径解决方法
    C# DataTable 转JSON、List 转DataTable、DataTable转List
    IIS无法启动计算机上"."的服务W3SVC(World Wide Web 发布服务)正在停止
    SQLServer 数据库变成单个用户后无法访问的解决方法
    C# webform中无法获取修改后的textbox值
    SqlServer try catch 捕获触发器存储过程异常,结合 transaction 事务
    DataTable.Select筛选过滤数据返回DataRow[]转为DataTable添加到DataSet
    easyui datagrid checkbox复选框取消单击选中事件、初始全选全不选等问题解决
  • 原文地址:https://www.cnblogs.com/lyhero11/p/10448302.html
Copyright © 2011-2022 走看看