今天是:
带着程序的旅程,每一行代码都是你前进的一步,每个错误都是你成长的机会,最终,你将抵达你的目的地。
title

Java log 历史与使用

1. java log发展史

 

2.java log关系

 

 

 

3. java log 使用到的jar

 

 

4. 项目中使用

1.jul 使用

 jul 打印控制台

    public static void  addLogToConsole(){
        // 获取Logger对象
        Logger logger = Logger.getLogger(LoggingExample.class.getName());

        // 设置全局日志级别
        logger.setLevel(Level.INFO);

        // 创建控制台处理程序
        ConsoleHandler consoleHandler = new ConsoleHandler();

        // 设置控制台处理程序的级别
        consoleHandler.setLevel(Level.INFO);

        // 配置日志格式
        consoleHandler.setFormatter(new java.util.logging.SimpleFormatter());

        // 将处理程序添加到Logger
        logger.addHandler(consoleHandler);

        // 记录日志消息
        logger.info("info to console");
    }

 jul 到文件

    public static void addLogToFile() throws IOException {
        Logger logger = Logger.getLogger(LoggingExample.class.getName());

        FileHandler  fileHandler = new FileHandler("F:\\logs\\jul\\jul.log");

        // 将处理程序添加到Logger
        logger.addHandler(fileHandler);
        logger.info("logging to file jul.log");

    }

jul 桥接到slf4j

需要的pom

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>2.0.7</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jul-to-slf4j</artifactId>
            <version>2.0.7</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-simple -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>2.0.2</version>
        </dependency>
    public static void addLogBridgeToSlf4j() throws IOException {
        Logger logger = Logger.getLogger(LoggingExample.class.getName());

        SLF4JBridgeHandler  fileHandler = new SLF4JBridgeHandler();

        // 将处理程序添加到Logger
        logger.addHandler(fileHandler);
        logger.info("logging bridge to slf4j");

    }

2.JCL

在获取Log对象的时候,会通过SPI方式对应的LogFactory,jcl-over-slf4j 中SLF4JLogFactory通过继承JCL中的LogFactory类来实现。

jcl打印到控制台

默认使用JUL 作为实现   
 private static Log logger = LogFactory.getLog(JCLExample.class);

 public static void  addLogToConsole(){
        // 记录日志消息
        logger.info("info to console");
    }

jcl交接到log4j2

//pom.xml 

       <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
            <version>1.7.36</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.19.0</version>
        </dependency>

//log4j2.properties

status = warn
name= LogConfigDemo

# Log files location
property.basePath = F:/logs/jcl/

# Console appender name and pattern
appender.console.type = Console
appender.console.name = consoleLogger
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = [%-5level] %d{yyyy-MM-dd'T'HH:mm:ss.SSS} %c{1} - %msg%n

# RollingFileAppender name, pattern, path and rollover policy
appender.rolling.type = RollingFile
appender.rolling.name = fileLogger
appender.rolling.fileName= ${basePath}/jcl-slf4j.log
appender.rolling.filePattern= ${basePath}/app_%d{yyyyMMdd}.log.gz
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} %level [%t] [%l] - %msg%n
appender.rolling.policies.type = Policies

# RollingFileAppender rotation policy
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy
appender.rolling.policies.size.size = 10MB
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
appender.rolling.policies.time.interval = 1
appender.rolling.policies.time.modulate = true
appender.rolling.strategy.type = DefaultRolloverStrategy
appender.rolling.strategy.delete.type = Delete
appender.rolling.strategy.delete.basePath = ${basePath}
appender.rolling.strategy.delete.maxDepth = 10
appender.rolling.strategy.delete.ifLastModified.type = IfLastModified

# Delete all files older than 30 days
appender.rolling.strategy.delete.ifLastModified.age = 30d

# Configure root logger
rootLogger.level = debug
rootLogger.appenderRef.stdout.ref = consoleLogger
rootLogger.appenderRef.rolling.ref = fileLogger



    public static void addLogBridgeToSlf4j() throws IOException {
        logger.debug("This is a DEBUG level log message.");
        logger.info("This is an INFO level log message.");
        logger.warn("This is a WARN level log message.");
        logger.error("This is an ERROR level log message.");
    }

3.log4j

log4j12

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.2</version> 
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.2</version>
        </dependency>


        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version> 
        </dependency>

log4j2

pom.xml

注意 log4j-slf4j-impl 依赖的slf4j api 版本是1.x版本,log4j-slf4j2-impl 依赖的slf4j是2.x版本

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>2.0.7</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.20.0</version>
        </dependency>



        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.20.0</version>
        </dependency>

log4j2.xml

<configuration status="warn" monitorInterval="30">

    <Properties>
        <!-- 日志显示模板,显示内容的格式如下 -->
        <!-- [21:55:33:047] [INFO] - org.apache.juli.logging.DirectJDKLog.log(DirectJDKLog.java:173) - Initializing Spring embedded WebApplicationContext -->
        <Property name="log_pattern" value="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
        <!-- 保存日志文件目录 -->
        <!--<Property name="file_path" value="${sys:user.home}"/>-->
        <Property name="file_path" value="logs/link"/>
        <!-- 日志文件的最大容量,超过该值就进行备份 -->
        <Property name="file_max_size" value="30MB"/>
        <!-- 备份的文件夹名称 如下为:2020-02 -->
        <Property name="backup_folder" value="$${date:yyyy-MM}"/>
        <!-- 备份文件的后缀,日志文件超过file_max_size会备份到filePattern指定的目录下 -->
        <Property name="backup_file_suffix" value="-%d{yyyy-MM-dd}-%i.log"/>
    </Properties>


    <!--定义appender-->
    <appenders>

        <!--控制台的输出配置-->
        <console name="Console" target="SYSTEM_OUT">
            <!-- 设置控制台只输出INFO及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
            <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
            <!--输出日志的格式-->
            <PatternLayout pattern="${log_pattern}"/>
        </console>

        <!-- 所有的日志信息会打印到此文件中,append=false每次启动程序会自动清空 -->
        <!-- <File name="all" fileName="${file_path}/all.log" append="true">
            <PatternLayout pattern="${log_pattern}"/>
        </File>-->

        <!--
        该RollingFile存储INFO级别的日志,
        默认存储到 fileName 文件中
        超过SizeBasedTriggeringPolicy的设定值,则存储到 filePattern 文件中
        -->
        <RollingFile name="RollingFileInfo" fileName="${file_path}/info.log"
                     filePattern="${file_path}/${backup_folder}/info${backup_file_suffix}">
            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
            <!-- 写入日志文件的模板 -->
            <PatternLayout pattern="${log_pattern}"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="${file_max_size}"/>
            </Policies>
            <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,超过该数量,会滚动删除前面的记录 -->
            <DefaultRolloverStrategy max="20"/>
        </RollingFile>

        <RollingFile name="RollingFileWarn" fileName="${file_path}/warn.log"
                     filePattern="${file_path}/${backup_folder}/warn${backup_file_suffix}">
            <ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="${log_pattern}"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="${file_max_size}"/>
            </Policies>
        </RollingFile>

        <RollingFile name="RollingFileError" fileName="${file_path}/error.log"
                     filePattern="${file_path}/${backup_folder}/error${backup_file_suffix}">
            <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="${log_pattern}"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="${file_max_size}"/>
            </Policies>
        </RollingFile>

    </appenders>

    <!-- 只有定义了logger并使用appender-ref,appender才会生效 -->
    <loggers>
        <!--过滤掉spring和hibernate的一些无用的debug信息-->
        <logger name="org.springframework" level="INFO"/>
        <logger name="org.mybatis" level="INFO">
            <!-- 添加如下设置,控制台会再打印一次 -->
            <AppenderRef ref="Console"/>
        </logger>
        <root level="INFO">
            <appender-ref ref="Console"/>
            <appender-ref ref="RollingFileInfo"/>
            <appender-ref ref="RollingFileWarn"/>
            <appender-ref ref="RollingFileError"/>
        </root>
    </loggers>

</configuration>

3. logback

pom

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>2.0.7</version> <!-- 请根据需要选择版本 -->
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.4.11</version> <!-- 请根据需要选择版本 -->
        </dependency>

        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>1.4.11</version>
        </dependency>

 

logback.xml

<configuration>

    <property name="DEV_HOME" value="f:/logs/logback" />

    <appender name="FILE-THREAD" class="ch.qos.logback.classic.sift.SiftingAppender">

        <discriminator>
            <key>logFileName</key>
            <defaultValue>head0</defaultValue>
        </discriminator>

        <sift>

            <appender name="FILE-${logFileName}"
                      class="ch.qos.logback.core.rolling.RollingFileAppender">
                <file>${DEV_HOME}/${logFileName}.log</file>
                <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                    <Pattern>
                        %d{yyyy-MM-dd HH:mm:ss} [%thread] %level %logger{35} - %msg%n
                    </Pattern>
                </encoder>

                <rollingPolicy
                        class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
                    <FileNamePattern>${DEV_HOME}/${logFileName}.%i.log.zip</FileNamePattern>
                    <MinIndex>1</MinIndex>
                    <MaxIndex>10</MaxIndex>
                </rollingPolicy>

                <triggeringPolicy
                        class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
                    <MaxFileSize>10MB</MaxFileSize>
                </triggeringPolicy>

            </appender>

        </sift>

    </appender>

    //生成单个日志文件
    <appender name="FILE-ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${HOME_LOG}</file>

        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>logs/archived/app.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
            <!-- each archived file, size max 10MB -->
            <maxFileSize>10MB</maxFileSize>
            <!-- total size of all archive files, if total size > 20GB, it will delete old archived file -->
            <totalSizeCap>20GB</totalSizeCap>
            <!-- 60 days to keep -->
            <maxHistory>60</maxHistory>
        </rollingPolicy>

        <encoder>
            <pattern>%d %p %c{1.} [%t] %m%n</pattern>
        </encoder>
    </appender>


    //异步记录日志
    <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
        <appender-ref ref="FILE-ROLLING" />
    </appender>

    <root level="debug">
        <appender-ref ref="ASYNC"/>
    </root>

    //控制台日志
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>
                %d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n
            </Pattern>
        </layout>
    </appender>

    <logger name="com.zlennon.log4j" level="debug"
            additivity="false">
        <appender-ref ref="FILE-THREAD" />
        <appender-ref ref="CONSOLE" />
    </logger>

    <root level="error">
        <appender-ref ref="FILE-THREAD" />
        <appender-ref ref="CONSOLE" />
    </root>

</configuration>

 

分享到:

专栏

类型标签

网站访问总量