日志套餐篇 - log4j2 logback全量套餐

日志套餐篇 - log4j2 logback全量套餐


前情提要:

Log4j Log4j2 logback是当下主流的日志框架

slf4j则是新一代的日志框架接口,logback直接实现了slf4j接口,另外logback是SpringBoot最新的默认日志框架

综合来看性能上依然推荐:log4j2(拥有logback全部特性)

**注:**鉴于log4j已经跟不上时代的要求,因此不做特别的介绍,其实log4j的配置,完全可以在log4j2上使用

普通工程 - 建议集成log4j2

普通工程即:普通的java项目, 如个人的代码Demo或者准备打成jar使用的,推荐使用log4j2

必要依赖如下:

<!-- log4j2 必要依赖 -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.10.0</version>
</dependency>

<!-- log4j2 必要依赖 -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.10.0</version>
</dependency>

<!-- slf4j核心包 -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.25</version>
</dependency>

<!--用于与slf4j保持桥接-->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j-impl</artifactId>
    <version>2.10.0</version>
</dependency>

配置如下:

Maven项目只需要在resource里面加入log4j2.xml配置文件即可

<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<Configuration status="WARN" monitorInterval="30">

    <!--全局属性-->
    <Properties>
        <Property name="APP_NAME">kerwinTools</Property>
        <Property name="LOG_FILE_PATH">/log/${APP_NAME}</Property>
        <Property name="PATTERN_FORMAT">%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%t] %class{36} (%L) %M - %msg%xEx%n</Property>
    </Properties>

    <Appenders>
        <!--输出到控制台-->
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="${PATTERN_FORMAT}"/>
        </Console>

        <!-- INFO_LOG -->
        <RollingFile name="INFO_LOG" fileName="${LOG_FILE_PATH}/info.log" filePattern="${LOG_HOME}/info.log_%d{yyyy-MM-dd}.log">
            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <Filters>
                <ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <PatternLayout>
                <pattern>${PATTERN_FORMAT}</pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
            </Policies>
            <DefaultRolloverStrategy>
                <Delete basePath="${LOG_FILE_PATH}" maxDepth="1">
                    <IfFileName glob="info.log_*" />
                    <IfLastModified age="5d" />
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>

        <!-- DEBUG_LOG -->
        <RollingFile name="DEBUG_LOG" fileName="${LOG_FILE_PATH}/debug.log" filePattern="${LOG_HOME}/debug.log_%d{yyyy-MM-dd}.log">
            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <Filters>
                <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <PatternLayout>
                <pattern>${PATTERN_FORMAT}</pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
            </Policies>
            <DefaultRolloverStrategy>
                <Delete basePath="${LOG_FILE_PATH}" maxDepth="1">
                    <IfFileName glob="debug.log_*" />
                    <IfLastModified age="5d" />
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>

        <!-- ERROR_LOG -->
        <RollingFile name="ERROR_LOG" fileName="${LOG_FILE_PATH}/error.log" filePattern="${LOG_HOME}/error.log_%d{yyyy-MM-dd}.log">
            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout>
                <pattern>${PATTERN_FORMAT}</pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
            </Policies>
            <DefaultRolloverStrategy>
                <Delete basePath="${LOG_FILE_PATH}" maxDepth="1">
                    <IfFileName glob="error.log_*" />
                    <IfLastModified age="5d" />
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>
    </Appenders>

    <Loggers>
        <!-- LOG everything at DEBUG level 默认级别为DEBUG -->
        <Root level="DEBUG">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="INFO_LOG"/>
            <AppenderRef ref="DEBUG_LOG"/>
            <AppenderRef ref="ERROR_LOG"/>
        </Root>
    </Loggers>
</Configuration>

**注:**日志打印的位置我并没用做特别的约束,所以它会在项目所存储的盘符自动建立${APP_NAME} 文件夹

效果如图所示:
在这里插入图片描述

SpringBoot项目 - 个人练习建议集成logback

// 由于springboot默认支持logbak  因此无需任何依赖即可使用,当然需要一些默认的必备依赖 如 web等...

application配置如下:

# 约束mybis-dao级别为dao层
logging.level.com.cat.dao=DEBUG
logging.config=classpath:logback-spring.xml
# 文件输出位置即文件夹名称
logging.file=/log/volcat-server

配置文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration  scan="true" scanPeriod="10 seconds">

    <contextName>logback</contextName>

    <!-- 命名为logback-spring 可以读取spring中的配置信息, 以下即为读取spring的日志输出地址 -->
    <springProperty scope="context" name="log.path" source="logging.file"/>

    <!-- 在当前文件中约束配置地址 -->
    <!--<property name="log.path" value="/log/demo_test_nginx" />-->

    <!--
       <logger>用来设置某一个包或者具体的某一个类的日志打印级别、
       以及指定<appender>。<logger>仅有一个name属性,
       一个可选的level和一个可选的addtivity属性。
       name:用来指定受此logger约束的某一个包或者具体的某一个类。
       level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
             还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。
             如果未设置此属性,那么当前logger将会继承上级的级别。
       addtivity:是否向上级logger传递打印信息。默认是true
   -->

    <!-- 彩色日志 -->
    <!-- 彩色日志依赖的渲染类 -->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />

    <!-- 彩色日志格式 -->
    <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39} %line){cyan} %clr(:) %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>

    <!--输出到控制台-->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <!--此日志appender是为开发使用,配置为DEBUG级别, 控制台输出的日志级别是大于或等于此级别的日志信息-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>debug</level>
        </filter>
        <encoder>
            <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
            <!-- 设置字符集 -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!--输出到文件-->
    <!-- 时间滚动输出 level为 DEBUG 日志 -->
    <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${log.path}/debug.log</file>
        <!--日志文件输出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- 设置字符集 -->
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志归档 -->
            <fileNamePattern>${log.path}/debug/debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <!-- 此日志文件只记录debug级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>debug</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 时间滚动输出 level为 INFO 日志 -->
    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${log.path}/info.log</file>
        <!--日志文件输出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 每天日志归档路径以及格式 -->
            <fileNamePattern>${log.path}/info/info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <!-- 此日志文件只记录info级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>info</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 时间滚动输出 level为 WARN 日志 -->
    <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${log.path}/warn.log</file>
        <!--日志文件输出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/warn/warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <!-- 此日志文件只记录warn级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>warn</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>


    <!-- 时间滚动输出 level为 ERROR 日志 -->
    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${log.path}/error.log</file>
        <!--日志文件输出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/error/error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <!-- 此日志文件只记录ERROR级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!--
        root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
        level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
        不能设置为INHERITED或者同义词NULL。默认是DEBUG
        可以包含零个或多个元素,标识这个appender将会添加到这个logger。
    -->
    <root level="info">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="DEBUG_FILE" />
        <appender-ref ref="INFO_FILE" />
        <appender-ref ref="WARN_FILE" />
        <appender-ref ref="ERROR_FILE" />
    </root>
</configuration>

SpringBoot项目 - 集成log4j2

必备依赖 - 既然是SpringBoot项目,那用官方的starter是最好的,版本什么的都不用管

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <!-- 去除logback日志依赖 -->
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<!-- 导入log4j2-starter -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

<!-- log4j2 异步打印必要依赖 -->
<dependency>
    <groupId>com.lmax</groupId>
    <artifactId>disruptor</artifactId>
    <version>3.3.4</version>
</dependency>

applications配置

# mybatis-dao相关的操作为DEBUG级别, 数据库日志会打印到debug文件中
logging.level.com.cat.dao=DEBUG
logging.config=classpath:log4j2.xml

配置文件 - 沿用上面的配置文件即可,必要情况可以修改打印的日志级别,如

.....
<Loggers>
    <!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
    <Logger name="org.springframework" level="INFO"/>
    <Logger name="org.mybatis" level="INFO"/>

    <!-- LOG everything at INFO level -->
    <Root level="INFO">
        <AppenderRef ref="Console"/>
        <AppenderRef ref="INFO_LOG"/>
        <AppenderRef ref="DEBUG_LOG"/>
        <AppenderRef ref="ERROR_LOG"/>
    </Root>
</Loggers>

SpringBoot - log4j2 企业级方案

<?xml version="1.0" encoding="UTF-8"?>  
<Configuration>
    <properties>  
        <property name="LOG_HOME">/log/volcat-server</property>
    </properties>   
    <Appenders>  
        <!-- 輸出到監視器 -->  
        <Console name="Console" target="SYSTEM_OUT">  
            <PatternLayout charset="UTF-8" pattern="%date{yyyy-MM-dd HH:mm:ss,SSS} [%thread][%level] - %msg%n" />  
        </Console>
        
        <RollingFile name="error.log" fileName="${LOG_HOME}/error.log" filePattern="${LOG_HOME}/error.log_%d{yyyy-MM-dd}.log">
            <PatternLayout charset="UTF-8" pattern="%date{yyyy-MM-dd HH:mm:ss,SSS} [%thread][%level] - %msg%n" />  
            <Policies>  
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />  
            </Policies>
         	<DefaultRolloverStrategy>  
        		<Delete basePath="${LOG_HOME}" maxDepth="1">  
                     <IfFileName glob="error.log_*" />  
                     <IfLastModified age="5d" />  
            	</Delete>  
            </DefaultRolloverStrategy>            
        </RollingFile>

        <RollingFile name="debug.log" fileName="${LOG_HOME}/debug.log" filePattern="${LOG_HOME}/debug.log_%d{yyyy-MM-dd}.log">
            <PatternLayout charset="UTF-8" pattern="%date{yyyy-MM-dd HH:mm:ss,SSS} [%thread][%level] - %msg%n" />  
            <Policies>  
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />  
            </Policies>
         	<DefaultRolloverStrategy>  
        		<Delete basePath="${LOG_HOME}" maxDepth="1">  
                     <IfFileName glob="debug.log_*" />  
                     <IfLastModified age="5d" />  
            	</Delete>  
            </DefaultRolloverStrategy>            
        </RollingFile>

        <RollingFile name="message.log" fileName="${LOG_HOME}/message.log" filePattern="${LOG_HOME}/message.log_%d{yyyy-MM-dd}.log">
            <PatternLayout charset="UTF-8" pattern="%date{yyyy-MM-dd HH:mm:ss,SSS} [%thread][%level] - %msg%n" />  
            <Policies>  
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />  
            </Policies>
         	<DefaultRolloverStrategy>  
        		<Delete basePath="${LOG_HOME}" maxDepth="1">  
                     <IfFileName glob="message.log_*" />  
                     <IfLastModified age="5d" />  
            	</Delete>  
            </DefaultRolloverStrategy>            
        </RollingFile>

        <RollingFile name="access.log" fileName="${LOG_HOME}/access.log" filePattern="${LOG_HOME}/access.log_%d{yyyy-MM-dd}.log">
            <PatternLayout charset="UTF-8" pattern="%date{yyyy-MM-dd HH:mm:ss,SSS} [%thread][%level] - %msg%n" />
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
            </Policies>
            <DefaultRolloverStrategy>
                <Delete basePath="${LOG_HOME}" maxDepth="1">
                    <IfFileName glob="access.log_*" />
                    <IfLastModified age="5d" />
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>
    </Appenders>  
    <Loggers>  
        <Logger name="sys.error" level="ERROR">  
            <AppenderRef ref="error.log" />  
        </Logger>
        <Logger name="sys.debug" level="DEBUG">  
            <AppenderRef ref="debug.log" />  
        </Logger>
        <Logger name="sys.message" level="INFO">  
            <AppenderRef ref="message.log" />  
        </Logger>
        <Logger name="sys.access" level="INFO">
            <AppenderRef ref="access.log" />
        </Logger>
    </Loggers>  
</Configuration> 

Logit工具类

package com.mine.log;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Logit {

    private static final Logger DEBUG_LOG = LoggerFactory.getLogger("sys.debug");
    private static final Logger WARN_LOG = LoggerFactory.getLogger("sys.warn");
    private static final Logger MESSAGE_LOG = LoggerFactory.getLogger("sys.message");
    private static final Logger ACCESS_LOG = LoggerFactory.getLogger("sys.access");
    private static final Logger ERROR_LOG = LoggerFactory.getLogger("sys.error");
    private static final Logger DB_LOG = LoggerFactory.getLogger("db.sql");

    public Logit() {}

    public static void accessLog(String log) {
        ACCESS_LOG.info(log);
    }

    public static void messageLog(String log) {
        StackTraceElement[] stacks = (new Throwable()).getStackTrace();
        StringBuffer sb = new StringBuffer(stacks[1].getClassName());
        sb.append(".");
        sb.append(stacks[1].getMethodName());
        sb.append("---");
        sb.append(log);
        MESSAGE_LOG.info(sb.toString());
    }

    public static void messageLog(String log, String loglevel) {
        StackTraceElement[] stacks = (new Throwable()).getStackTrace();
        StringBuffer sb = new StringBuffer(stacks[1].getClassName());
        sb.append(".");
        sb.append(stacks[1].getMethodName());
        sb.append("---");
        sb.append(log);
        if ("debug".equalsIgnoreCase(loglevel)) {
            MESSAGE_LOG.debug(log);
        } else if ("info".equalsIgnoreCase(loglevel)) {
            MESSAGE_LOG.info(log);
        } else if ("warn".equalsIgnoreCase(loglevel)) {
            MESSAGE_LOG.warn(log);
        } else if ("error".equalsIgnoreCase(loglevel)) {
            MESSAGE_LOG.error(log);
        } else {
            MESSAGE_LOG.info(log);
        }

    }

    public static void debugLog(String log) {
        StackTraceElement[] stacks = (new Throwable()).getStackTrace();
        StringBuffer sb = new StringBuffer(stacks[1].getClassName());
        sb.append(".");
        sb.append(stacks[1].getMethodName());
        sb.append("---");
        sb.append(log);
        debugPlog(sb.toString(), "debug");
    }

    public static void debugLog(String log, String loglevel) {
        StackTraceElement[] stacks = (new Throwable()).getStackTrace();
        StringBuffer sb = new StringBuffer(stacks[1].getClassName());
        sb.append(".");
        sb.append(stacks[1].getMethodName());
        sb.append("---");
        sb.append(log);
        debugPlog(sb.toString(), loglevel);
    }

    private static void debugPlog(String log, String loglevel) {
        if ("debug".equalsIgnoreCase(loglevel)) {
            DEBUG_LOG.debug(log);
        } else if ("info".equalsIgnoreCase(loglevel)) {
            DEBUG_LOG.info(log);
        } else if ("warn".equalsIgnoreCase(loglevel)) {
            DEBUG_LOG.warn(log);
        } else if ("error".equalsIgnoreCase(loglevel)) {
            DEBUG_LOG.error(log);
        } else {
            DEBUG_LOG.debug(log);
        }
    }

    public static void warnLog(String log) {
        StackTraceElement[] stacks = (new Throwable()).getStackTrace();
        StringBuffer sb = new StringBuffer(stacks[1].getClassName());
        sb.append(".");
        sb.append(stacks[1].getMethodName());
        sb.append("---");
        sb.append(log);
        WARN_LOG.error(sb.toString());
    }

    public static void errorLog(String log) {
        StackTraceElement[] stacks = (new Throwable()).getStackTrace();
        StringBuffer sb = new StringBuffer(stacks[1].getClassName());
        sb.append(".");
        sb.append(stacks[1].getMethodName());
        sb.append("---");
        sb.append(log);
        errorPLog(sb.toString(), (Throwable)null);
    }

    public static void errorLog(String log, Throwable throwable) {
        StackTraceElement[] stacks = (new Throwable()).getStackTrace();
        StringBuffer sb = new StringBuffer(stacks[1].getClassName());
        sb.append(".");
        sb.append(stacks[1].getMethodName());
        sb.append("---");
        sb.append(log);
        errorPLog(sb.toString(), throwable);
    }

    public static void dbLog(String log, Object... objects) {
        StackTraceElement[] stacks = (new Throwable()).getStackTrace();
        StringBuffer sb = new StringBuffer(stacks[1].getClassName());
        sb.append(".");
        sb.append(stacks[1].getMethodName());
        sb.append("---");
        sb.append(log);
        if (objects != null && objects.length > 0) {
            sb.append("; parameter[");
            Object[] var4 = objects;
            int var5 = objects.length;

            for(int var6 = 0; var6 < var5; ++var6) {
                Object obj = var4[var6];
                sb.append(obj);
                sb.append(",");
            }

            sb.delete(sb.length() - 1, sb.length());
            sb.append("]");
        }

        DB_LOG.debug(sb.toString());
    }

    private static void errorPLog(String log, Throwable throwable) {
        if (throwable == null) {
            ERROR_LOG.error(log);
        } else {
            ERROR_LOG.error(log, throwable);
        }
    }

    public static void log(String name, String log) {
        StackTraceElement[] stacks = (new Throwable()).getStackTrace();
        StringBuffer sb = new StringBuffer(stacks[1].getClassName());
        sb.append(".");
        sb.append(stacks[1].getMethodName());
        sb.append("---");
        sb.append(log);
        logByName(name, sb.toString(), "debug", (Throwable)null);
    }

    public static void log(String name, String log, String loglevel) {
        StackTraceElement[] stacks = (new Throwable()).getStackTrace();
        StringBuffer sb = new StringBuffer(stacks[1].getClassName());
        sb.append(".");
        sb.append(stacks[1].getMethodName());
        sb.append("---");
        sb.append(log);
        logByName(name, sb.toString(), loglevel, (Throwable)null);
    }

    public static void log(String name, String log, String loglevel, Throwable throwable) {
        StackTraceElement[] stacks = (new Throwable()).getStackTrace();
        StringBuffer sb = new StringBuffer(stacks[1].getClassName());
        sb.append(".");
        sb.append(stacks[1].getMethodName());
        sb.append("---");
        sb.append(log);
        logByName(name, sb.toString(), loglevel, throwable);
    }

    private static void logByName(String name, String log, String loglevel, Throwable throwable) {
        if (name != null) {
            StackTraceElement[] stacks = (new Throwable()).getStackTrace();
            StringBuffer sb = new StringBuffer(stacks[1].getClassName());
            sb.append(".");
            sb.append(stacks[1].getMethodName());
            sb.append("---");
            sb.append(log);
            Logger logger = LoggerFactory.getLogger(name);
            try {
                if (throwable == null) {
                    if ("debug".equalsIgnoreCase(loglevel)) {
                        logger.debug(log);
                    } else if ("info".equalsIgnoreCase(loglevel)) {
                        logger.info(log);
                    } else if ("warn".equalsIgnoreCase(loglevel)) {
                        logger.warn(log);
                    } else if ("error".equalsIgnoreCase(loglevel)) {
                        logger.error(log);
                    } else {
                        logger.debug(log);
                    }
                } else if ("debug".equalsIgnoreCase(loglevel)) {
                    logger.debug(log, throwable);
                } else if ("info".equalsIgnoreCase(loglevel)) {
                    logger.info(log, throwable);
                } else if ("warn".equalsIgnoreCase(loglevel)) {
                    logger.warn(log, throwable);
                } else if ("error".equalsIgnoreCase(loglevel)) {
                    logger.error(log, throwable);
                } else {
                    logger.debug(log, throwable);
                }
            } catch (Exception var8) {
                ;
            }
        }
    }
}

使用说明 :

// 由于该方案配置的Logger 为 sys.error...等开头,因此  直接使用loger的方式会在控制台输出,但不会被记录到日志文件之中,有且仅有通过Logit打印的日志才会被记录到文件中,此方案减少了每个类都创建loger的尴尬,非常方便
Logit.errorLog("在线用户插入失败" + " parms: " + userOnline, new Throwable(e));

GITHUB链接:https://github.com/kkzhilu/volcat-server (不同分支即对应不同日志框架)

项目暂时为私有, 如果需要参考请联系我

posted @ 2019-08-14 00:06  Super-Kerwin  阅读(345)  评论(0编辑  收藏  举报